【问题标题】:How can I limit ffmpeg memory usage如何限制 ffmpeg 内存使用量
【发布时间】:2012-09-05 14:54:46
【问题描述】:

我正在使用 ffmpeg 在 PHP 中使用此命令将 1080p 视频转换为 MP4。

$command = FFMPEG.' -i ' . $src . ' -sameq -strict -2 -vcodec libx264 -ar 22050 -y ' . $dest.'.mp4 2>&1'; 
exec($command,$output,$status);

问题是该进程使用了​​大量内存 ~1600MB,这是我的服务器不允许的,因此 ffmpeg 被终止。可以把ffmpeg的内存使用限制在600-700MB左右吗?

非常感谢任何帮助...

【问题讨论】:

标签: php ffmpeg


【解决方案1】:

这与 PHP 无关。这是关于如何限制 FFMPEG 内存使用的。

简短回答不!

看这里:http://hwdmediashare.co.uk/forum/27-development-customisation/54700-limit-ffmpeg-memory-usage

【讨论】:

  • 那么我还有哪些其他选择可以实现目标(将 1080p .mov 文件转换为相同质量的 mp4)??
  • @Khan,看来您只是想转换而不一定要重新编码视频。所以你可以用很少的内存需求来做到这一点。见我上面的回答。
  • 链接已失效:这就是为什么强烈建议复制在 SO...中回答问题的内容...
  • 论坛已关闭;存档链接here.
【解决方案2】:

事实上,视频编码是一项 CPU 和内存密集型工作。如果你想这样做,你需要为它提供必要的内存。

由于您想将 1080p .mov 转换为相同质量的 .mp4,我假设您只是想更改文件格式而不是重新编码。

ffmpeg -i input.mov -acodec copy -vcodec copy out.mp4

将很快完成,并且没有任何内存开销

如果您只想更改音频编解码器,请不要提供编解码器部分。

如果输入视频编解码器不适合您[因此无法选择复制],请尝试为 vcodec 进行 mpeg4 编码。在那里编码更便宜,但我不能保证它总是适合你的内存要求。

【讨论】:

  • 感谢 av501!该命令适用于 mov 文件。但我的输入文件可能是任何格式(flv、mp4、mov、wmv 等)。实际上,我正在尝试将任何用户提供的视频转换为 mp4 和 ogv 格式,而不会造成任何质量损失。那可能吗 ?这是我对 ogv 的命令: ffmpeg -i input.wmv -c:v libtheora -q:v 7 -c:a libvorbis -q:a 5 -y output.ogv
  • 如果输出格式允许输入文件具有 [codecs] 的编解码器,那么是允许的。所以 mov => mp4 是 100% 可能的,因为它们的格式几乎相同 [微小差异]。 [mp4 3gp mov 几乎一模一样] wmv => mp4 取决于 wmv 中的编解码器。当 flv 具有 h.264 时,flv 到 mp4 也可以工作。所以至少这应该适用于这些文件。对于其他文件,您必须转码。
【解决方案3】:

视频编解码器主要负责高内存使用。

所以需要解决内存使用问题的是编码器,而不是直接使用 FFmpeg。我不确定如何修复 x264 的内存使用,但我尝试了较新的 x265,在我的情况下它只使用 1.6 GB,而 libx264 因询问超过 2 个而失败GB 内存限制(每个进程,在 32 位系统上)。

所以,对我有用的是使用:

ffmpeg -i input -pix_fmt yuv420p -c:v hevc -x265-params crf=23 out.mp4

(省略参数来处理音频。)

但一般的做法是尝试其他编码器。如果 x265 不起作用,我打算尝试 mpeg4 和 vp9,也许还有其他的。如果这些都不起作用,那么进一步的选择包括查看编码器的设置(尽管没有出现明显且与内存使用直接相关的内容):

ffmpeg -h encoder=mpeg4

更新:实际上,YouTube 还不接受 HEVC(又名 H.265)(它只会在上传完成后通知我)。所以,就像我上面建议的那样,我选择了 VP9,这次用前 50 帧进行了试运行。我使用了类似于我发现的a guide 的设置(恒定质量设置,尽管我应该使用更多他们建议的参数):

ffmpeg.exe -i <input> -pix_fmt yuv420p -c:v libvpx-vp9 -pass 1 -b:v 0 -crf 20 -f webm pass1.webm

ffmpeg.exe -i <input> -pix_fmt yuv420p -c:v libvpx-vp9 -pass 2 -b:v 0 -crf 20 -f webm pass2.webm

(注意pass1.webm 几乎是空的。)

还请注意,尽可能首选两次通过。它在所有方面都更好,包括整体上更快的编码。

使用这些设置,一个 4K 分辨率的 73 秒剪辑需要大约 16 个小时来编码 - 这是使用一个内核,因为我忘记指定 -threads。虽然速度很慢,但 FFmpeg 的内存使用量仅上升到大约 0.6 GB。生成的文件为 300 MB,与未压缩的帧相比,我看不到任何质量损失(因此 -crf 20 可能有点太低了)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 2012-07-06
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    相关资源
    最近更新 更多