ffmpeg에서 페이드 인 / 아웃 효과가있는 5 개의 이미지로 비디오 제작


27

5 개의 이미지를 사용하면 ffmpeg로 60 초의 비디오를 만들어야하며 각 이미지는 15 초 동안 표시되어야합니다. 15 초 후에 첫 번째 이미지가 페이드 아웃되고 두 번째 이미지가 페이드 인되어야합니다. 두 번째 이미지가 페이드 아웃 된 후 세 번째 이미지가 페이드 인됩니다. ffmpeg 명령을 사용하여 어떻게 이것을 달성 할 수 있는지 안내하십시오.


4
무엇을 시도한 다음 도와 드릴까요? 이 포럼은 "작업을하지 않고 답을 알려주세요"유형의 포럼이 아닙니다. - 그렇게 말한다면, 난 당신는 FFmpeg 페이드 문서에 대한 링크를 제공 할 것입니다 ffmpeg.org/ffmpeg-filters.html#fade
마이크 Diglio

답변:


49

블랙으로 딥 / 페이드

크로스 페이드 방법을 보려면 아래로 스크롤하십시오.

페이드 예

각 이미지가 5 초 동안 표시되고 각각 1 초 동안 페이드되는 예. 각 이미지 입력의 너비, 높이 및 샘플 종횡비는 동일합니다. 크기가 다른 경우 아래 예 # 3을 참조하십시오.

MP4 출력

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

오디오

위와 동일하지만 오디오 :

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-i audio.m4a \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" -map 5:a -shortest out.mp4

다양하거나 임의의 크기의 입력 이미지

첫 번째 예와 비슷하지만 너비 x 높이가 다른 입력 이미지가 있습니다. 1280x720 상자에 맞게 채워집니다.

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=out:st=4:d=1[v0]; \
 [1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

패드 (레터 박스 / 필러 박스) 대신 자르기 (화면 채우기)하거나 업 스케일링을 방지하려면 정적 크기의 플레이어에 맞게 비디오 크기 조정 의 예제를 참조하십시오 .

GIF 출력

적당한 품질로 ffmpeg를 사용하여 비디오를 GIF로 변환하는 방법 의 필터를 추가합니다 .

ffmpeg \
-framerate 10 -loop 1 -t 5 -i input0.png \
-framerate 10 -loop 1 -t 5 -i input1.png \
-framerate 10 -loop 1 -t 5 -i input2.png \
-framerate 10 -loop 1 -t 5 -i input3.png \
-framerate 10 -loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

-loop출력 옵션을 사용하여 GIF 루프 횟수를 제어하십시오. 이 옵션을 사용하지 않으면 기본값은 무한 루프입니다. 값은 -1루프가 아닙니다.

사용 된 옵션 및 필터 :

  • -t 각 입력의 지속 시간을 초 단위로 설정합니다.

  • -loop 1 그렇지 않으면 1 프레임의 지속 시간을 갖습니다.

  • -framerate입력 이미지 프레임 속도를 설정합니다 (선언되지 않은 경우 기본값은 25 임). GIF를 만드는 데 유용합니다.

  • 스케일패드 특정한 상기 입력 이미지를 맞추기 위해 (실시 예 # 3에서 사용) 균일 한 크기.

  • 페이드 인과 페이드 아웃. d페이드 지속 시간입니다. st시작할 때입니다.

  • CONCAT는 ( "가입"또는) 각각의 화상을 연결한다.

  • MP4를 출력하고 libx264 (빌드에서 지원하는 경우 MP4 출력의 기본 인코더)로 인코딩하는 경우 비 FFmpeg 기반 플레이어와 호환되는 크로마 서브 샘플링 체계를 출력하는 형식 입니다.

  • 필터 출력의 사본을 만들려면 분할하십시오 . 하나의 명령으로 모든 것을 수행하기 위해 palette * 필터가 필요합니다.

  • 멋진 GIF를 만들기위한 palettegenpaletteuse .


크로스 페이드

크로스 페이드 예제

각 이미지가 5 초 동안 표시되고 각 이미지에 1 초 동안 지속되는 크로스 페이드가있는 예입니다. 각 이미지 입력의 너비, 높이 및 샘플 종횡비는 동일합니다. 크기가 다양하면 위의 예제 # 3을 수정하십시오.

MP4 출력

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -movflags +faststart out.mp4

오디오

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-i music.mp3 \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -map 5:a -shortest -movflags +faststart out.mp4

오디오가있는 두 비디오 간 크로스 페이드

각 입력에서 5 초 세그먼트를 선택하고 1 초 크로스 페이드를 추가하십시오.

ffmpeg -i input0.mp4 -i input1.mp4 -filter_complex \
"[0:v]trim=start=5:end=10,setpts=PTS-STARTPTS[v0];
 [1:v]trim=start=12:end=17,setpts=PTS-STARTPTS+4/TB,format=yuva444p,fade=st=4:d=1:t=in:alpha=1[v1];
 [v0][v1]overlay,format=yuv420p[v];
 [0:a]atrim=start=5:end=10,asetpts=PTS-STARTPTS[a0];
 [1:a]atrim=start=12:end=17,asetpts=PTS-STARTPTS[a1];
 [a0][a1]acrossfade=d=1[a]" \
-map "[v]" -map "[a]" output.mp4

GIF 출력

ffmpeg \
-framerate 10 -loop 1 -t 5 -i 1.png \
-framerate 10 -loop 1 -t 5 -i 2.png \
-framerate 10 -loop 1 -t 5 -i 3.png \
-framerate 10 -loop 1 -t 5 -i 4.png \
-framerate 10 -loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3];[bg3][f3]overlay,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

-loop출력 옵션을 사용하여 GIF 루프 횟수를 제어하십시오. 이 옵션을 사용하지 않으면 기본값은 무한 루프입니다. 값은 -1루프가 아닙니다.


1
@LordNeckbeard,이 답변에 감사드립니다. 나는 다른 예제로 사용했습니다. 나는 잘 다음 그 수 이해 -t에서 -loop 1 -t 1 -i 001.png정의하는 각 프레임의 지속 시간을, 그리고 다음 그 번호 T/내에서 filter_complex블록 전환의 지속 시간을 정의를? 그리고이 예제에서 프레임 지속 시간은 전환 지속 시간을 포함하여 계산됩니까?
cincplug

1
@Nisarg 그것은 완전한 출력으로 보이지는 않으며 이전에 표시된 두 명령 중 어떤 명령인지 확실하지 않습니다. 어쨌든을 추가하십시오 -preset ultrafast.
llogan

1
@LordNeckbeard 하나의 비디오 파일을 만들려면 이미지, 비디오 클립 및 오디오 트랙 세트를 결합해야합니다 (바람직하게는 ogg이지만이 시점에서는 관련성이 적습니다). 또한 인접한 이미지간에 전환 효과를 만들어야합니다. ffmpeg 및 / 또는 다른 명령 줄 도구를 사용하여이 전체 작업을 스크립팅 할 수있는 방법이 있습니까? 목표는 명령 행 인터페이스를 통해 작업을 자동화하는 것입니다.
웹 사용자

1
@WebUser 전환은 아마도을 사용하는 것이 더 쉬울 것 melt입니다.
llogan

2
ffmpeg 접근법은 나에게 잘 작동합니다. 감사! 페이지에 새로 온 사람들을위한 팁; concat=n=9명령 의 일부 9에서는 예제의 5 개 이미지와 이미지 사이의 4 개 전환에서 비롯됩니다. 다른 수의 이미지를 처리하는 경우 그에 따라 이미지를 조정해야합니다.
Jim Miller

4

이미지 폴더 경로를 가져 와서 ffmpeg와 함께 크로스 페이드 비디오를 출력 하는 일반적인 bash 스크립트를 작성했습니다 .

https://gist.github.com/anguyen8/d0630b6aef6c1cd79b9a1341e88a573e

스크립트는 기본적으로 폴더의 이미지를보고 위의 @LordNeckbeard의 답변과 유사한 명령을 인쇄하고 명령을 실행합니다. 이 스크립트는 폴더에 이미지가 많고 너무 긴 명령을 수동으로 입력하지 않으려는 경우에 도움이됩니다.


미안하지만, 당신의 스크립트는 반환 # 4에 입력 # 0,는 FFmpeg 3.0.1와 함께 실패합니다 "잘못된 파일 인덱스 5 filtergraph 설명에"
르지 Bociurko

TobySpeight : 좋은 지적, 더 명확하게 답변을 편집했습니다. 기본적으로 주요 아이디어는 이미 @LordNeckbeard에 의해 제공됩니다. 이 스크립트는 많은 이미지를 일반화합니다.
anh_ng8
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.