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


164
ffmpeg -r 1/5 -start_number 2 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

이 줄은 정상적으로 작동했지만 다른 폴더의 이미지에서 비디오 파일을 만들고 싶습니다. 내 폴더의 이미지 이름은 다음과 같습니다.

img001.jpg
img002.jpg
img003.jpg
...

다른 폴더에서 이미지 파일을 어떻게 입력 할 수 있습니까? 예:C:\mypics

이 명령을 시도했지만 ffmpeg첫 번째 이미지 (img001.jpg)로만 비디오를 생성했습니다.

ffmpeg -r 1/5 -start_number 0 -i C:\myimages\img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

답변:


167

이미지에서 비디오 슬라이드 쇼 만들기 – FFmpeg를 참조하십시오.

비디오에 프레임이 올바르게 표시되지 않는 경우 첫 번째 이미지를 건너 뛰거나 한 프레임에만 표시되는 등의 문제가 발생 하면 출력 프레임 속도 에 -r 대신 fps 비디오 필터 를 사용하십시오

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4

또는 "fps = 25, format = yuv420p" 와 같이 -pix_fmt yuv420p 를 대체하기 위해 형식 비디오 필터를 필터 체인에 추가 할 수 있습니다 . 이 방법의 장점은 어떤 필터를 먼저 제어 할 수 있다는 것입니다

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" out.mp4

나는 아래 매개 변수를 테스트했는데 그것은 나를 위해 일했다.

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -vf "fps=25,format=yuv420p" e:\out.mp4

아래 매개 변수도 작동했지만 항상 첫 번째 이미지를 건너 뜁니다.

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -r 30 -pix_fmt yuv420p e:\out.mp4

다른 폴더에있는 이미지로 비디오 만들기

먼저 아래와 같이 imagepaths.txt 에 이미지 경로를 추가하십시오 .

# this is a comment details https://trac.ffmpeg.org/wiki/Concatenate

file 'E:\images\png\images__%3d.jpg'
file 'E:\images\jpg\images__%3d.jpg'

다음과 같은 샘플 사용법;

"h:\ffmpeg\ffmpeg.exe" -y -r 1/5 -f concat -safe 0 -i "E:\images\imagepaths.txt" -c:v libx264 -vf "fps=25,format=yuv420p" "e:\out.mp4"

-safe 0 매개 변수로 안전하지 않은 파일 이름 오류 방지

관련된 링크들

FFmpeg 다른 폴더에있는 이미지로 비디오 만들기

FFMPEG 중간 가이드 / 이미지 시퀀스

연결 – FFmpeg


"비디오에 프레임이 올바르게 표시되지 않는 경우 첫 번째 이미지를 건너 뛰거나 한 프레임에만 표시되는 등의 문제가 발생하면 대신 fps 비디오 필터를 사용하십시오" 죄송하지만 "fps"의 의미를 설명 할 수 있습니까? 비디오 필터 "정확히?
arnuschky

3
내가 아는 한 –r 매개 변수가 가변 프레임 속도 인 경우 FFMPEG가 원하는 출력 프레임 속도를 달성하기 위해 프레임을 삭제하거나 복제 할 수 있습니다. fps 필터 "-vf fps = value"를 사용하면 FFMPEG가 일정한 프레임 속도를 생성하도록합니다. 참조 이미지에서 비디오 슬라이드 쇼 만들기 -는 FFmpeg을 ,이 -r과 FPS 필터 사이의 (기술)의 차이점은 무엇입니까? . 따라서 -r 매개 변수를 사용하면 때때로 첫 번째 이미지를 건너 뛰게됩니다.
khan

이 목록의 첫 번째 명령은 ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4작동하는 것 같았지만 결국 모든 플레이어 (Ubuntu)에서 읽을 수없는 비디오가 생겼습니다. VNC는 "무브 원자를 찾을 수 없다"고 말했다. 이 문제를 해결하려고 시도하면 qt-faststart"파일의 마지막 원자는
무빙

149

-pattern_type glob

이 훌륭한 옵션을 사용하면 많은 경우 이미지를 쉽게 선택할 수 있습니다.

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

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

등등.

또한 첫 번째 가능성으로 그들을 자르기에 의해, 모든 이미지는 동일한 화면 비율을 사용할 수 있도록 할 imagemagick또는 nomacs 그는 FFmpeg 어려운 결정을 내려야하지 않도록 미리. 특히, 너비는 2로 나눌 수 있어야합니다. 그렇지 않으면 "2를 나눌 수없는 너비"로 변환에 실패합니다.

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

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

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

GIF로 생성 : /ubuntu/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

다음은 제가 사용한 테스트 미디어입니다.

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

다음으로 생성 된 이미지 : 하는 방법 GLUT / OpenGL을 파일로 렌더링에 사용하는 방법?

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

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

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

답변 : /superuser/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572

전체 현실적인 슬라이드 쇼 사례 연구 설정 단계별

단일 ffmpeg 명령을 실행하는 것보다 슬라이드 쇼를 만드는 것이 조금 더 많으므로 여기에 더 흥미로운 자세한 예가 있습니다. 에서이 타임 라인에서 영감을 얻은 있습니다.

입력 미디어를 가져옵니다.

mkdir -p orig
cd orig
wget -O 1.png https://upload.wikimedia.org/wikipedia/commons/2/22/Australopithecus_afarensis.png
wget -O 2.jpg https://upload.wikimedia.org/wikipedia/commons/6/61/Homo_habilis-2.JPG
wget -O 3.jpg https://upload.wikimedia.org/wikipedia/commons/c/cb/Homo_erectus_new.JPG
wget -O 4.png https://upload.wikimedia.org/wikipedia/commons/1/1f/Homo_heidelbergensis_-_forensic_facial_reconstruction-crop.png
wget -O 5.jpg https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Sabaa_Nissan_Militiaman.jpg/450px-Sabaa_Nissan_Militiaman.jpg
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg
cd ..

# Convert all to PNG for consistency.
# /unix/29869/converting-multiple-image-files-from-jpeg-to-pdf-format
# Hardlink the ones that are already PNG.
mkdir -p png
mogrify -format png -path png orig/*.jpg
ln -P orig/*.png png

이제 최종 이미지 비율을 결정하기 위해 모든 이미지 크기를 간단히 살펴 보겠습니다.

identify png/*

어떤 출력 :

png/1.png PNG 557x495 557x495+0+0 8-bit sRGB 653KB 0.000u 0:00.000
png/2.png PNG 664x800 664x800+0+0 8-bit sRGB 853KB 0.000u 0:00.000
png/3.png PNG 544x680 544x680+0+0 8-bit sRGB 442KB 0.000u 0:00.000
png/4.png PNG 207x238 207x238+0+0 8-bit sRGB 76.8KB 0.000u 0:00.000
png/5.png PNG 450x600 450x600+0+0 8-bit sRGB 627KB 0.000u 0:00.000

따라서 클래식 480p (640x480 == 4/3) 종횡비가 적절 해 보입니다.

너비를 균일하게 만들기 위해 최소 크기 조정으로 한 번의 변환을 수행하십시오 (TODO는 모든 너비에 대해 자동화합니다. 여기서 수동으로 identify출력을 보고 너비와 높이를 하나씩 줄였습니다).

mkdir -p raw
convert png/1.png -resize 556x494 raw/1.png
ln -P png/2.png png/3.png png/4.png png/5.png raw
ffmpeg -framerate 1 -pattern_type glob -i 'raw/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p raw.mp4

다음과 같이 끔찍한 출력이 생성됩니다.

ffprobe raw.mp4

ffmpeg는 첫 번째 이미지의 크기 인 556x494를 가져온 다음 다른 모든 이미지를 정확한 크기로 변환하여 가로 세로 비율을 깨뜨립니다.

이제 ImageMagick에 따라 자르면서 이미지를 대상 480p 종횡비로 자동 변환 해 보겠습니다 . 이미지를 특정 종횡비로 최소화하는 방법은 무엇입니까?

mkdir -p auto
mogrify -path auto -geometry 640x480^ -gravity center -crop 640x480+0+0 png/*.png
ffmpeg -framerate 1 -pattern_type glob -i 'auto/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p auto.mp4

이제 종횡비는 좋지만 필연적으로 일부 자르기를 수행해야했기 때문에 이미지의 흥미로운 부분을 잘라 냈습니다.

다른 옵션은 다음과 같은 화면비를 갖도록 검은 색 배경으로 채 웁니다. 상자에 맞게 크기를 조정하고 "빈"부분에서 배경을 검은 색으로 설정합니다

mkdir -p black
ffmpeg -framerate 1 -pattern_type glob -i 'black/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p black.mp4

일반적으로 말해서, 처음에는 이러한 문제를 피하기 위해 동일하거나 유사한 종횡비를 가진 이미지를 선택하는 것이 이상적입니다.

CLI 옵션 정보

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

-r 30차종 -framerate 1: 동영상 30 FPS 낮은 프레임 속도에 대한 VLC 같은 선수 버그를 극복하기 위해 VLC가 FFmpeg를 가진 이미지로부터 생성 낮은 1 FPS 비디오의 정지 따라서는 두번째 효과 당 1 명 화상을 원하는 유지 프레임마다 30 회 반복한다.

다음 단계

당신은 또한 원할 것입니다 :

TODO : 중간 파일없이 여러 개의 오디오 파일을 잘라내어 비디오로 연결하는 방법을 배웁니다.

에 테스트

ffmpeg 3.4.4, vlc 3.0.3, 우분투 18.04.

서지


pympeg를 시작하기 위해 python 및 subprocess.call을 사용하는 '경우 입력 및 출력 파일 이름에 작은 따옴표 를 사용하지 않아야 합니다. 그렇지 않으면 파일을 찾을 수 없습니다.
RunOrVeith

이것은 나에게 좋을 것이지만 npm 패키지의 빌드는 ffmpeg-staticglob를 구현하지 않습니다. ( Pattern type 'glob' was selected but globbing is not supported by this libavformat build)
Sebi

-pix_fmt발생하는 Trailing options were found on the commandline.오류
안토니 홍콩

@AnthonyKong 지금 ffmpeg -framerate 1 -pattern_type glob -i '*.png' -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4Ubuntun 19.10 ffmpeg 4.1.4에서 재현 할 수 없었습니다. 버전과 정확한 명령은 무엇입니까?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

20

문서의 간단한 버전

Google 어스 스튜디오 이미지에 특히 효과적입니다 .

ffmpeg -framerate 24 -i Project%03d.png Project.mp4

1
이 출력을 재생할 수 없습니다 : [h264 @ 0x7f148cc3cc40] 하드웨어 가속기가 그림을 디코딩하지 못했습니다
Bram

안녕하세요 어떻게 그 명령을 실행할 수 있습니까?
무고한

터미널이나 콘솔에서 @Innocent.
Joshua Pinter

그것을 얻었지만 project % 3d.png는 Project001.png, Project002.png라는 이름의 폴더에서 내 모든 이미지를 선택하지 않았으므로 모든 사진을 가져 와서 비디오로 변환하려면 어떻게해야합니까
순진한

또는를 사용 %3d하고 %03d있습니까?
Joshua Pinter

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