ffmpeg는 while 루프에서 find를 사용하여 실수로 반복 변수를 변경합니다.

ffmpeg는 while 루프에서 find를 사용하여 실수로 반복 변수를 변경합니다.

누군가 여기서 무슨 일이 일어나고 있는지 나에게 설명해 줄 수 있습니까? 이것이 내 상황을 다음과 같이 단순화한 방법입니다.

# make 20 test gifs out of the same source file.
for i in {1..20}; do cp -p ../some-random-source-file.gif "${i}.gif"; done

# grab, then process them.
while read f; do echo "→ $f"; ffmpeg -i "$f"  -y  -loglevel quiet  "same.mp4"; done < <(find .  -maxdepth 1  -type f  -iname "*.gif"  -printf "%f\n")
→ 11.gif
→ .gif
→ 9.gif
→ .gif
→ 14.gif
→ 9.gif
→ 0.gif
→ 13.gif
→ 7.gif
→ 5.gif
→ 2.gif
→ .gif
→ 3.gif
→ 0.gif
→ 16.gif
→ .gif
→ 8.gif
→ 8.gif
→ .gif
→ 4.gif

혼합 파일(gif 및 비gif)이 포함된 디렉터리의 모든 gif를 처리하려고 합니다. 그러나 어떤 이유로 해당 ffmpeg단계를 추가하면 변수의 내용이 $f처음에 잘리는 경우가 있습니다.


추가 정보:

  • 작동하지 않는 파일도 로깅하고 있기 때문에 프로세스 교체를 사용하고 있습니다.if ! ffmpeg …; then FAILED+=("$f"); fi
  • 또한 문자열 교체를 통해 새 파일 이름을 생성했지만 ${f%.gif}.mp4... 알고 보니 해당 부분은 문제 발생과 관련이 없었습니다.
  • 배쉬 버전 5.1.16

프로세스 대체를 이해합니다.타이밍 문제가 발생할 수 있음- 그런데 왜 변수를 무작위로 잘라내는 걸까요?처음에그리고 마지막이 아닌가? 구조가 그렇게 신뢰할 수 없다면 누가 그것을 사용할 수 있겠는가? 내가 또 무엇을 할 수 있나요?

답변1

ffmpeg기본적으로 stdin을 읽으므로 일부 문자가 사용됩니다. 플래그를 추가해야 합니다 -nostdin.

ffmpeg -nostdin -i "$f"  -y  -loglevel quiet

관련 정보