我正在使用com.netcompss.loader.LoadJNI(FFmpeg4Android)并且它工作正常,直到我尝试将1个视频与音轨和其他没有音轨的视频连接起来。
我正在使用此命令行:
ffmpeg -y -i /storage/emulated/0/app/1.mp4 -i /storage/emulated/0/DCIM/2.mp4 -strict experimental -filter_complex [0:v]scale=640x360,setsar=1:1[v0];[1:v]scale=1280x720,setsar=1:1[v1];[v0][0:a][v1][1:a] concat=n=2:v=1:a=1 -ab 48000 -ac 2 -ar 22050 -s 640x360 -r 30 -vcodec libx264 -acodec aac -crf 18 /storage/emulated/0/app/out.mp4
1.mp4的分辨率为640x360并具有音轨。
2.mp4的分辨率为1280x720,并且没有音轨。
在vk.log上显示了这个:
Setting 'n' to value '2'
Setting 'v' to value '1'
Setting 'a' to value '1'
Stream specifier ':a' in filtergraph description [0:v]scale=1280x720,setsar=1:1[v0];[1:v]scale=1280x720,setsar=1:1[v1];[v0][0:a][v1][1:a] concat=n=2:v=1:a=1 matches no streams.
exit_program: 1
Cannot find a matching stream for unlabeled input pad 3 on filter Parsed_concat_4
我对ffmpeg并不擅长,所以我对命令行做了一些更改但没有成功。
当连接的所有视频都有音轨时,没有问题。但是当其中一个视频没有音轨时,就会失败。
在这种情况下,正确的命令行是什么?
答案 0 :(得分:2)
concat过滤器要求所有段具有相同数量的(匹配)流,在这种情况下,由于您只有两个文件,其中第一个具有音频,因此您可以跳过音频concat。
ffmpeg -y -i /storage/emulated/0/app/1.mp4 -i /storage/emulated/0/DCIM/2.mp4 \
-strict experimental -filter_complex \
[0:v]scale=640x360,setsar=1[v0];[1:v]scale=640x360,setsar=1[v1]; \
[v0][v1]concat=n=2[v] -map "[v]" -r 30 -vcodec libx264 -crf 18 \
-map 0:a -acodec aac -ab 48000 -ac 2 -ar 22050 /storage/emulated/0/app/out.mp4
由于您要将最终视频缩放到640x360
,因此将第二个视频缩放到1280x720
是没有意义的。只需将其直接缩放到最终尺寸即可。一旦你这样做,就不需要使用-s
选项插入另一个缩放器。
答案 1 :(得分:0)
Mulvya的回答很好,并回答了我的要求。但它只保留第一个视频中的第一个音频。在我的情况下,用户可能想要连接,例如,4个视频,并且其中只有一个没有音轨。用户希望将其他视频保持音频。
我的解决方案是在concat之前检查每个视频。如果视频没有音轨,我会添加一个静音音轨。然后,当运行我的concat命令行时,它不会遇到任何问题。