'mientras se lee' recorre líneas en un archivo de texto perdiendo caracteres en el script Bash. ¿Es la línea FFmpeg la culpable?

'mientras se lee' recorre líneas en un archivo de texto perdiendo caracteres en el script Bash. ¿Es la línea FFmpeg la culpable?

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 -nostdinla 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/nullpero 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.

información relacionada