![FFmpeg が while ループで nostdin を必要とするのはなぜですか?](https://rvso.com/image/1606673/FFmpeg%20%E3%81%8C%20while%20%E3%83%AB%E3%83%BC%E3%83%97%E3%81%A7%20nostdin%20%E3%82%92%E5%BF%85%E8%A6%81%E3%81%A8%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
以下のものがある場合:
for i in *.mov;
do
ffmpeg -y -i $i -c:v copy -c:a copy ${i%%.mov}.mp4
done
これは問題なく動作します。しかし、以下を実行すると:
find . -name "*.ts" -print0 | while read -d $'\0' file;
do
ffmpeg -i "$file" -c copy -map 0 "${file%%.ts}_rec.mp4";
done
これは失敗します。-nostdin を入力する必要があります。
find . -name "*.ts" -print0 | while read -d $'\0' file;
do
ffmpeg -nostdin -i "$file" -c copy -map 0 "${file%%.ts}_rec.mp4";
done
ドキュメントでは、これにより std 入力での対話が無効になり、バックグラウンド プロセスに役立つと説明されています。
2 番目のケースでは、なぜ FFmpeg がバックグラウンド プロセスになるのでしょうか? それとも、他に何か問題があるのでしょうか?
答え1
FFmpeg はここではバックグラウンド プロセスではありません。 を読み取るだけですstdin
。 読み取らない場合もありますが、読み取ります。 これにより、 に送られるはずの文字が消費されますread
。 実際には、次のような問題が発生する可能性があります。
'while read' ループでテキスト ファイルの行を処理した結果、Bash スクリプトで文字が失われます。FFmpeg 行が原因でしょうか?
ドキュメントではバックグラウンドプロセスについて言及していますが、通常は特に彼ら読み取りますstdin
。あなたの場合、フォアグラウンドの FFmpeg に を読み取らせたくないでしょうstdin
。
答え2
動作するループと動作しないループの違いは、サブシェルを作成する | です。
私の記憶が正しければ、私は単純にecho "" | ffmpeg ...
ffmpeg の man から: -stdin 標準入力での対話を有効にします。標準入力が入力として使用されていない限り、デフォルトでオンになっています。対話を明示的に無効にするには、「-nostdin」を指定する必要があります。
Disabling interaction on standard input is useful, for example, if ffmpeg is in the background process group. Roughly the same result can be achieved with "ffmpeg ... < /dev/null" but it requires a shell.
echo "" | ffmpeg
と同じですffmpeg ... < /dev/null