ffmpeg - 合并两个视频,让它们依次播放

ffmpeg - 合并两个视频,让它们依次播放

我正在尝试将两个视频文件合并在一起 - 由于这些视频是由用户选择的,因此我通过 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=1scale=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 调整视频大小以适合静态大小的播放器

相关内容