通过 FFMPEG android 中的 Merging/concat 个视频
Merging/concat videos in android through FFMPEG
我正在通过 FFMPEG 开发视频合并应用程序。如果我 select 两个相同的视频,我的代码就可以工作。但是如果我 select 两个具有不同比特率和分辨率的不同视频,那么视频合并将不起作用。
我正在使用这个命令。
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"
};
如果我连接两个具有不同比特率和分辨率的视频,请告诉我我使用了哪个命令。
您必须将要连接的两个视频设置为相同的分辨率。这可以首先通过使用 ffprobe 确定视频的 WxH 并将一个视频缩放到另一个视频的分辨率来独立完成。
这也可以通过以下方式完成:
- 使用 ffprobe 确定第一个视频的 WxH。
- 使用以下内容连接视频:
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]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
我正在通过 FFMPEG 开发视频合并应用程序。如果我 select 两个相同的视频,我的代码就可以工作。但是如果我 select 两个具有不同比特率和分辨率的不同视频,那么视频合并将不起作用。 我正在使用这个命令。
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"
};
如果我连接两个具有不同比特率和分辨率的视频,请告诉我我使用了哪个命令。
您必须将要连接的两个视频设置为相同的分辨率。这可以首先通过使用 ffprobe 确定视频的 WxH 并将一个视频缩放到另一个视频的分辨率来独立完成。
这也可以通过以下方式完成:
- 使用 ffprobe 确定第一个视频的 WxH。
- 使用以下内容连接视频:
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]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