Warum erfordert FFmpeg nostdin in einer While-Schleife?

Warum erfordert FFmpeg nostdin in einer While-Schleife?

Wenn ich habe:

for i in *.mov;
do
ffmpeg -y -i $i -c:v copy -c:a copy ${i%%.mov}.mp4
done

Das läuft einwandfrei. Aber wenn ich Folgendes ausführe:

find . -name "*.ts" -print0 | while read -d $'\0' file;
do
  ffmpeg -i "$file" -c copy -map 0 "${file%%.ts}_rec.mp4";
done

Dies schlägt fehl. Ich muss -nostdin eingeben.

find . -name "*.ts" -print0 | while read -d $'\0' file;
do
  ffmpeg -nostdin -i "$file" -c copy -map 0 "${file%%.ts}_rec.mp4";
done

In der Dokumentation wird erläutert, dass dies die Interaktion mit der Standardeingabe deaktiviert und für Hintergrundprozesse hilfreich ist.

Warum ist FFmpeg im zweiten Fall ein Hintergrundprozess? Oder gibt es ein anderes Problem?

Antwort1

FFmpeg ist hier kein Hintergrundprozess. Es liest nur seine stdin. Das muss nicht sein, aber es tut es. Dabei werden Zeichen verbraucht, die eigentlich an gehen sollten read. Tatsächlich können Probleme wie dieses auftreten:

„while read“ durchläuft Zeilen in Textdatei und verliert Zeichen im Bash-Skript. Ist die FFmpeg-Zeile schuld?


In der Dokumentation wird von Hintergrundprozessen gesprochen, da man normalerweise nicht möchte,sie im Besonderenzum Lesen stdin. In Ihrem Fall möchten Sie nicht, dass FFmpeg im Vordergrund seine liest stdin.

Antwort2

Der Unterschied zwischen der funktionierenden und der nicht funktionierenden Schleife ist das |, das eine Untershell erstellt.

Wenn ich mich richtig erinnere, habe ich es gelöst, indem ich einfachecho "" | ffmpeg ...

Aus ffmpeg man: -stdin Aktiviert die Interaktion mit der Standardeingabe. Standardmäßig aktiviert, sofern nicht die Standardeingabe als Eingabe verwendet wird. Um die Interaktion explizit zu deaktivieren, müssen Sie „-nostdin“ angeben.

       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 "" | ffmpegist das gleiche wieffmpeg ... < /dev/null

verwandte Informationen