1

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

Тем не менее, я получаю странный результат, как только я добавляю в основу своей процедуры - вызов ffmpeg для объединения потоков аудио и видео, представленных именами файлов. Последовательные операции чтения опускают ведущие символы в строке. Я читал здесь, что вызовы ввода 'read' внутри цикла 'while read' могут вызвать проблемы, и мне интересно, что вызов ffmpeg делает что-то, что сбивает с толку bash, но это кажется маловероятным и странным! NB: Я не очень понимаю вызов 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  

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

2 ответа2

3

Используйте параметр -nostdin в ffmpeg . Из документации FFmpeg:

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

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

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .