«while read» цикл по строкам в текстовом файле теряет символы в скрипте Bash. виновата ли строка FFmpeg?

«while read» цикл по строкам в текстовом файле теряет символы в скрипте Bash. виновата ли строка FFmpeg?

Я прохожусь по текстовому файлу, используя 'while read'. Я считываю три переменные из каждой строки - два имени файла и десятичное число. Я знаю, что это работает в ванильных настройках (цикл, чтение строки, эхо-строка, извлечение переменных, ничего больше), потому что я тестировал это на своем входном файле.

Однако я получаю странный результат, как только добавляю суть своей процедуры — вызов ffmpeg для объединения аудио- и видеопотоков, представленных именами файлов. Последовательные операции «чтения» опускают начальные символы из строки. Я читаюздеськоторый вызывает ввод «чтения» в цикле «пока читает» может вызвать проблемы, и интересно, не делает ли вызов ffmpeg что-то, что сбивает с толку bash, но это кажется маловероятным и странным! Примечание: я не совсем понимаю вызов ffmpeg — я получил его из ответа на другой вопрос.

Любая помощь будет оценена по достоинству!

Первое «чтение» работает так, как и ожидалось (и команда ffmpeg завершается):

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

Второе «чтение» теряет 36 символов с начала строки (и команда ffmpeg завершается ошибкой, поскольку файл, представленный переменной V, которая принимает первый элемент строки, не указывает на файл):

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...

Третье «чтение» работает так, как и ожидалось (и команда ffmpeg завершается):

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...

Четвертое «чтение» теряет 37 символов (на один больше, чем предыдущее) с начала строки (и команда ffmpeg завершается ошибкой):

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....

Вот шаблон. Если перед ним не стоит успешный вызов ffmpeg, то 'read' работает как и ожидалось. После каждого успешного вызова ffmpeg символы в начале строки опускаются: сначала 36 символов, затем 37, 38, 39...

Решающим фактором является то, что когда ffmpeg дает сбой после «успешного» чтения (из-за другой проблемы), следующее «чтение» работает так, как и ожидалось.

ВЫВОД: успешный вызов ffmpeg приводит к ошибке чтения на следующей итерации цикла.

Почему это происходит и как это остановить?

Вот мой код: ...

# 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  

Спасибо за внимание!

решение1

Использовать -nostdinопцию в ffmpeg. ОтДокументация FFmpeg:

Включить взаимодействие на стандартном вводе. Включено по умолчанию, если стандартный ввод не используется в качестве ввода. Чтобы явно отключить взаимодействие, необходимо указать -nostdin.

Отключение взаимодействия на стандартном вводе полезно, например, если ffmpeg находится в группе фоновых процессов. Примерно того же результата можно добиться с помощью , ffmpeg ... < /dev/nullно для этого требуется оболочка.

решение2

Вы, вероятно, правы, ffmpeg, вероятно, считывает данные из вашего ввода, кто знает почему, поэтому просто перенаправьте эту команду на чтение из /dev/null, т. е. добавьте в строку ffmpeg </dev/null.

Связанный контент