致力于管子网站。我正在播放视频ffmpeg在Linux的专用服务器转换为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 架构实际上读取和写入所有内容两次(一次本地,一次虚拟!)
以下是一些提高速度的技巧:
- 使用队列,以便每次只有一个项目被转码
- 向用户请求更小的文件
- 通过以下方式充分利用机器的马力:
- 从 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
由于开销较大,单个转换可能会运行得较慢,但如果您同时运行多个实例,这可能是一个巨大的好处。 任何转换都可以很好地扩展,更不用说安全性得到了提高,因为每个任务都与底层操作系统隔离。