通过FFMPEG在android中合并/连接视频

时间:2017-10-13 06:59:27

标签: android ffmpeg android-ffmpeg

我正在通过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"
};

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

1 个答案:

答案 0 :(得分:1)

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

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

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

    ffmpeg -y -i input-1.mp4 -i input-2.mp4 -filter_complex   &#34; [0:V] setsar = 1:1 [V 0]; [1:V]比例= W:H,setsar = 1:1 [V1]; [V0] [0:一个] [V1] [ 1:A]   的concat = N = 2:V = 1:A = 1&#34; out.mp4

    [0:v] setsar = 1:1 [v0],将第一视频流的样本宽高比设置为1:1,它也可以不同,但​​与其他输入视频中使用的相似流如[1:v]中的流量= W:H,setar = 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