如何限制ffmpeg内存使用量

时间:2012-09-12 14:38:35

标签: php ffmpeg

我正在使用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,这是我的服务器不允许的,因此ffm​​peg会被终止。我可以将ffmpeg的内存使用量限制在600-700MB左右吗?

非常感谢任何帮助...

3 个答案:

答案 0 :(得分:4)

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

简短回答不!

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

答案 1 :(得分:2)

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

所以它是需要解决内存使用的编码器,而不是直接FFmpeg。我不确定如何修复x264的内存使用,但是我尝试了较新的x26 5 ,在我的情况下它只使用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几乎为空。)

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

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

答案 2 :(得分:0)

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

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

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

将在jiffy中完成,并且没有任何内存开销

如果您希望仅更改音频编解码器,请不要给出acodec部分。

如果输入视频编解码器不适合你[因此复制不是一个选项]请尝试为vcodec执行mpeg4编码。在那里编码更便宜,但我无法向你保证它将始终符合你的记忆要求。