FFmpeg를 사용하여 이미지에서 비디오를 만드는 방법은 무엇입니까?


86

그것은 사용할 수 있습니다 ffmpeg수가 0에서 시작하지 않는 한 세트의 시퀀스에서 비디오를 만들?

예를 들어 일부 이미지 [test_100.jpg, test_101.jpg, test_102.jpg, ..., test_200.jpg]가 있고 비디오로 변환하고 싶습니다. 다음 명령을 시도했지만 작동하지 않습니다 (숫자가 0에서 시작해야합니다).

ffmpeg -i test_ % d.jpg -vcodec mpeg4 test.avi

조언이 있습니까?


이 질문을한지 오래되었지만 질문에 여전히 관심이 있다면 대답은 예입니다. 자세한 내용과 예를 아래에 게시했습니다. stackoverflow.com/a/12160155/181638
Assad Ebrahim

@casperOne은 이것이 주제가 아닌 이유를 이해하는 데 유용합니다. 특정 프로그래밍 문제처럼 보입니다. FFmpeg 태그는 팔로워가 3.7k이고, 조회수가 27k 인 사람들이 분명히 유용하다고 생각합니다.
geotheory

2
@geotheory 태그 통계는 관련이 없습니다. ffmpeg는 WinRar와 같은 방식의 프로그램 입니다. ffmpeg라이브러리 에 대해 프로그래밍 할 수는 있지만 이 질문은 아닙니다. 명령 행에서 ffmpeg 사용 은 주제 에 관한 수퍼 유저 에게 요청됩니다 .
casperOne

답변:


81

-start_number스위치를 다음과 같이 사용하는 경우 파일 이름을 바꿀 필요가 없습니다 .

ffmpeg -start_number n -i test_%d.jpg -vcodec mpeg4 test.avi

n스틸 시퀀스의 시작은 어디 입니까?

시퀀스가 시작되면 끊어지지 않는 한 작동합니다. 간격이 있고 모든 스틸을 포함하려면 간격을 채우기 위해 번호를 다시 매길 필요가 있습니다.

유용한 다른 스위치가 있습니다.

다음의 한 줄을 사용하여 프레임 속도를 낮추고 이미지를 압축하고 결과 비디오의 크기를 줄입니다.

ffmpeg.exe -f image2 -framerate 25 -pattern_type sequence -start_number 1234 -r 3 -i Imgp%04d.jpg -s 720x480 test.avi

-r 3옵션은 결과 비디오의 프레임 속도를 초당 3 프레임으로 설정하여 짧은 시간 동안 각각의 스틸을 볼 수 있습니다. 이 -s옵션은 결과 비디오의 크기를 관리하기 위해 사진을 원하는 해상도로 조정합니다.

(Windows 셸에서 교체 -i Imgp%04d.jpg-i "Imgp%%04d.jpg". 신용이를 위해 마이크 피츠 패트릭에 https://superuser.com/a/344178/153054 )


4
-r과 -framerate의 차이점은 무엇입니까?

1
그들은 같은 IIRC있어
rogerdpack

22
'ls'에 표시되는 순서를 받아들이는 한 넌센스에 번호를 매길 필요가 없습니다 ... 사용 : ffmpeg -pattern_type glob -i '* .jpg'movie.mp4
Orwellophile

2
이미지 사이 의 시간 간격 을 제어하는 ​​스위치가 있습니까? 예를 들어, 첫 번째 이미지 13s, 두 번째 15s, 24s는 세 번째 시간, 사용자 정의 시간을 표시하고 싶습니다. 가능합니까?
zionpi


38

아래 코드 스 니펫을 사용할 수 있습니다.

 cat *.jpg | ffmpeg -f image2pipe -r 1 -vcodec mjpeg -i - -vcodec libx264 out.mp4

메타 데이터에 명시된 회전으로 JPG를 회전시키지 않습니다.
Erik Johansson 8

17

ffmpeg 문서 에서 예제 스크립트를 찾을 수 있습니다 .

3.2 단일 사진을 동영상으로 어떻게 인코딩합니까?

이름을 바꿀 사진이 많은 경우 다음 명령을 사용하여 부담을 줄일 수 있습니다. Bourne 쉘 구문을 사용하는 명령은 * jpg와 일치하는 현재 디렉토리의 모든 파일을 /tmp' directory in the sequence ofimg001.jpg ',`img002.jpg'등과 심볼릭 링크합니다 .

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done

그런 다음 다음을 실행하십시오.

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg

2
이미지 이름의 시작 img000.jpg가 ffmpeg가 기대하는 것이므로 x = 0으로 시작하는 것이 좋습니다. 또한 ffmpeg가 파일을 찾을 수 없으므로 cp를 대신 사용해야했기 때문에 symlinking이 작동하지 않았습니다 (명백한 속도와 공간이 필요하지만 어쨌든 rm을 사용합니다). mv는 원본을 잃어 버리지 않아도 작동합니다.

이 답변에서 제공된 명령은 심볼릭 링크가 아닌 하드 링크를 만듭니다. cp연결이 작동하지 않는 경우 의 사용과 관련 하여 파일 시스템이 지원하는 경우 cp --reflink=auto속도 / 공간 사용이 훨씬 향상됩니다.
Félix Saparelli 2016 년

12

에서 는 FFmpeg의 문서 :

글로브 패턴 사용

ffmpeg는 bash 스타일 globbing도 지원합니다 (*는 임의의 수의 문자를 나타냄).

이미지가 순차적이지만 이전 예제에서와 같이 반드시 숫자 순서로되어 있지 않은 경우에 유용합니다.

ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4

따라서 파일이 정렬되어 -pattern_type glob있으면 스위치를 사용하는 것이 좋습니다.


이 글로브는 일반 쉘 글로브보다 더 제한적입니다. 이미지 유형이 확장자에서 추론 되었기 때문에 trac.ffmpeg.org/ticket/3620으로 보입니다.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

11

내가 아는 한, 임의의 숫자로 시퀀스를 시작할 수 없습니다 (0 또는 1에서 시작 해야하는지 기억하지 못합니다). 또한 간격이있을 수 없습니다. 그렇다면 ffmpeg는 시퀀스가 ​​끝났다고 가정합니다. 더 이상 이미지 추가를 중지하십시오.

또한, 내 답변에 대한 의견에 명시된 바와 같이 색인 너비를 지정해야합니다. 처럼:

image % 03d.jpg

% 03d 인덱스 유형을 사용하는 경우 다음과 같이 파일 이름을 0으로 채워야합니다.

image001.jpg image002.jpg image003.jpg

기타


1
이미지 파일 이름 앞에 0이 있으면 형식 문자열도 "% 03d"와 같이 너비를 지정해야합니다.

1
이것이 유일한 장애물이라면 이미지를 이름을 바꾸거나 심볼을 올바르게 색인을 다시 설정하는 스크립트를 작성할 수 있습니다.
Cascabel

1
예, 전에이 작업을했습니다. 루비에서 얼마 전에 instance.addImage (), instance.processVideo ()를 호출 한 래퍼를 작성했으며 임시 디렉토리를 만들고 적절한 색인으로 이미지를 복사 / 이름 바꾸기 비디오를 만듭니다. 아주 쉽습니다.

@Jefromi 심볼릭 링크를 만들었지 만 심볼릭 링크 파일의 경로를 ffmpeg로 지정하려면 어떻게합니까? symlink 파일이 변환하려고하는 이미지라고 가정합니다. 나는 win7 btw에있다

시퀀스는 0에서 4까지의 범위에서 시작할 수 있습니다.
Assad Ebrahim

5

나는 Francisco에 동의하지만 해결 방법으로 빠른 스크립트를 작성하여 ffmpeg에 필요한 시퀀스 번호로 파일에 대한 심볼릭 링크를 이동하거나 만들 수 있습니다. 그런 다음 스크립트는 ffmpeg를 호출 한 다음 링크를 제거하거나 파일을 원래 위치로 다시 이동할 수 있습니다.


1

찾다

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i"
/tmp/img"$counter".jpg; x=$(($x+1)); done

1

나는 이것이 오래된 질문이라는 것을 알고 있지만 동일한 대답을 찾는 동안 Google에서 그 질문을 발견했습니다. 여기에 대한 답변 중 어느 것도 나를 완전히 만족시키지 못했기 때문에 더 많은 검색과 읽기를 수행했으며 이것은 내 자신의 문제에 대한 명령입니다.

cat {0032..1501}*.png | ffmpeg -f image2pipe -framerate 5 -i - -s 720x480 test2.avi

내가 이런 명령을 사용하는 이유는 ...

  1. Cat 및 -f image2pipe를 사용하면 사용하는 이미지를보다 세밀하게 제어 할 수 있습니다. 예를 들어 대괄호 확장과 같은 bash 기능과 grep과 같은 다른 명령을 사용하여 원하는 결과를 미세 조정할 수 있습니다.
  2. 기억해야 할 스위치가 적습니다.
  3. -r을 사용하지 말고 대신 -framerate를 사용하는 것이 좋습니다. 내 경험상 -r은 프레임을 더 자주 드롭하는 경향이 있습니다.
  4. 덜 복잡하고 불필요한 스위치를 사용하지 않으며 그대로 작동합니다. 필요에 따라 더 복잡한 (예 : 인코더 지정) 및 미세 조정을 추가 할 수 있습니다.

OP의 질문에 -start_number필요한 것이 전부입니다.
Gyan

0

내 비디오가 플래시 플레이어 (Jwplayer)에 들어가기 때문에 flv 인코더를 사용했습니다.

ffmpeg -i % d.jpg -vcodec flv test.flv


0

로부터 문서 , 당신이 간단하게 사용할 수있는 것 같다 *

For example, for creating a video from filenames matching the glob pattern foo-*.jpeg:

ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi

참고로 품질에 미치는 영향을 개선하려면 속도 / fps가 중요 할 수 있습니다 (예 : 먼저 매우 낮은 / 높은 프레임 속도를 지정한 다음 두 번째 필터를 통과하여 슬로우 모션 비디오를 정상으로 만들 수 있습니까?).


0

필자의 경우 파일의 숫자 때문에 조금 까다 롭습니다. 내 이미지의 모양은 다음과 같습니다.

$ ls | head -5
2014_aq_unprocessed 001.jpg
2014_aq_unprocessed 002.jpg
2014_aq_unprocessed 003.jpg
2014_aq_unprocessed 004.jpg
2014_aq_unprocessed 005.jpg

내가 사용한 명령은 다음과 같습니다.

ffmpeg -i 2014_aq_unprocessed\ %3d.jpg  -vcodec mpeg4 test.avi

0

당신은 이것을 할 수 있습니다 convert -morph:

convert *.jpg -delay 10 -morph 10 %05d.jpg

당신이 사용하고 싶다면 ffmpeg, 나는

ffmpeg -pattern_type glob -i '*.jpg' -vf "setpts=10*PTS" movie.mp4

여기서 10*PTSffmpeg가 10 배 느리게합니다. 속도를 높이기 위해 분수를 사용할 수도 있습니다.


이것은 원래 이미지 시퀀스를 새로운 공간으로 보간하는 것이며 OP 요청과 같은 비디오 파일을 생성하지 않습니다.
f0ster

0

-pattern_type glob 오디오가 포함 된 구체적인 예

이 옵션은 https://superuser.com/a/782520/128124 에서 언급 되었지만 다음은 출력 비디오에 오디오를 추가하는 등 몇 가지 구체적인 사용 예입니다.

초당 하나의 이미지로 슬라이드 쇼 비디오

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
  -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

이미지가 끝날 때 오디오가 끊어지면 음악을 추가하십시오.

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

YouTube의 두 가지 데모는 다음과 같습니다.

히피가되어 Theora의 특허를받지 않은 비디오 형식을 사용하십시오 .

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libtheora -r 30 -pix_fmt yuv420p out.ogg

이미지는 물론 알파벳순으로 정렬해야합니다.

0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg

등등.

참조 : http://unix.stackexchange.com/questions/68770/converting-png-frames-to-video-at-1-fps/339399#339399

30 FPS에서 프레임 당 하나의 이미지가있는 표준 속도 비디오

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -c:v libx264 -pix_fmt yuv420p out.mp4

그 모습은 다음과 같습니다.

GIF로 생성 : https://askubuntu.com/questions/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574

그것에 오디오를 추가하십시오 :

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -i audio.ogg -c:a copy -shortest -c:v libx264 -pix_fmt yuv420p out.mp4

결과 : https://www.youtube.com/watch?v=HG7c7lldhM4

하나의 음악 파일을 YouTube 업로드 용 고정 이미지가있는 비디오로 변환

답변 : MP3를 유튜브 허용 비디오 형식으로 변환하는 방법?

합성 테스트 입력 이미지 구하기

이 답변에서 사용한 테스트 이미지는 다음과 같습니다.

wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg

https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292로 생성 된 이미지

특수 알고리즘을 사용하여 프레임 전체를 압축 할 수 있기 때문에 비디오가 ZIP보다 이미지 시퀀스를 얼마나 잘 압축하는지 관찰하는 것이 좋습니다.

  • opengl-rotating-triangle.mp4: 340K
  • opengl-rotating-triangle.zip: 7.3M

CLI 옵션 정보

이름에도 불구하고 있다는 그러나 참고 -glob예를 들어,이 쉘 글롭의 재잘만큼 일반되지 않습니다 : -i '*'실패 https://trac.ffmpeg.org/ticket/3620를 (파일 형식은 확장에서 도출되는 분명히 있기 때문에).

-r 30-framerate 1낮은 프레임 속도에 대해 VLC와 같은 플레이어의 버그를 극복하기 위해 비디오 30 FPS를 만듭니다 : https : //.com ffmpeg / 41797724 # 41797724 따라서 각 프레임을 30 번 반복하여 원하는 초당 이미지 1 개 효과를 유지합니다.

다음 단계

또한 다음을 원할 것입니다.

TODO : 명령 줄에서 여러 오디오 파일을 잘라내어 비디오로 연결하는 방법을 배웁니다.

에 테스트

ffmpeg 3.4.4, vlc 3.0.3, 우분투 18.04.

서지

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.