FFMPEG - 合并视频时出错

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

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] Buffer queue overflow, dropping

这告诉我什么?
注意:
  • 两个源文件都是可播放的
  • 我填充了“输出”以尝试理解参数
  • 第二个视频在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
元数据:
SERVER : Red5 Server 1.0.0 RC1 $Rev: 4193 $
CANSEEKTOEND : true
ENCODER : Lavf54.31.100
流#0:1:音频:vorbis,8000 Hz,立体声,s16
元数据:
SERVER : Red5 Server 1.0.0 RC1 $Rev: 4193 $
CANSEEKTOEND : true
ENCODER : 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 Server 1.0.0 RC1 $Rev:4193$
CANSEEKTOEND:true
ENCODER:Lavf54.31.100
流#0:1:音频:vorbis,8000 Hz,立体声,s16
元数据:
服务器:Red5 Server 1.0.0 RC1 $Rev:4193$
CANSEEKTOEND:true
ENCODER:Lavf54.31.100


2
不要指望在这里得到答案,但如果您添加ffmpeg -i subject.oggffmpeg -i clinician.ogg的输出,它应该会有所帮助。 - rekire
你的第一个指令的完整控制台输出将会很有用(可以排除重复错误)。此外,我们可以看到你是否使用的是古老版本的ffmpeg还是更新的版本。 - llogan
2个回答

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

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


太好了,这个滤镜在更高级的一个出现“Buffer queue overflow, dropping”错误时起作用了:ffmpeg -i in1.mov -i in1.mov -filter_complex "[0:v]setpts=PTS-STARTPTS, pad=iw*2:ih[bg]; [1:v]setpts=PTS-STARTPTS[fg]; [bg][fg]overlay=w; amerge,pan=stereo:c0<c0:c1<c1" out.mov - Camille Goudeseune

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,但可能有办法。请参阅有关输入格式的常见问题解答

侧面评论:选择theora / ogg很奇怪。 更好的选择是mp4容器中的H.264。


AviSynth只支持Windows吗?我在Linux上找到的只有AvxSynth,但是它无法编译。 - ethrbunny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接