ffmpeg -pattern_type glob - 파일이 올바른 순서로 로드되지 않았습니다.

ffmpeg -pattern_type glob - 파일이 올바른 순서로 로드되지 않았습니다.

막혔어요...몇 분마다 웹캠에서 사진을 다운로드하는 스크립트를 한동안 사용해 왔습니다. 명명 규칙은 다음과 같았고 new_image((len(files(dir))+1) + '.jpg')모든 것이 괜찮았습니다...오늘까지는...

이미지를 로드하는 Python 스크립트가 있습니다.생성일 기준OpenGL 데이터를 가져와서 영화에 덤프합니다. 어렵지도 않고 모든 것이 괜찮습니다. 지금을 제외하면 수천 개의 이미지가 있고 이런 식으로 계속하는 것은 다소 비효율적입니다(멋지더라도) 나만의 GUI와 오버레이 등을 만들 수 있기 때문입니다.).. 어쨌든 저는 ffmpeg를 사용하여 다음과 같이 이미지를 슬라이드쇼로 결합하고 있습니다.

ffmpeg -f image2 -r 25 -pattern_type glob -i '*.jpg' -qscale 3 -s 1920x1080 -c:v wmv1 video.wmv

ffmpeg는 잘 작동하지만 이름이 지정된 순서대로 이미지를 가져오는 것은 작동하지 않습니다. 파일이 아래와 -pattern_type glob유사한(동일하지는 않더라도) 방식으로 얻어지기 때문입니다 .ls

user@host:/storage/photos$ ls
0.jpg     1362.jpg  1724.jpg  2086.jpg  2448.jpg  280.jpg   3171.jpg  3533.jpg  3896.jpg  4257.jpg  4619.jpg  4981.jpg  5342.jpg  5704.jpg  6066.jpg  650.jpg
1000.jpg  1363.jpg  1725.jpg  2087.jpg  2449.jpg  2810.jpg  3172.jpg  3534.jpg  3897.jpg  4258.jpg  461.jpg   4982.jpg  5343.jpg  5705.jpg  6067.jpg  651.jpg

0, 1000, 1, 2000, 2...그게 논리 ls이므로 이미지 시퀀스(시간 경과)가 모두 처리됩니다..

ffmpeg를 사용하여 보다 정돈된 방식으로 이미지를 로드하는 방법에 대한 아이디어가 있습니까?

답변1

ffmpeg는 동일한 파일 형식을 연결합니다

다음과 같은 명령을 사용하여 원하는 방식으로 파일 목록을 연결할 수 있습니다.

ffmpeg -f concat -i <( for f in *.wav; do echo "file '$(pwd)/$f'"; done ) \
         output.wav

위의 방법은 연결하려는 파일이 모두 동일한 코덱인 경우에만 작동합니다. 예를 들어, 모두 .wav 또는 .mpg여야 합니다.

노트:concat demuxer를 사용하려면 ffmpeg v1.1 이상이 필요합니다. 위의 예와 이 기술을 사용하여 다양한 코덱을 연결하는 방법에 대해 자세히 알아볼 수 있습니다.ffmpeg 웹 사이트.

printf 포맷터를 사용하는 ffmpeg

FFmpeg는 printf 포맷터(예: )를 사용할 수도 있습니다 %d. 이는 0부터 시작하여 순차적으로 위쪽으로 올라가는 숫자와 일치합니다. 숫자가 000 - 099와 같은 구조로 구성된 경우 %03d제로 패딩을 사용하여 일련의 3자리 숫자를 나타내는 이 포맷터를 사용할 수 있습니다.

그래서 당신은 이것을 할 수 있습니다 :

ffmpeg -r 25 -i %d.png -qscale 3 -s 1920x1080 -c:v wmv1 video.wmv

위의 내용은 나에게 적합하지 않으며 ffmpeg이 옵션에 대해 불평하고 있습니다 -c:v. 방금 옵션을 생략했는데 해당 버전의 명령이 예상대로 작동했습니다.

ffmpeg -r 25 -i %d.png -qscale 3 -s 1920x1080 video.wmv

답변2

가장 쉬운 방법은 이 rename도구를 사용하여 앞에 0이 붙은 짧은 파일 이름을 바꾸는 것입니다. 그러나 두 가지 표준 이름 바꾸기 도구가 있습니다. 제가 설명하는 도구는 Perl 프로그래머 참조 가이드의 매뉴얼 페이지에서 가져온 것입니다. 이것은 Debian 및 그 파생 배포판의 버전입니다.

rename 's/^/000/' [0-9].jpg
rename 's/^/00/' [0-9][0-9].jpg
rename 's/^/0/' [0-9][0-9][0-9].jpg

그런 다음 glob을 사용하여 파일 이름을 올바르게 마샬링해야 합니다.

그러나 파일 이름을 바꾸고 싶지 않은 경우 glob은 숫자가 아닌 사전식으로 확장되므로 사용할 수 없습니다.

따라서 glob을 사용하지 마십시오. 이를 제거 -pattern_type glob하고 -i %d.jpg대신 사용하십시오 -i *.jpg. 이것은 숫자 모드를 사용하며 빠른 테스트에서 원하는 작업을 수행합니다.

답변3

가장 좋은 방법은 파일 이름을 바꾸어 모두가 동일한 비트 수를 갖도록 하는 것입니다. zsh 사용( 4최대 자릿수):

autoload zmv     # put this in your ~/.zshrc
zmv '(<->).jpg' '${(l:4::0:)1}.jpg'

다른 셸 사용( 0파일 이름이 4자보다 길면 필요에 따라 '를 추가하세요):

for x in [0-9].jpg; do mv "$x" "000$x"; done
for x in [0-9][0-9].jpg; do mv "$x" "00$x"; done
for x in [0-9][0-9][0-9].jpg; do mv "$x" "0$x"; done

파일 이름을 바꿀 수 없는 경우 다른 옵션은 다른 디렉터리에 심볼릭 링크를 만드는 것입니다. zsh 사용:

zmv -Ls '$PWD/(<->).jpg' '/somewhere/writable/${(l:4::0:)1}.jpg'

모든 쉘의 경우:

for x in [0-9].jpg; do ln -s "$PWD/$x" "/somewhere/writable/000$x"; done
for x in [0-9][0-9].jpg; do ln -s "$PWD/$x" "/somewhere/writable/00$x"; done
for x in [0-9][0-9][0-9].jpg; do ln -s "$PWD/$x" "/somewhere/writable/0$x"; done

또 다른 접근 방식은 기호 링크에 연속적인 숫자를 제공하는 것입니다. 원하는 순서로 심볼릭 링크를 생성하는 한 이 접근 방식은 원본 파일이 올바른 순서가 아닌 다른 경우에도 일반화될 수 있습니다. 10000에서 카운터를 시작하고 선행을 제거하는 것은 1선행 0이 있는 카운터를 얻는 편리한 방법입니다.

i=10000
for x in [0-9].jpg [0-9][0-9].jpg [0-9][0-9][0-9].jpg; do
  ln -s "$PWD/$x" /somewhere/writable/${i#1}.jpg
  i=$((i+1))
done

정말로 글을 쓰고 싶지 않다면 연속 -i옵션을 전달하고 파일 이름 길이를 늘릴 수 있습니다.

ffmpeg -pattern_type glob -i '[0-9].jpg' -i '[1-9][0-9].jpg' -i '[1-9][0-9][0-9].jpg' -i '[1-9][0-9][0-9][0-9].jpg' …

관련 정보