'읽는 동안'은 Bash 스크립트에서 문자가 손실되는 텍스트 파일의 줄을 반복합니다. FFmpeg 라인이 책임이 있습니까?

'읽는 동안'은 Bash 스크립트에서 문자가 손실되는 텍스트 파일의 줄을 반복합니다. FFmpeg 라인이 책임이 있습니까?

'읽는 동안'을 사용하여 텍스트 파일을 반복하고 있습니다. 각 줄에서 세 개의 변수(두 개의 파일 이름과 십진수)를 읽었습니다. 입력 파일에서 테스트했기 때문에 이것이 바닐라 설정(루프, 읽기 라인, 에코 라인, 변수 추출 등)에서 작동한다는 것을 알고 있습니다.

그러나 루틴의 핵심을 추가하면 파일 이름으로 표시되는 오디오 및 비디오 스트림을 병합하기 위해 ffmpeg를 호출하는 이상한 결과가 나타납니다. 연속적인 '읽기' 작업에서는 줄의 선행 문자가 생략됩니다. 나는 읽었다여기'읽는 동안' 루프 내에서 '읽기' 입력을 요구하는 것은 문제를 일으킬 수 있고, 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자를 잃습니다(그리고 줄의 첫 번째 항목을 취하는 변수 V로 표시되는 파일이 파일을 가리키지 않기 때문에 ffmpeg 명령이 실패합니다).

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에 대한 성공적인 호출이 선행되지 않으면 '읽기'가 예상대로 작동합니다. 연속적으로 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.

관련 정보