FFmpeg에서는 두 개의 비디오 컨텐츠간에 크로스 페이드를 수행하는 것이 실제로 매우 복잡합니다. 오디오와 같은 "크로스 페이드"필터는 없습니다.
효율적인 방법은 무엇입니까?
[0:a][1:a] acrossfade=d=1 [audio]
필터에 추가 한 다음 -map "[audio]"
명령에 추가 하면 효과가있었습니다. 원한다면 테스트를 해보고 답변을 업데이트하십시오!
FFmpeg에서는 두 개의 비디오 컨텐츠간에 크로스 페이드를 수행하는 것이 실제로 매우 복잡합니다. 오디오와 같은 "크로스 페이드"필터는 없습니다.
효율적인 방법은 무엇입니까?
[0:a][1:a] acrossfade=d=1 [audio]
필터에 추가 한 다음 -map "[audio]"
명령에 추가 하면 효과가있었습니다. 원한다면 테스트를 해보고 답변을 업데이트하십시오!
답변:
이 예제는 두 비디오 클립의 해상도, 프레임 속도 등이 같다고 가정 할 때 비디오 만 수행합니다. 그러면 fadeoutclip과 fadeinclip 사이에 1 초 페이드가 생성됩니다. fadeoutclip의 길이가 10 초라고 가정하십시오. 이것은 명확성을 위해 형식화되었습니다. 실제로 한 줄의 코드입니다.
ffmpeg -i fadeoutclip.mp4 -i fadeinclip.mp4 -an \
-filter_complex "\
[0:v]trim=start=0:end=9,setpts=PTS-STARTPTS[firstclip]; \
[1:v]trim=start=1,setpts=PTS-STARTPTS[secondclip]; \
[0:v]trim=start=9:end=10,setpts=PTS-STARTPTS[fadeoutsrc]; \
[1:v]trim=start=0:end=1,setpts=PTS-STARTPTS[fadeinsrc]; \
[fadeinsrc]format=pix_fmts=yuva420p, \
fade=t=in:st=0:d=1:alpha=1[fadein]; \
[fadeoutsrc]format=pix_fmts=yuva420p, \
fade=t=out:st=0:d=1:alpha=1[fadeout]; \
[fadein]fifo[fadeinfifo]; \
[fadeout]fifo[fadeoutfifo]; \
[fadeoutfifo][fadeinfifo]overlay[crossfade]; \
[firstclip][crossfade][secondclip]concat=n=3[output] \
" \
-map "[output]" <add in encoding part here>
다음은 이것에 대한 설명입니다.
입력 사양 ... 명백한
ffmpeg -i fadeoutclip.mp4 -i fadeinclip.mp4 -an
만들기 filter_complex
: 당신이 이미 필터 단지를 이해 가정 :
-filter_complex
먼저 트림 필터를 사용하여 두 스트림을 두 조각으로 나눕니다 . 내용과 크로스 페이드 섹션. 페이드 아웃은 내용과 페이드 섹션으로 나뉘고 페이드 인은 페이드 섹션과 내용으로 나뉩니다. 총 4 개의 섹션.
엄밀히 말하면, 우리가하지 않는 것이 참고 가 우리가 단지 두 개의 비디오 클립을 시간에 밖으로 페이드 인 페이드를 지정할 수 있습니다 : 밖으로 크로스 페이드 섹션을 휴식. 그러나 이렇게함으로써 우리는 :
overlay
필터 사용의 복잡성을 피하십시오이 4 개의 섹션은 각각 시작 시간 (초), 종료 시간 (초) 및 신비한 setpts=PTS-STARTPTS
필터를 지정합니다 .이 필터 는 기본적으로 각 비디오 서브 클립을 0 초에서 시작합니다. 다시 합성 할 때 매우 중요합니다.
s=0
지정자는 중복이며 해당 지정에 대한 setpts
필터 s=0
는 중복입니다. 그러나 필터 컴플렉스를 중단하지 않고 시작 시간을 0에서 변경할 수 있도록 둘 다 중복 지정됩니다. 또한 두 번째 컨텐츠 클립이 끝까지 실행되므로 e=
부분 (end =)이 지정되지 않습니다.
[0:v]trim=s=0:e=9,setpts=PTS-STARTPTS[firstclip];
[1:v]trim=s=1,setpts=PTS-STARTPTS[secondclip];
[0:v]trim=s=9:e=10,setpts=PTS-STARTPTS[fadeoutsrc];
[1:v]trim=s=0:e=1,setpts=PTS-STARTPTS[fadeinsrc];
다음으로, 페이드 인과 페이드 아웃을 지정합니다 : 먼저 픽셀 형식을yuva420p
로 지정 하여 알파 (투명도) 채널을 두 페이드 섹션에 추가합니다 . 실제로 알파 채널을 제공하는 모든 형식을 사용할 수 있습니다.
이 필터에서 다음 우리가 페이드 아웃 하나를 지정하고, 하나의 페이드 subcomplex.alpha=1
비디오 자체 만의 투명성 금액 것이다 "페이드"어둡게하지 않음을 의미합니다. st
시작을 d
의미하고 지속 시간을 의미합니다.
[fadeinsrc]format=pix_fmts=yuva420p,
fade=t=in:st=0:d=1:alpha=1[fadein];
[fadeoutsrc]format=pix_fmts=yuva420p,
fade=t=out:st=0:d=1:alpha=1[fadeout];
이것이 무엇입니까? : fifo
필터 는 필터 컴플렉스에 사용 가능한 버퍼 공간이 있는지 확인합니다. 놀랍게도 이것이 기본값이 아닙니다. 이렇게하지 않으면 위 단계의 출력이 아래의 오버레이 필터를 오버런하면 crossfade가 실패 할 수 있습니다. 네, 지금 무슨 생각하는지 알아요 실제로 FFMPEG 버그 입니다.
[fadein]fifo[fadeinfifo];
[fadeout]fifo[fadeoutfifo];
이제 두 페이드 섹션을 오버레이합니다 . 두 크로스 페이드 섹션의 크기를 동일하게 하여 오버레이 필터가 사용하는 다소 불쾌한 옵션 에 대해 걱정할 필요가 없습니다.
[fadeoutfifo][fadeinfifo]overlay[crossfade];
마지막으로 concat 필터를 사용하여 세 개의 세그먼트 를 정렬합니다 .
[firstclip][crossfade][secondclip]concat=n=3[output]
잊지 마세요 픽셀 형식으로 무엇을 일반적으로 사용을 (일반적으로 설정 yuv420p
), 크로스 페이드 섹션으로 설정 한 것으로 yuv420
출력 채널에! (우리가 지정하지 않았으므로 오버레이 인수를 사용할 수 있습니다) 물론 WANT yuv420
이면 괜찮습니다 :-)
-map "[output]" <add your normal encoding part here>
그런 다음 나중에이 Q & A 범위를 벗어난 오디오를 다시 결합 할 수 있습니다.
trim=start=0:end=9
아니라 trim=st=0:e=9,
..