You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:04:13