ffmpeg は、while ループで find を使用して、誤って反復変数を変更します。

ffmpeg は、while ループで find を使用して、誤って反復変数を変更します。

誰かがここで何が起こっているのか私に説明できますか?これが私の状況を次のように単純化した方法です。

# make 20 test gifs out of the same source file.
for i in {1..20}; do cp -p ../some-random-source-file.gif "${i}.gif"; done

# grab, then process them.
while read f; do echo "→ $f"; ffmpeg -i "$f"  -y  -loglevel quiet  "same.mp4"; done < <(find .  -maxdepth 1  -type f  -iname "*.gif"  -printf "%f\n")
→ 11.gif
→ .gif
→ 9.gif
→ .gif
→ 14.gif
→ 9.gif
→ 0.gif
→ 13.gif
→ 7.gif
→ 5.gif
→ 2.gif
→ .gif
→ 3.gif
→ 0.gif
→ 16.gif
→ .gif
→ 8.gif
→ 8.gif
→ .gif
→ 4.gif

混合ファイル(gifと非gif)を含むディレクトリ内のすべてのgifを処理しようとしています。しかし、何らかの理由で対応するffmpegステップを追加すると、変数の内容が$f最初に切り捨てられることがあります。


追加情報:

  • うまくいかないファイルもログに記録しているので、プロセス交換を使用しています。if ! ffmpeg …; then FAILED+=("$f"); fi
  • また、文字列の置き換えによって新しいファイル名を生成しましたが${f%.gif}.mp4...私は知っているので、その部分は問題の発生とは関係ありませんでした。
  • バッシュバージョン5.1.16

プロセス置換を理解します。タイミングの問題が発生する可能性があります- しかし、なぜ変数をランダムに切り取るのですか?最初にそして最後ではないか?構造がそれほど信頼できない場合、誰がそれを使用できますか?私はまた何ができますか?

答え1

ffmpegデフォルトではstdinを読み込むので、いくつかの文字が使用されます。フラグを追加する必要があります-nostdin

ffmpeg -nostdin -i "$f"  -y  -loglevel quiet

関連情報