검은색으로 딥/페이드

검은색으로 딥/페이드

5개의 이미지를 사용하여 ffmpeg에서 60초 길이의 비디오를 만들어야 하며 각 이미지는 15초 동안 표시되어야 합니다. 15초가 지나면 첫 번째 이미지가 페이드 아웃되고 두 번째 이미지가 페이드 인되며, 그 후 두 번째 이미지가 페이드 아웃되고 세 번째 이미지가 페이드 인됩니다. ffmpeg 명령을 사용하여 이를 달성하는 방법을 안내해 주십시오.

답변1

검은색으로 딥/페이드

크로스페이드 방법을 보려면 아래로 스크롤하세요.

페이드 예

각 이미지가 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

출력 옵션을 사용하여 -loopGIF가 반복되는 횟수를 제어하세요. 이 옵션을 사용하지 않으면 기본값은 무한 루프입니다. 값은 -1루프가 아닙니다.

사용된 옵션 및 필터:

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

  • -loop 1그렇지 않으면 이미지의 지속 시간이 1프레임이 됩니다.

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

  • 규모~와 함께인주입력 이미지를 특정하고 균일한 크기에 맞추는 것입니다(예제 #3에서 사용됨).

  • 바래다페이드 인 및 아웃. d페이드 기간입니다. st시작할 때입니다.

  • 연결각 이미지를 연결(또는 "결합")합니다.

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

  • 나뉘다필터 출력의 복사본을 만듭니다. 하나의 명령으로 모든 작업을 수행하기 위해 팔레트* 필터에 필요합니다.

  • 팔레트겐그리고팔레트 사용멋진 GIF를 만들기 위한 것입니다.


크로스페이드

크로스페이드 예

각 이미지가 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

출력 옵션을 사용하여 -loopGIF가 반복되는 횟수를 제어하세요. 이 옵션을 사용하지 않으면 기본값은 무한 루프입니다. 값은 -1루프가 아닙니다.

답변2

나는 다음 경로를 취하는 일반 bash 스크립트를 작성했습니다.이미지 폴더, ffmpeg를 사용하여 크로스페이드 비디오를 출력합니다.

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

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

관련 정보