如何限制ffmpeg内存的使用


How can I limit ffmpeg memory usage

我使用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内存的使用。

简短的回答是否定的!

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

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

因此,需要解决其内存使用问题的是编码器,而不是直接使用FFmpeg。我不知道如何修复x264的内存使用问题,但我尝试了较新的x265,在我的情况下,它只使用了1.6GB,而libx264由于要求超过2GB的内存限制(在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帧进行了试运行。我使用了类似于我找到的指南的设置(恒定质量设置,尽管我应该使用更多他们建议的参数):

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将几乎为空。)

还要注意,只要可能,最好两次通过。它在各个方面都更好,包括总体上更快的编码。

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

事实是视频编码需要CPU和内存。如果你想这样做,你需要给它必要的内存。

既然你想把1080p.mov转换成相同质量的.mp4,我假设你想改变文件的格式,而不是重新编码。

ffmpeg-i输入.mov-acodec复制-vcodec复制输出.mp4

将在一瞬间完成,并且没有任何内存开销

如果你只想更改你的音频编解码器,不要给出acodec部分。

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