【发布时间】:2016-10-19 02:26:12
【问题描述】:
我正在尝试使用 FFmpeg 在我的 Android 应用中编辑一些视频,但是当我尝试只拍摄视频的一部分时遇到了一些问题。
我正在使用这个 ffmpeg 编译/lib https://github.com/WritingMinds/ffmpeg-android-java
我尝试使用此命令修剪/剪切视频
"-y -i input.mp4 -ss 00:00:01.00 -t 00:00:15.000 -c copy output.mp4"
但是对于某些视频,我会出现黑屏或视频只是冻结。在我的所有测试中,声音都很好。
用这个命令
"-y -i input.mp4 -ss 00:00:01.000 -t 00:00:15.000 -async 1 output.mp4"
在我的所有测试(视频/声音)中一切正常,但生成输出文件需要太多时间,生成这个 15 秒的文件需要超过 2 分钟。
我尝试了这些命令的其他变体,但我总是遇到视频流问题(黑屏或冻结)或生成输出的时间太长(用户只能选择 15 秒的视频发送到我的服务器)
感谢您的帮助!
编辑:
这是修剪视频的代码部分
String[] cmd = new String[]{"-y","-i",input,"-ss","00:00:05.000","-vcodec","copy",
"-acodec","copy","-t","00:00:15.00","-strict","-2",output };
final FFmpeg ffmpeg = FFmpeg.getInstance(this);
try {
ffmpeg.execute(cmd, new FFmpegExecuteResponseHandler() {
@Override
public void onSuccess(String message) {
Log.i("VideoEditActivity", "Success " + message);
is_video_generated_ = true;
}
@Override
public void onProgress(String message) {
Log.i("VideoEditActivity", "Progress updated " + message);
}
@Override
public void onFailure(String message) {
Log.e("VideoEditActivity", "ERROR! " + message);
}
@Override
public void onStart() {
progress_dialog_.setMessage(getString(R.string.str_video_generating));
progress_dialog_.show();
}
@Override
public void onFinish() {
Log.i("VideoEditActivity", "Finished");
progress_dialog_.hide();
Intent intent = new Intent(getApplicationContext(), VideoPlayActivity.class);
intent.putExtra("media", edited_video_path_);
startActivity(intent);
}
});
} catch (FFmpegCommandAlreadyRunningException e) {
e.printStackTrace();
}
这是原始文件:[https://drive.google.com/file/d/0BzqJL_nNetbRYmxvcTljanJwR00/view?usp=sharing][1]
输出如下:0BzqJL_nNetbReENjRGMtVXQ5VHM/view?usp=sharing(堆栈溢出不允许我添加超过 2 个链接)
【问题讨论】:
-
流复制时,视频只能在关键帧处进行剪裁。因此,如果您的
-ss是12并且关键帧位于10则输出视频将被冻结/黑色,直到出现下一个关键帧。 -
好的,更改 -ss 的顺序将修复视频帧开始 (trac.ffmpeg.org/wiki/Seeking),但是有没有一种简单的方法可以在关键帧处修剪视频的结尾(即使视频会比我需要的大一点)?我阅读了一些关于此的内容,有些人正在使用 ffprobe 获取关键帧时间戳,但我今天的 Android 版本中没有它。