修剪叠加内存问题

时间:2019-07-04 18:16:27

标签: ffmpeg

问候FFmpeg用户,

我们正在遇到一个奇怪的韭菜问题(或者可能只是做一些真正错误的事情),并且需要一些有关调试方法的指导。

我们要实现的目标:

处理包含多个用户流的会议记录,每个用户流都在其自己的单独文件中(所有文件均为mp4 / opus)。

  • 根据一组录音在设置的时间点的音量级别制作一个动态场景。
  • 场景必须包括两个部分:所有参与者视频的较小网格,当前正在讲话的人员的较大网格。像Google Hangouts或Skype一样在其应用程序中执行的操作。

出了什么问题:

  • 在蒙太奇期间,由于某种原因,内存占用开始意外地飞涨

我们正在使用什么:

第一个 FFmpeg命令,当文件的音量超过设定的阈值时,该命令将从文件中读取filter_complex_script并在每个视频源文件上添加 drawbox 作为通话指示。

第二 FFmpeg命令,该命令从文件中读取filter_complex_script和:

  • 获取一个输入文件(使用0:v)
  • 在用户讲话时
  • 修剪的一部分
  • 根据进行缩放
  • 填充至该分辨率(以防用户视频较小的情况)
使用SELECT的

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 等等。

感谢您抽出宝贵的时间阅读我们的期刊。 我们肯定希望您能帮助我们缩小范围。 如果需要,请随时询问其他信息或说明。

祝你愉快!

0 个答案:

没有答案