问候FFmpeg用户,
我们正在遇到一个奇怪的韭菜问题(或者可能只是做一些真正错误的事情),并且需要一些有关调试方法的指导。
我们要实现的目标:
处理包含多个用户流的会议记录,每个用户流都在其自己的单独文件中(所有文件均为mp4 / opus)。
出了什么问题:
我们正在使用什么:
第一个 FFmpeg命令,当文件的音量超过设定的阈值时,该命令将从文件中读取filter_complex_script并在每个视频源文件上添加 drawbox 作为通话指示。
第二 FFmpeg命令,该命令从文件中读取filter_complex_script和:
filter_complex 命令:
[0]select='between(t, 1, 2)', scale=762:428:force_original_aspect_ratio=decrease,pad=763:429:(ow-iw)/2:(oh-ih)/2[stream-0-workspace-scale-1-1];
[block-2-grid][stream-0-workspace-scale-1-1]
overlay=repeatlast=1:shortest=0:x=10:y=316:enable='between(t, 1, 2)'
[block-2-workspace-1];
使用TRIM的filter_complex 命令:
[input-file-tag]
trim=start=#{start}:duration=#{duration},
setpts=PTS-STARTPTS,
scale=#{w-1}:#{h-1}:force_original_aspect_ratio=decrease,
pad=#{w}:#{h}:(ow-iw)/2:(oh-ih)/2
[input-file-trimmed];
[previous-block-tag]
overlay=repeatlast=1:shortest=0:x=#{x}:y=#{y}:enable='between(t, #{from}, #{to})'
[next-block-tag]
我们尝试了TRIM命令方式,尝试了SELECT命令方式。问题是,在执行过程中,两者都需要消耗大量的内存。
示例和更多说明:
让我们假设五个输入中只有两个具有大于a的音量 从第二到第二个特定的音量阈值。
我们正尝试根据一些叠加数学仅显示它们。
以易于阅读的形式裁剪的命令:https://pastebin.com/YwrnRgnA
完整的FFmpeg命令读起来太长了,这就是我们开始使用filter_complex_script并从文件中加载它的原因
有时,一个视频会议块可能多达300个以上 中间覆盖,这会导致描述的内存问题。我们期望内存占用量类似于输入文件的数量,或者可能高出二到三倍。但是,在剪辑的前两分钟内,我们达到了15Gb或RAM的使用,而输入文件的大小不超过200Mb。
我们在调试方面做了什么:
我们最初一直在使用split,但是很快就发现了该split 实际上会复制每个输入并将其加载到内存中,因此我们不得不 放弃这种方法。
事实上,我们转而使用输入文件本身,因此 问题出在其他地方。
为澄清起见,我们将ffmpeg命令分为两个单独的命令。 第一个使用drawbox和 用户头像和名称。它输出新的视频文件,我们将在其中使用 上面描述为直接输入文件标记的命令,例如0:v,1:v 等等。
感谢您抽出宝贵的时间阅读我们的期刊。 我们肯定希望您能帮助我们缩小范围。 如果需要,请随时询问其他信息或说明。
祝你愉快!