![Warum erfordert FFmpeg nostdin in einer While-Schleife?](https://rvso.com/image/1606673/Warum%20erfordert%20FFmpeg%20nostdin%20in%20einer%20While-Schleife%3F.png)
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:
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 "" | ffmpeg
ist das gleiche wieffmpeg ... < /dev/null