Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过FFMPEG在android中合并/concat视频_Android_Ffmpeg_Android Ffmpeg - Fatal编程技术网

通过FFMPEG在android中合并/concat视频

通过FFMPEG在android中合并/concat视频,android,ffmpeg,android-ffmpeg,Android,Ffmpeg,Android Ffmpeg,我正在通过FFMPEG开发视频合并应用程序。如果我选择了两个相同的视频,我的代码将正常工作。但是,如果我选择两个不同的视频,具有不同的比特率和分辨率,则视频合并不起作用。 我正在使用这个命令 List<String> cmdList = new ArrayList<>(); cmdList.add("-y"); StringBuilder sb = new StringBuilder(); for (int i = 0; i < videoList.size();

我正在通过FFMPEG开发视频合并应用程序。如果我选择了两个相同的视频,我的代码将正常工作。但是,如果我选择两个不同的视频,具有不同的比特率和分辨率,则视频合并不起作用。 我正在使用这个命令

List<String> cmdList = new ArrayList<>();
cmdList.add("-y");
StringBuilder sb = new StringBuilder();

for (int i = 0; i < videoList.size(); i++) {
    cmdList.add("-i");
    cmdList.add(videoList.get(i).getThumbnailPath());
    sb.append("[").append(i).append(":0] [").append(i).append(":1]");
}

sb.append(" concat=n=").append(videoList.size()).append(":v=1:a=1 [v] [a]");
cmdList.add("-filter_complex");
cmdList.add(sb.toString());
cmdList.add("-map");
cmdList.add("[v]");
cmdList.add("-map");
cmdList.add("[a]");
cmdList.add("-preset");
cmdList.add("ultrafast");
cmdList.add("storage/emulated/0/abcfs.mp4");

sb = new StringBuilder();
for (String str : cmdList) {
    sb.append(str).append(" ");
}

String[] cmd = cmdList.toArray(new String[cmdList.size()]);

如果我连接两个具有不同比特率和分辨率的视频,请告诉我使用了哪个命令。

您必须将两个视频连接到相同的分辨率。这可以通过使用ffprobe确定视频的WxH并将一个视频缩放到另一个视频的分辨率来独立完成

这也可以通过以下方式完成:

  • 使用ffprobe确定第一个视频的WxH
  • 使用以下命令连接视频:
  • ffmpeg-y-i input-1.mp4-i input-2.mp4-filter_complex “[0:v]设定值=1:1[v0];[1:v]标度=W:H,设定值=1:1[v1];[v0][0:a][v1][1:a] concat=n=2:v=1:a=1“out.mp4

    [0:v]setsar=1:1[v0],将第一个视频流的采样宽高比设置为1:1,它也可以不同,但与[1:v]scale=W:H,setsar=1:1[v1]中其他输入视频流中使用的宽高比类似。这会将[1:v]流缩放到[0:v]视频的分辨率。您还可以修改此命令以考虑第二个视频的纵横比,并包括超出此问题范围的黑色条纹填充

    为了保证比特率,您可以显式地指定编码器参数来创建连接的视频,它应该保证所有的事情,因为这两个视频的视频流都将被重新编码。您可以使用以下内容:

    ffmpeg -y -i input-1.mp4 -i input-2.mp4 -filter_complex "[0:v]setsar=1:1[v0];
    [1:v]scale=W:H,setsar=1:1[v1];[v0][0:a][v1][1:a] concat=n=2:v=1:a=1" -
    c:v libx264 -b:v 600K -c:a libfdk_aac -b:a 128K out.mp4
    

    您编写的第二个视频将适用于具有不同分辨率和比特率的视频?是的,只要filter_complex具有正确的参数,即所有输入视频流具有相同的采样宽高比、相同的分辨率(在少数输入视频中可能需要缩放),并且如果您为输出指定编码器参数,例如,视频编解码器、目标比特率等。当我运行命令Unknown encoder libfdk_aac时显示此错误当我将编码更改为aac时,此错误显示为[Parsed_scale_1@0xb77054b0][Eval@0xbeb5ea70]未定义常量或缺失'('W'[Parsed_scale_1@0xb77054b0][Eval@0xbeb5ea70]未定义常量或缺失'(“在计算表达式“H”时出现“in'H”错误。”“配置复杂筛选器时出错。参数无效”表示您的ffmpeg未使用libfdk_aac编码器库进行编译。如果您不确定系统上有哪些音频库,您可以删除音频编码器选项并让ffmpeg自行决定。您可以使用aac(libfdk_aac)、MP3(可能是蹩脚的mp3,我不太确定)但为此,您必须使用所需的库重新编译ffmpeg。检查此解决方案,它非常有效。
    ffmpeg -y -i input-1.mp4 -i input-2.mp4 -filter_complex "[0:v]setsar=1:1[v0];
    [1:v]scale=W:H,setsar=1:1[v1];[v0][0:a][v1][1:a] concat=n=2:v=1:a=1" -
    c:v libx264 -b:v 600K -c:a libfdk_aac -b:a 128K out.mp4