【问题标题】:Merging/concat videos in android through FFMPEG通过 FFMPEG 在 android 中合并/连接视频
【发布时间】:2018-03-25 06:03:33
【问题描述】:

我正在通过 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()]);

我也用过这个命令。

String[] complexCommand = {
    "-y", "-i", 
    pathArraylist.get(0),
    "-i", pathArraylist.get(1), 
    "-strict", 
    "experimental", 
    "-filter_complex",
    "[0:v]scale=hd720,setsar=1:1[v0];[1:v]scale=hd720,setsar=1:1[v1];[v0][0:a][v1][1:a] concat=n=2:v=1:a=1",
    "-ab", 
    "48000", 
    "-ac", 
    "2", 
    "-ar", 
    "22050", 
    "-s", 
    "hd720", 
    "-vcodec", 
    "mpeg4", 
    "-b:v", 
    "600" +"k", 
    "storage/emulated/0/outputvideo.mp4"
};

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

【问题讨论】:

标签: android ffmpeg android-ffmpeg


【解决方案1】:

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

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

  1. 使用 ffprobe 确定第一个视频的 WxH。
  2. 使用以下方法连接视频:

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" out.mp4

[0:v]setsar=1:1[v0],设置第一个视频流的样本纵横比为 1:1,它也可以不同,但​​类似于在其他输入的视频流中使用的纵横比,如 [ 1:v]比例=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] 未定义常量或缺少 '(' in 'W'[Parsed_scale_1 @ 0xb77054b0] [Eval @ 0xbeb5ea70]未定义常量或缺少 '(' in'H' 评估表达式 'H' 时出错。“配置复杂过滤器时出错。参数无效”
  • 表示你的ffmpeg没有用libfdk_aac编码器库编译。如果您不确定系统上有哪些音频库,您可以删除音频编码器选项并让 ffmpeg 自行决定。您可以使用 AAC(libfdk_aac)、MP3(可能是 lame mp3,我不确定),但为此您必须使用所需的库重新编译 ffmpeg。
猜你喜欢
  • 2020-07-28
  • 1970-01-01
  • 2017-04-02
  • 2012-03-09
  • 2017-08-09
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
相关资源
最近更新 更多