
Ich durchlaufe eine Textdatei mit „while read“. Ich lese aus jeder Zeile drei Variablen – zwei Dateinamen und eine Dezimalzahl. Ich weiß, dass dies in einem Standard-Setup funktioniert (Schleife, Zeile lesen, Zeile echoen, Variablen extrahieren, sonst nichts), weil ich es an meiner Eingabedatei getestet habe.
Ich erhalte jedoch ein merkwürdiges Ergebnis, wenn ich den Kern meiner Routine hinzufüge - nämlich einen Aufruf von ffmpeg, um die durch die Dateinamen dargestellten Audio- und Video-Streams zusammenzuführen. Aufeinanderfolgende Lesevorgänge lassen führende Zeichen aus der Zeile weg. Ich leseHierdas Aufrufen von „read“-Eingaben innerhalb einer „while read“-Schleife kann Probleme verursachen, und ich frage mich, ob der ffmpeg-Aufruf etwas tut, das Bash verwirrt, aber das scheint unwahrscheinlich und bizarr! NB: Ich verstehe den ffmpeg-Aufruf nicht wirklich – ich habe ihn aus einer Antwort auf eine andere Frage.
Jede Hilfe wäre willkommen!
Das erste Lesen funktioniert wie erwartet (und der ffmpeg-Befehl wird abgeschlossen):
LINE 1
vidsNeedingSound/448£generic@06_10_16-09_30_47.mp4 soundToAdd/448£generic@06_10_16-12_11_54.wav 6.988354
V: vidsNeedingSound/448£generic@06_10_16-09_30_47.mp4 A: soundToAdd/448£generic@06_10_16-12_11_54.wav D: 6.988354
Beim zweiten „Lesen“ gehen 36 Zeichen vom Anfang der Zeile verloren (und der ffmpeg-Befehl schlägt fehl, da die durch die Variable V dargestellte Datei, die das erste Element der Zeile annimmt, nicht auf eine Datei verweist):
LINE 2
6-09_30_47.mp4 soundToAdd/452£generic@06_10_16-12_11_54.wav 9.64663
V: 6-09_30_47.mp4 A: soundToAdd/452...
Der dritte Lesevorgang funktioniert wie erwartet (und der ffmpeg-Befehl wird abgeschlossen):
LINE 3
vidsNeedingSound/452£left@06_10_16-09_30_47.mp4 soundToAdd/452£left@06_10_16-12_11_54.wav 9.862118
V: vidsNeedingSound/452£left@06_10_16-09_30_47.mp4 A: soundToAdd/452...
Beim vierten „Lesen“ gehen 37 Zeichen (eins mehr als beim letzten Fehlschlag) vom Anfang der Zeile verloren (und der ffmpeg-Befehl schlägt fehl):
LINE 4
09_30_47.mp4 soundToAdd/452£right@06_10_16-12_11_54.wav 9.431392
V: 09_30_47.mp4 A: soundToAdd/452....
Das ist das Muster. Wenn kein erfolgreicher Aufruf von ffmpeg vorangeht, funktioniert das Lesen wie erwartet. Nach jedem weiteren erfolgreichen ffmpeg-Aufruf werden Zeichen am Zeilenanfang weggelassen: 36 Zeichen zu Beginn, dann 37, 38, 39 ...
Der entscheidende Punkt ist, dass, wenn ffmpeg nach einem „erfolgreichen“ Lesevorgang (aufgrund eines anderen Problems) fehlschlägt, der folgende „Lesevorgang“ wie erwartet funktioniert.
FAZIT: Ein erfolgreicher ffmpeg-Aufruf führt zu einem Lesefehler bei der nächsten Iteration durch die Schleife.
Warum passiert das und wie kann ich es stoppen?
Hier ist mein Code: ...
# Loop through lines in the merge file
IT_COUNT=1
while read MERGE_LINE
do
echo "LINE " $IT_COUNT
((IT_COUNT+=1))
echo $MERGE_LINE # testing use
read VID_FILE AUD_FILE DURATION <<< "$MERGE_LINE" # Get the data from each line
echo "V: $VID_FILE A: $AUD_FILE D: $DURATION" # testing use
....
# add audio to video
ffmpeg -i $VID_FILE -i $AUD_FILE -filter_complex "aevalsrc=0:d=$AUD_SHIFT[s1];[s1][1:a]concat=n=2:v=0:a=1[aout]" -c:v copy -map 0:v -map [aout] $FILE_OUT -hide_banner
done <$MERGE_FILE
Danke fürs Anschauen!
Antwort1
-nostdin
Option in verwenden ffmpeg
. VonFFmpeg-Dokumentation:
Aktivieren Sie die Interaktion auf der Standardeingabe. Standardmäßig aktiviert, sofern nicht die Standardeingabe als Eingabe verwendet wird. Um die Interaktion explizit zu deaktivieren, müssen Sie angeben
-nostdin
.Das Deaktivieren der Interaktion mit der Standardeingabe ist beispielsweise nützlich, wenn sich ffmpeg in der Gruppe der Hintergrundprozesse befindet. Mit lässt sich ungefähr das gleiche Ergebnis erzielen,
ffmpeg ... < /dev/null
allerdings ist dafür eine Shell erforderlich.
Antwort2
Sie haben wahrscheinlich Recht, dass ffmpeg wahrscheinlich Ihre Eingabe liest, wer weiß, warum. Leiten Sie den Befehl also einfach auf „Lesen von“ um /dev/null
, d. h. fügen Sie ihn der ffmpeg-Zeile hinzu </dev/null
.