![검은색으로 딥/페이드](https://rvso.com/image/1428745/%EA%B2%80%EC%9D%80%EC%83%89%EC%9C%BC%EB%A1%9C%20%EB%94%A5%2F%ED%8E%98%EC%9D%B4%EB%93%9C.png)
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
출력 옵션을 사용하여 -loop
GIF가 반복되는 횟수를 제어하세요. 이 옵션을 사용하지 않으면 기본값은 무한 루프입니다. 값은 -1
루프가 아닙니다.
사용된 옵션 및 필터:
-t
각 입력의 지속 시간을 초 단위로 설정합니다.-loop 1
그렇지 않으면 이미지의 지속 시간이 1프레임이 됩니다.-framerate
입력 이미지 프레임 속도를 설정합니다(선언되지 않은 경우 기본값은 25입니다). GIF를 만들 때 유용합니다.바래다페이드 인 및 아웃.
d
페이드 기간입니다.st
시작할 때입니다.연결각 이미지를 연결(또는 "결합")합니다.
체재MP4를 출력하고 libx264(빌드에서 지원하는 경우 MP4 출력의 기본 인코더)로 인코딩하는 경우 비FFmpeg 기반 플레이어와 호환되는 크로마 서브샘플링 구성표를 출력합니다.
나뉘다필터 출력의 복사본을 만듭니다. 하나의 명령으로 모든 작업을 수행하기 위해 팔레트* 필터에 필요합니다.
크로스페이드
각 이미지가 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
루프가 아닙니다.
답변2
나는 다음 경로를 취하는 일반 bash 스크립트를 작성했습니다.이미지 폴더, ffmpeg를 사용하여 크로스페이드 비디오를 출력합니다.
https://gist.github.com/anguyen8/d0630b6aef6c1cd79b9a1341e88a573e
스크립트는 기본적으로 폴더의 이미지를 보고 위의 @LordNeckbeard의 답변과 유사한 명령을 인쇄하고 명령을 실행합니다. 이 스크립트는 폴더에 많은 이미지가 있고 우울할 정도로 긴 명령을 수동으로 입력하고 싶지 않을 때 도움이 됩니다.