如何在Bash中通过for循环并行执行多个FFmpeg命令以优化多CPU机器上的视频压缩服务
如何在Bash中通过for循环并行执行多个FFmpeg命令以优化多CPU机器上的视频压缩服务
看来你已经找对了方向——先分割视频来适配多CPU资源,但并行压缩这一步还没跑通对吧?别着急,咱们来把这个问题解决掉。
首先得指出你之前尝试的问题:你写的for循环里虽然用了子shell,但没有把FFmpeg进程放到后台运行,所以本质上还是串行执行,根本没用到并行能力。接下来给你几种实用的bash解决方案:
方法一:带并发控制的For循环(最直观)
这种方法可以手动控制同时运行的FFmpeg进程数量,避免一下子把104核的机器占满(留些余量给系统进程会更稳定)。
首先确保目标目录存在:
mkdir -p compressed
然后用这个脚本实现并行压缩:
#!/bin/bash # 设定最大并发进程数,根据你的104核机器调整,建议设30-40个(单个FFmpeg占2-3线程) MAX_PROCS=35 count=0 # 捕获Ctrl+C信号,终止所有子进程 trap 'pkill -P $$' SIGINT SIGTERM for f in ./*.MOV; do # 将FFmpeg进程放到后台运行 ffmpeg -i "$f" "./compressed/${f##*/}" & ((count++)) # 当达到最大并发数时,等待所有后台进程完成再继续 if (( count >= MAX_PROCS )); then wait count=0 fi done # 等待最后一批后台进程全部完成 wait
关键细节说明:
&符号:把FFmpeg进程放到后台,让shell可以继续处理下一个文件wait命令:暂停当前脚本,直到所有后台子进程结束trap语句:如果按下Ctrl+C,会杀死当前脚本启动的所有FFmpeg子进程,避免后台残留进程
方法二:用xargs快速实现并行(更简洁)
xargs自带并行控制功能,写起来更短:
mkdir -p compressed ls ./*.MOV | xargs -n1 -P35 -I{} ffmpeg -i {} "./compressed/{}"
参数解释:
-n1:每次只传递一个文件名给FFmpeg-P35:同时运行最多35个进程-I{}:用每个文件名替换命令中的{}占位符
额外建议
- 调整
MAX_PROCS数值:可以先从30开始测试,观察CPU使用率,逐步调整到能稳定占满大部分CPU的数值(比如104核的话,35-40个进程应该能把CPU利用率拉上去) - FFmpeg参数优化:你当前的压缩命令没指定编码器,FFmpeg会用默认编码,建议加上明确的编码器参数(比如
-c:v libx264),并根据需求调整压缩率和线程数(比如-threads 2固定单个FFmpeg的线程数,这样更容易控制整体并发)
备注:内容来源于stack exchange,提问作者Oliver Dixon
相关产品推荐
相关产品推荐

