FFMPEG - 组合视频时出错

时间:2012-11-27 17:57:01

标签: ffmpeg

我有两个类似大小,FPS和持续时间的.OGG文件。我的目标是使用FFMPEG将它们组合成并排演示。为此我尝试了以下cmd:

  

ffmpeg -i subject.ogg -vf“[in] pad = 3 * iw:3 * ih [left]; movie = clinician.ogg [right]; [left] [right] overlay = 100:0 [out ]“combined.ogg

可以说所得视频不可播放。在组合过程中,FFMPEG会打印许多错误,如:

  

[Parsed_overlay_2 @ 0x1eb7d3e0]缓冲区队列溢出,丢弃

这告诉我什么?

注意:

  • 两个源文件都可播放
  • 为了理解参数
  • ,我将'输出'填充得相当大
  • 第二个视频在100:0的位置是任意的。一旦我让cmd工作,我会将它移动到输出中更好的位置。
  • 这两个视频都是从网络摄像头录制的.FLV开始的。我将它们转换为.ogg,因为FFMPEG不想合并两个.FLV文件。如果有更好的途径,请告诉我。

那么 - 我的参数有什么问题以及我在做什么导致这些FFMPEG错误?

编辑:
ffmpeg -i clinician.ogg

  

输入#0,ogg,来自'clinician.ogg':
       持续时间:00:05:20.98,开始时间:0.001000,比特率:2273 kb / s
        流#0:0:视频:theora,yuv420p,500x500 [SAR 1:1 DAR 1:1],1k tbr,1k tbn,1k tbc
       元数据:
        服务器:Red5服务器1.0.0 RC1 $ Rev:4193 $
        CANSEEKTOEND:真实的         编码器:Lavf54.31.100
      流#0:1:音频:vorbis,8000 Hz,立体声,s16
      元数据:
        服务器:Red5服务器1.0.0 RC1 $ Rev:4193 $
        CANSEEKTOEND:真实的         编码员:Lavf54.31.100

ffmpeg -i subject.ogg

  

输入#0,ogg,来自'subject.ogg':
    持续时间:00:05:17.60,开始:0.001000,比特率:1341 kb / s
      流#0:0:视频:theora,yuv420p,300x300 [SAR 1:1 DAR 1:1],83.33 tbr,1k tbn,1k tbc
      元数据:
        服务器:Red5服务器1.0.0 RC1 $ Rev:4193 $
        CANSEEKTOEND:真实的         编码器:Lavf54.31.100
      流#0:1:音频:vorbis,8000 Hz,立体声,s16
      元数据:
        服务器:Red5服务器1.0.0 RC1 $ Rev:4193 $
        CANSEEKTOEND:真实的         编码员:Lavf54.31.100

2 个答案:

答案 0 :(得分:2)

转换为x264是一个很好的建议。这似乎扭转了局势。

以下是后人的一些注意事项:

  • 将flv转换为x264并纠正音频同步问题:
  

ffmpeg -y -i subject_s_2242_r_1658.flv -async 1 -ac 2 -strict -2 -acodec vorbis \
  -c:v libx264 -preset slow -crf 22 subject.mkv

  • 将两个x264文件合并为一个并排文件,并将两个单声道音频轨道放入生成的文件中立体声:
  

ffmpeg -y -i clinician.mkv -vf:“movie = subject.mkv [right]; pad = iw * 2:ih:0:0 [left]; [left] [right] overlay = 500:0 “\
  -filter_complex“amovie = clinician.mkv [l]; amovie = subject.mkv [r]; [l] [r] amerge”final.mkv

我无法安装AVISYNTH(在CentOS 6.2上运行),但它看起来确实是一个很好的解决方案。

答案 1 :(得分:0)

使用Avisynth执行此操作可能最简单。

制作以下input.avs文件:

a = AviSource("first.avi")
b = AviSource("second.avi")
StackHorizontal(a,b)

然后运行ffmpeg -i input.avs output.avi ...以及您想要的任何其他选项。

编辑:另一种方法(不是快速)是将两个文件中的帧转储到png并将它们与ImageMagick(例如montage)或类似的图像处理工具结合起来。

#!/bin/bash
ffmpeg -i first.avi first_%05d.png
ffmpeg -i second.avi second_%05d.png
for file in first_*.png ; do montage ${file} ${file/first/second} ${file/first/output} ; done
ffmpeg -i output_%05d.png output.avi

这实际上可以让你进行更多的图像处理而不仅仅是并排,你可以做任意比例/叠加/背景/等。问题是来自一个文件的第N帧可能与来自另一个文件的第N帧完全不同,如果它们是可变帧率,这是AviSynth为您完美处理的。如果剪辑是恒定的帧速率,那不是问题。

通过制作包含这两者的新剪辑(无论是否通过avisynth)来组合剪辑需要重新压缩视频,并降低视频质量/增加文件大小。

我不确定如何将ogg文件读入Avisynth,但可能有一种方法。检查the FAQ on input formats

旁注:theora / ogg的选择很奇怪。更好:mp4容器中的H.264。