막혔어요...몇 분마다 웹캠에서 사진을 다운로드하는 스크립트를 한동안 사용해 왔습니다. 명명 규칙은 다음과 같았고 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' …