如何降低ffmpeg的CPU使用率?

问题描述:

你好我重新流送的HLS流作为HLS流如何降低ffmpeg的CPU使用率?

SETLOCAL 
:loop 

ffmpeg -thread_queue_size 32768 -i "http://xx/636.m3u8" -f hls -hls_time 5 -hls_list_size 5 -hls_allow_cache 0 -hls_flags delete_segments -segment_list_flags +live -hls_base_url "../ts/" -hls_segment_filename "C:\nginx\html\ts\lig-%random%%random%-%%3d.svgz" -y "C:\nginx\html\hls\lig1.m3u8" > log.txt 

goto loop 

但它使用15-20%的CPU我必须做出16个数据流一样,在同一台服务器,但我不能。

着我做出像刚才下载.ts文件克隆M3U8的配置?

+0

此问题与编程无关,属于SuperUser.com。 – Brad

默认情况下,FFmpeg的将尝试重新编码输入,即使你不使用任何编码相关的参数。

如果你想刚才复制的流原样,你应该尝试复制音频流功能:

-c:v copy -c:a copy

通过复制输入数据流,可以完全跳过编码过程。 所以,你的命令是这样的:

ffmpeg -thread_queue_size 32768 -i "http://xx/636.m3u8" -f hls -c:v copy -c:a copy -hls_time 5 -hls_list_size 5 -hls_allow_cache 0 -hls_flags delete_segments -segment_list_flags +live -hls_base_url "../ts/" -hls_segment_filename "C:\nginx\html\ts\lig-%random%%random%-%%3d.svgz" -y "C:\nginx\html\hls\lig1.m3u8" > log.txt 

(不知道是否会工作,虽然)


当你需要重新编码的输入流,你应该考虑到为命令添加一些编码参数。 默认情况下,ffmpeg会尝试匹配源参数和质量,在实时应用程序中这并不总是最优的。

的“veryfast,超高速和超高速” H264预置是一个好的开始获得一些性能提升。

​​

您也可以拨弄CRF(恒定速率因子)编码,更高的比特率等 更多关于H264 enoding:https://trac.ffmpeg.org/wiki/Encode/H.264

+0

当我键入-preset:v超快到命令行ffmpeg stucks冻结 –

+0

如果你正在重新编码,你必须定义编解码器'例如:-c:v h264'!另外,削减'> log'部分,它禁止ffmpeg告诉出了什么问题。 –

-Re(输入) 阅读在本地帧速率输入。主要用于模拟抓取设备或实时输入流(例如,从文件读取时)。不应该与实际的抓取设备或实时输入流一起使用(它可能导致数据包丢失)。默认情况下,ffmpeg尝试尽可能快地读取输入。该选项将会将输入的读数减慢到输入的本地帧速率。它对实时输出(例如直播)非常有用。

尽管这个问题已经被认为是说,我认为它缺乏不涉及调整命令参数,但可以使用其他工具或命令而不是仅仅的ffmpeg使用的答案。

请将CPULimit工具正是为此而设计的,而不是只为ffmpeg的同时也为你想减少这种资源的利用任何其他CPU密集型的过程将有效地开展工作。

cpulimit最重要的参数是-l,它允许您指定进程将被允许使用的CPU百分比(作为其上限)。请,也可观察到该极限取决于CPU的/核的数量/线程机器已经,例如,如果机器具有8个CPU,请将CPULimit -l有效值范围从0至800(0是没有用的,当然,并800意味着完全不限制该过程,因为800%意味着所有机器处理能力)。

使用一半的容量为8个CPU机

实施例: cpulimit -l 400 ffmpeg ...

希望这有助于为这一特定问题,以及在将来的类似需求。