5 개의 이미지를 사용하면 ffmpeg로 60 초의 비디오를 만들어야하며 각 이미지는 15 초 동안 표시되어야합니다. 15 초 후에 첫 번째 이미지가 페이드 아웃되고 두 번째 이미지가 페이드 인되어야합니다. 두 번째 이미지가 페이드 아웃 된 후 세 번째 이미지가 페이드 인됩니다. ffmpeg 명령을 사용하여 어떻게 이것을 달성 할 수 있는지 안내하십시오.
5 개의 이미지를 사용하면 ffmpeg로 60 초의 비디오를 만들어야하며 각 이미지는 15 초 동안 표시되어야합니다. 15 초 후에 첫 번째 이미지가 페이드 아웃되고 두 번째 이미지가 페이드 인되어야합니다. 두 번째 이미지가 페이드 아웃 된 후 세 번째 이미지가 페이드 인됩니다. ffmpeg 명령을 사용하여 어떻게 이것을 달성 할 수 있는지 안내하십시오.
답변:
크로스 페이드 방법을 보려면 아래로 스크롤하십시오.
각 이미지가 5 초 동안 표시되고 각각 1 초 동안 페이드되는 예. 각 이미지 입력의 너비, 높이 및 샘플 종횡비는 동일합니다. 크기가 다른 경우 아래 예 # 3을 참조하십시오.
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
패드 (레터 박스 / 필러 박스) 대신 자르기 (화면 채우기)하거나 업 스케일링을 방지하려면 정적 크기의 플레이어에 맞게 비디오 크기 조정 의 예제를 참조하십시오 .
적당한 품질로 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
시작할 때입니다.
CONCAT는 ( "가입"또는) 각각의 화상을 연결한다.
MP4를 출력하고 libx264 (빌드에서 지원하는 경우 MP4 출력의 기본 인코더)로 인코딩하는 경우 비 FFmpeg 기반 플레이어와 호환되는 크로마 서브 샘플링 체계를 출력하는 형식 입니다.
필터 출력의 사본을 만들려면 분할하십시오 . 하나의 명령으로 모든 것을 수행하기 위해 palette * 필터가 필요합니다.
멋진 GIF를 만들기위한 palettegen 및 paletteuse .
각 이미지가 5 초 동안 표시되고 각 이미지에 1 초 동안 지속되는 크로스 페이드가있는 예입니다. 각 이미지 입력의 너비, 높이 및 샘플 종횡비는 동일합니다. 크기가 다양하면 위의 예제 # 3을 수정하십시오.
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
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
루프가 아닙니다.
-t
에서 -loop 1 -t 1 -i 001.png
정의하는 각 프레임의 지속 시간을, 그리고 다음 그 번호 T/
내에서 filter_complex
블록 전환의 지속 시간을 정의를? 그리고이 예제에서 프레임 지속 시간은 전환 지속 시간을 포함하여 계산됩니까?
-preset ultrafast
.
melt
입니다.
concat=n=9
명령 의 일부 9
에서는 예제의 5 개 이미지와 이미지 사이의 4 개 전환에서 비롯됩니다. 다른 수의 이미지를 처리하는 경우 그에 따라 이미지를 조정해야합니다.
이미지 폴더 경로를 가져 와서 ffmpeg와 함께 크로스 페이드 비디오를 출력 하는 일반적인 bash 스크립트를 작성했습니다 .
https://gist.github.com/anguyen8/d0630b6aef6c1cd79b9a1341e88a573e
스크립트는 기본적으로 폴더의 이미지를보고 위의 @LordNeckbeard의 답변과 유사한 명령을 인쇄하고 명령을 실행합니다. 이 스크립트는 폴더에 이미지가 많고 너무 긴 명령을 수동으로 입력하지 않으려는 경우에 도움이됩니다.