
Estoy recorriendo un archivo de texto, usando "mientras se lee". Leí tres variables de cada línea: dos nombres de archivo y un número decimal. Sé que esto funciona en una configuración básica (bucle, línea de lectura, línea de eco, extracción de variables, nada más), porque lo he probado en mi archivo de entrada.
Sin embargo, obtengo un resultado extraño una vez que agrego la esencia de mi rutina, que es una llamada a ffmpeg para fusionar las transmisiones de audio y video representadas por los nombres de archivos. Las sucesivas operaciones de "lectura" omiten los caracteres iniciales de la línea. Yo leoaquíque requiere una entrada de 'lectura' dentro de un bucle 'mientras se lee' puede causar problemas, y me pregunto si la llamada a ffmpeg está haciendo algo que confunda a bash, ¡pero esto parece poco probable y extraño! NB: Realmente no entiendo la llamada ffmpeg; la obtuve de una respuesta a otra pregunta.
¡Cualquier ayuda sería apreciada!
La primera 'lectura' funciona como se esperaba (y el comando ffmpeg se completa):
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
La segunda 'lectura' pierde 36 caracteres desde el principio de la línea (y el comando ffmpeg falla porque el archivo representado por la variable V que toma el primer elemento de la línea no apunta a un archivo):
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...
La tercera 'lectura' funciona como se esperaba (y el comando ffmpeg se completa):
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...
La cuarta 'lectura' pierde 37 caracteres (uno más que el último error) desde el principio de la línea (y el comando ffmpeg falla):
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....
Ese es el patrón. Cuando no está precedida por una llamada exitosa a ffmpeg, la 'lectura' funciona como se esperaba. Después de cada llamada sucesiva y exitosa a ffmpeg, se omiten caracteres desde el principio de la línea: 36 caracteres para empezar, luego 37, 38, 39...
El factor decisivo es que cuando ffmpeg falla después de una lectura "exitosa" (debido a otro problema), la siguiente "lectura" funciona como se esperaba.
CONCLUSIÓN: una llamada ffmpeg exitosa da como resultado un error de lectura en la siguiente iteración del ciclo.
¿Por qué sucede esto y cómo puedo detenerlo?
Aquí está mi código: ...
# 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
¡Gracias por mirar!
Respuesta1
Utilice -nostdin
la opción en ffmpeg
. Dedocumentación de FFmpeg:
Habilite la interacción en la entrada estándar. Activado de forma predeterminada a menos que se utilice una entrada estándar como entrada. Para deshabilitar explícitamente la interacción, debe especificar
-nostdin
.Deshabilitar la interacción en la entrada estándar es útil, por ejemplo, si ffmpeg está en el grupo de procesos en segundo plano. Se puede lograr aproximadamente el mismo resultado,
ffmpeg ... < /dev/null
pero requiere un caparazón.
Respuesta2
Probablemente tenga razón en que ffmpeg probablemente esté leyendo su entrada, quién sabe por qué, así que simplemente redirija ese comando para leer desde /dev/null
, es decir, agregarlo a la línea ffmpeg </dev/null
.