1

いくつかの ffmpeg 設定をテストし、複数のコマンドを「サブプロセス」として実行したいと思います。ただし、一度に 4 つ以上のプロセスを起動したくありません。これを行う良い方法は何ですか?bgでプロセスを実行する前にプロセスIDをトラップし、プロセスリストになくなるまで待つようなものでしょうか?またはxargs?

「キューイング」のないスクリプトは次のとおりです。

#!/bin/bash

for crf in 10 15 20 23 25 30 35 ; do
    for vid_preset in medium slow veryslow; do
        ffmpeg -r 25 -i pics/pic_%04d.png -vcodec libx264 -crf $crf -vpre $vid_preset anim_crf$crf\_$vid_preset.mp4
    done
done
4

1 に答える 1

2

非常に単純なアプローチは、各ffmpegプロセスをバックグラウンドで実行し、それらが完了するのを待ってから の次の値に進むことですcrf

for crf in 10 15 20 23 25 30 35 ; do
    for vid_preset in medium slow veryslow; do
        ffmpeg -r 25 -i pics/pic_%04d.png -vcodec libx264 \
               -crf $crf -vpre $vid_preset anim_crf${crf}_${vid_preset}.mp4 &
    done
    wait
done

インストールしている場合はparallel、それを使用して 21 のプロセスすべてをビジー状態で実行できます。

# Run 4 jobs at a time, starting a new job whenever one completes.
parallel -j 4 ffmpeg -r 25 -i pics/pic_%04d.png \
         -vcode libx264 -crf {1} -vpre {2} \
         anim_crf{1}_{2}.mp4 ::: 10 15 20 23 25 30 35 ::: medium slow veryslow

{1}は、最初の入力ソース (最初の に続く:::)からの選択に置き換えられ{2}、2 番目の入力ソースからの選択に置き換えられます。例はそれをより簡単に説明します:

$ parallel echo {1} {2} ::: a b c :: 1 2
a 2
a 1
b 1
b 2
c 1
c 2

bash4.3以降の厄介なアプローチ(wait -n導入時):

max_jobs=4
running=()
for c in 10 15 20 23 25 30 35; do
  for v in medium slow veryslow; do
    ffmpg ... &
    running+=($!)
    # If we're at capacity, wait for a job to complete
    if (( ${#running[@]} == $max_jobs )); then
      wait -n
      # Any where from 0 to max_jobs - 1 could still be running
      running=( $(jobs -p) )
    fi
  done
done
于 2016-06-06T15:36:49.217 に答える