
Я прохожусь по текстовому файлу, используя '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
.