我正在尝试将两个视频文件合并在一起 - 由于这些视频是由用户选择的,因此我通过 PHP exec() 传输命令。我可以让它工作,因为它确实输出了正确组合大小的视频,但似乎它们实际上设置在不同的轨道上,它只播放第一个输入视频。
命令是
ffmpeg -i temp/production/videos/title.66.avi -i temp/production/videos/66.1391426205.avi \
-filter_complex '[0:0] [1:0] concat=n=2:v=1[v]' -map '[v]' \
temp/production/videos/final.66.1391426205.mp4 2>&1
输出为
ffmpeg version 2.1.3 Copyright (c) 2000-2014 the FFmpeg developers
built on Jan 30 2014 14:39:10 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-x11grab --enable-libvpx --enable-libmp3lame
libavutil 52. 48.101 / 52. 48.101
libavcodec 55. 39.101 / 55. 39.101
libavformat 55. 19.104 / 55. 19.104
libavdevice 55. 5.100 / 55. 5.100
libavfilter 3. 90.100 / 3. 90.100
libswscale 2. 5.101 / 2. 5.101
libswresample 0. 17.104 / 0. 17.104
libpostproc 52. 3.100 / 52. 3.100
Input #0, avi, from 'temp/production/videos/title.66.avi':
Metadata:
encoder : Lavf55.19.104
Duration: 00:00:05.00, start: 0.000000, bitrate: 36 kb/s
Stream #0:0: Video: h264 (High) (H264 / 0x34363248), yuv420p, 640x640 [SAR 641:643 DAR 641:643], 25 fps, 25 tbr, 25 tbn, 50 tbc
Input #1, avi, from 'temp/production/videos/66.1391426268.avi':
Metadata:
encoder : Lavf55.19.104
Duration: 00:00:11.42, start: 0.000000, bitrate: 943 kb/s
Stream #1:0: Video: mpeg4 (Simple Profile) (FMP4 / 0x34504D46), yuv420p, 640x640 [SAR 1:1 DAR 1:1], 12 tbr, 12 tbn, 12 tbc
[Parsed_concat_0 @ 0x27771e0] Input link in1:v0 parameters (size 640x640, SAR 1:1) do not match the corresponding output link in0:v0 parameters (640x640, SAR 641:643)
[Parsed_concat_0 @ 0x27771e0] Failed to configure output pad on Parsed_concat_0
答案1
错误是由两个视频流的尺寸不同(准确地说是像素纵横比)引起的。第一个视频流定义的 SAR(样本 = 像素)为 641/643,因此它不是完美的正方形。
ffmpeg 无法自动将两者带到相同的尺寸,因为它无法猜测您想要缩小或放大哪一个,或者需要更改其纵横比。
您可以尝试强制设置纵横比:
ffmpeg -i temp/production/videos/title.66.avi -i temp/production/videos/66.1391426205.avi \
-filter_complex '[0:0] setsar=sar=1 [in1]; [1:0] setsar=sar=1 [in2]; [in1][in2] concat [v]' -map '[v]' \
temp/production/videos/final.66.1391426205.mp4 2>&1
与其这样做,不如在使用滤镜之前将两个视频调整到相同的尺寸scale
。为此,您只需将其替换setsar=sar=1
为scale=640:640
或所需输出的固定尺寸即可。
如果您想要复制并连接音频,请添加第二个concat
过滤器:
ffmpeg -i temp/production/videos/title.66.avi -i temp/production/videos/66.1391426205.avi \
-filter_complex '[0:v] setsar=sar=1 [in1]; [1:v] setsar=sar=1 [in2]; [in1][in2] concat [v]; [0:a][1:a] concat=v=0:a=1 [a]' -map '[v]' -map '[a]' \
temp/production/videos/final.66.1391426205.mp4 2>&1
如果您有两个视频想要放入特定尺寸的播放器中,您可以使用此过滤器:使用 ffmpeg/avconv 调整视频大小以适合静态大小的播放器