如何更改 ffmpeg 线程设置

如何更改 ffmpeg 线程设置

致力于管子网站。我正在播放视频ffmpegLinux的专用服务器转换为mp4

服务器规格:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Stepping:              3
CPU MHz:               3491.749
BogoMIPS:              6983.49
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7

测试期间的问题是,即使一次只上传 4-5 个,服务器负载也会猛增到平均 36 左右。这只是一个人。我猜想当它开放时,许多人会同时上传。

它似乎ffmpeg尝试使用每次转换的所有可用资源。

我听说有一个可以更改的 -threads 设置,但我找不到它。我有一台 8 CPU 服务器。它仅用于转换,所以我听说最佳设置介于 2 和 4 之间。我可以测试一下。

但是我该如何更改此设置?我在网上看到的所有内容都讨论了此设置,但没有更改它的步骤。

答案1

您想要的选项标志实际上只是-threads您可以像这样使用它(仅针对一个线程):

ffmpeg -i somefile.wmv -c:a libfdk_aac -c:v libx264  -threads 1 transcoded.mp4

但是,有相当多的细微差别会增加服务器负载和操作时间,例如重新缩放、应用过滤器和最终帧质量/帧速率 - 更不用说某些 VM 架构实际上读取和写入所有内容两次(一次本地,一次虚拟!)

以下是一些提高速度的技巧:

  1. 使用队列,以便每次只有一个项目被转码
  2. 向用户请求更小的文件
  3. 通过以下方式充分利用机器的马力:
    • 从 ramdisk 读取和写入
    • 切换到裸机进行转码任务
    • 使用-threads 0

无论你做什么,都要让你的用户了解转码过程,因为这需要时间。(IJTT)

[编辑命令以反映 LordNeckbeard 的评论]

答案2

这可能有点老了,但对于像docker这样的容器来说这听起来像是一项完美的任务。

  • 让 ffmpeg 运行full horsepower(正如 denjello 所说)
  • 但让它在docker里面运行

现在,您无需使用 ffmpeg 命令行选项即可限制单个 ffmpeg 实例可能消耗的资源量。不仅是 CPU,还有内存和 IO。

甚至更多:也许您有不同的任务可能在后台运行,而您不关心它们需要多长时间,并且您有一些应该快速运行的任务,因此您可以对不同的任务施加权重。

https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources

github上已经有预定义的ffmpeg镜像: https://github.com/jrottenberg/ffmpeg

docker run jrottenberg/ffmpeg \
        -i http://url/to/media.mp4 \
        -stats \
        $ffmpeg_options  - > out.mp4

由于开销较大,单个转换可能会运行得较慢,但如果您同时运行多个实例,这可能是一个巨大的好处。 任何转换都可以很好地扩展,更不用说安全性得到了提高,因为每个任务都与底层操作系统隔离。

相关内容