FFMPEG占用了所有内存



这可能是最老套的问题之一,但问题是:所以我有一个Ubuntu服务器作为一台独立的机器运行,只用于处理FFMPEG作业。它有4个vCPU、4GB RAM和80GB存储空间。我目前正在使用此脚本将视频转换为HLS播放列表:https://gist.github.com/maitrungduc1410/9c640c61a7871390843af00ae1d8758e这适用于所有视频,包括从iPhone录制的4K。然而,我正在尝试添加水印,所以我更改了这个脚本的第106行

来自:

cmd+=" ${static_params} -vf scale=w=${widthParam}:h=${heightParam}"

至:

cmd+=" ${static_params} -filter_complex [1]colorchannelmixer=aa=0.5,scale=iw*0.1:-1[wm];[0][wm]overlay=W-w-5:H-h-5[out];[out]scale=w=${widthParam}:h=${heightParam}[final] -map [final]"

现在,这在Youtube或其他来源的视频中可以完美地工作,但一旦我尝试使用iPhone的4K视频,RAM使用量就会在不到一分钟的时间内从250MB增长到3.8GB,并破坏整个过程。所以我寻找了一些类似的问题:

  1. FFmpeg Concat滤波器高内存使用率
  2. https://github.com/jitsi/jibri/issues/269
  3. https://superuser.com/questions/1509906/reduce-ffmpeg-memory-usage-when-joining-videos
  4. ffmpeg amerge筛选时出错:无法分配内存

我知道FFMPEG需要大量的内存消耗,但我不确定在不将流保存在内存中的情况下处理视频的确切方法,而是实时释放任何内存分配。即使我们决定在没有水印的情况下工作,它仍然挂在1.8GB左右的RAM上,用于处理5秒的4K视频,这会产生一种风险,即如果我们的用户上传的视频比它长,最终会导致服务器崩溃。我考虑过ulimit,但这似乎限制了FFMPEG,而不是编写改进的命令。让我知道如何解决这个问题。感谢

好的,我找到了一个解决方案。问题是4K视频的比特率非常高,它会加载到你的RAM上来处理filter_complex,这最终会扼杀你的进程。为了解决这个问题,我做的第一件事是将输入视频转码为H264格式(如果你愿意,你可以设置自定义比特率,但我忽略了这个(。所以我在这个脚本的第58行之后添加了这个新命令https://gist.github.com/maitrungduc1410/9c640c61a7871390843af00ae1d8758e

ffmpeg -i SOURCE.MOV -c:a aac -ar 48000 -c:v libx264 -profile:v main -crf 19 -preset ultrafast /home/myusername/myfolder/out.mp4

现在我们有了一个新的处理过的CCD_ 3。我们将转到脚本行121并将其删除。这样做的原因是阻止FFMPEG同时重载所有命令。现在我们将删除107到109行,并执行以下操作:

filters=[1]colorchannelmixer=aa=0.5,scale=iw*0.1:-1[wm];[0][wm]overlay=W-w-5:H-h-5[out];[out]scale=w=${widthParam}:h=${heightParam}[final]
cmd=""
cmd+=" ${static_params} -filter_complex ${filters} -map [final]"
cmd+=" -b:v ${bitrate} -maxrate ${maxrate%.*}k -bufsize ${bufsize%.*}k -b:a ${audiorate}"
cmd+=" -hls_segment_filename ${target}/${name}_%03d.ts ${target}/${name}.m3u8"
ffmpeg ${misc_params} -i /home/myusername/myfolder/out.mp4 -i mylogo.png ${cmd}

所以现在我们在一个循环中运行FFMPEG来处理每分辨率的基本输出。这将同时消除内存中所有过滤器的过载。根据您的使用情况,您甚至可能想要删除第53行。

测试

  1. 1.2分钟长(453MB(的4K HEVC iPhone视频
  • 转码为H264-内存使用率保持在750MB
  • HLS+水印-内存使用率保持在430MB到1.1GB之间
  1. 1.13分钟长(448MB(的4K HEVC LG HDR视频
  • 转码为H264-内存使用率保持在800MB
  • HLS+水印-内存使用率保持在380MB到850MB之间

我的最后想法

  1. FFMPEG是一个吃瓜群众。核心/内存需求的总数将主要取决于您想要处理的视频量。在我的情况下,我们只想支持高达500MB的视频,因此我们对4K视频处理的测试符合需求,但如果您有更大的视频需求,那么您必须使用手头更多的RAM/CPU核心进行测试
  2. 并行运行FFMPEG从来都不是一个好主意。批量处理视频将确保最佳利用可用资源,并减少在半夜破坏系统的可能性
  3. 始终在远离Web服务器、数据库、邮件服务器等的独立机器中运行FFMPEG
  4. 增加资源并不总是答案。虽然我们倾向于首先得出结论,更多的资源===更稳定并不总是正确的。我已经读了足够多关于即使是32核64GB Ram也无法跟上FFMPEG的帖子,所以你最好的选择是首先改进你的命令,或者将命令分离成更小的命令,以尽可能有效地处理资源

我不是FFMPEG的专家,但我认为这些信息将帮助可能有类似问题的人。

最新更新