ffmpeg를 사용하여 2 개의 비디오 간 크로스 페이드


27

ffmpeg를 사용하여 2 개의 비디오 클립 사이에서 크로스 페이드 전환을 시도했지만 지금까지 실패했습니다. 나는 ffmpeg를 처음 사용하며 온라인에서 문서 및 기존 예제에서 찾을 수있는 내용을 조정하는 데 주로 의존합니다. 지금까지 읽은 내용에서 블렌드 또는 오버레이 필터를 사용하면 내가 추구하는 것을 달성하는 데 도움이되지만 명령 줄 세부 정보를 파악하여 작동시킬 수는 없습니다.

페이드 및 CONCAT 필터를 위해 중대하다 비디오 2 페이드와 2 일 개 클립에 CONCAT, 페이드 아웃 영상 1의 유형 전환하지만 난 어떤없이 비디오 2 비디오 1 전환에 명령을 받고 도움을 주시면 감사하겠습니다 사이 에 검은 색 으로 이동합니다 . 어디에서 나이 문제에 대한 예를 찾지 못했습니다. 어쩌면 잘못된 키워드를 찾고 있습니까?

좀 더 구체적으로, 내 비디오는 mp4 (h264 비디오, 중요하지 않은 경우 소리가 들리지 않음)이며 각각 길이는 5 초이며 전환 후 약. 4.5 초의 비디오 1 ~ 0.5 초의 비디오 2.

이 튜토리얼이 MLT와 프레임을 사용하는 것과 비슷하지만 (예 : 페이드의 경우 2:25 참조) 다른 프로그램을 호출하지 않고 ffmpeg에서이 작업을 수행하는 방법을 찾고 있습니다. http://www.youtube.com/watch?v=3PRZ9L_KLdI

이와 같은 페이드를 얻는 포인터 나 명령 줄은 대단히 감사 할 것입니다!


답변:


23

나는 그렇게하는 것이 좋습니다.

  • 출력 비디오와 동일한 지속 시간과 해상도로 검은 배경을 만듭니다.
  • 각 비디오에 알파 채널 추가
  • 각 비디오에 알파 효과에 페이드 추가
  • 검은 배경의 각 비디오에 오버레이 사용

따라서 2 개의 비디오 (5 초)에 크로스 페이드를 추가하는 명령은 다음과 같아야합니다.

ffmpeg -i 1.mp4 -i 2.mp4 -f lavfi -i color=black -filter_complex \
"[0:v]format=pix_fmts=yuva420p,fade=t=out:st=4:d=1:alpha=1,setpts=PTS-STARTPTS[va0];\
[1:v]format=pix_fmts=yuva420p,fade=t=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+4/TB[va1];\
[2:v]scale=960x720,trim=duration=9[over];\
[over][va0]overlay[over1];\
[over1][va1]overlay=format=yuv420[outv]" \
-vcodec libx264 -map [outv] out.mp4

1 초 (d = 1) 동안 4 초 (st = 4)에서 첫 번째 비디오를 알파로 페이드 아웃하고 1 초 (d = 1) 동안 0 초 (st = 0)에서 두 번째 비디오를 페이드 아웃하고 디스플레이를 이동합니다 4 초 (+ 4 / TB)로 시간을 전달합니다. 그런 다음 9 초의 검은 색을 잘라 비디오 크기로 출력하고 재료를 오버레이합니다.

도움이 되길 바랍니다.


안녕 @ptQa, 대단히 감사합니다, 크로스 페이드 효과는 매력처럼 작동합니다. 출력 비디오에서 발생하는 일은 원본 비디오의 왼쪽 상단 만 표시하고 나머지 프레임은 누락 된 것입니다. 해상도를 보았을 때 입력은 960 x 720이고 출력은 320 x 240이지만 전체 비디오를 축소하지 않고 대신 왼쪽 상단에서 320 x 240 섹션을 잘라 내고 출력 비디오에서 나머지를 보여줍니다. 입력 비디오가 없습니다. 이것을 막는 명령 줄에 추가가 있습니까?
Mugba

오, 나는 그것을 얻습니다, 당신은 또한 당신이 얻고 싶은 해상도로 검은 색을 스케일해야합니다. 업데이트 된 답변을 참조하십시오. 그래프를 필터링하기 위해 스케일을 추가했습니다.
ptQa

고맙습니다. 크로스 페이딩을 보여주는 샘플 비디오를 업로드했습니다. 누군가가 그것을 보길 원한다면 youtu.be/JqorgXAjjTo
Mugba

같은 문제; 내 비디오 중 일부에서 작동하는 변형이 있습니다. 감사합니다. 질문 : 비디오 페이드와 동일한 패턴에 따라 비디오의 오디오 트랙을 크로스 페이드하도록 어떻게 수정합니까?
Jim Miller

1
BTW, 답변 샘플 명령에 오류가 있다고 생각합니다 -i 1.mp4 -i 2.mp4.... 맞습니까?
Jim Miller

7

이것이 내가 한 방법입니다.

  • ffmpeg 버전 N-77197-gdf2ce13
  • 각각 4 초씩 2 개의 비디오.
  • 그들 사이에 페이드로 참여해야합니다.
  • 비디오는 25fps입니다.

1) 첫 번째 끝에 페이드 아웃 (밝음에서 어둡게)을 추가하고 두 번째 시작시 페이드 인 (어두운에서 밝음)을 추가하십시오.

ffmpeg -i 1.mp4 -y -vf fade=out:76:24 1f.mp4

ffmpeg -i 2.mp4 -y -vf fade=in:0:25 2f.mp4

76:24는 페이드 아웃이 프레임 76을 시작하고 24 프레임이 나중에 완료됨을 의미합니다.

0:25는 페이드 인이 프레임 0을 시작하고 25 프레임 후에 완료됨을 의미합니다.

2) 2 개의 비디오를 병합

모두 TS로 변환

ffmpeg -i 1f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 1f.ts

ffmpeg -i 2f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 2f.ts

병합

ffmpeg -i "concat:1f.ts|2f.ts" -bsf:a aac_adtstoasc -c copy output.mp4

덕분에 :

http://www.bogotobogo.com/FFMpeg/ffmpeg_fade_in_fade_out_transitions_effects_filters.php


6
이것은 크로스 페이드가 아닙니다.
Gyan

4
@Mulvya가 말한 것. 크로스 페이드는 다른 클립이 페이드 인되는 것과 동시에 한 클립을 페이드 아웃합니다. 첫 번째 클립은 크로스 페이드 기간 동안 투명도가 꾸준히 증가합니다. 두 번째는 투명성이 꾸준히 감소했습니다.
intuited

7

ffmpeg-concat 은 원하는 것을 달성하는 가장 쉬운 방법이며, 기본 크로스 페이드 인 섹시한 OpenGL 전환을 사용할 수 있습니다.

ffmpeg-gl-transition 은 GLSL을 사용하여 두 비디오 스트림 사이를 부드럽게 전환 할 수있는 사용자 정의 ffmpeg 필터입니다. 이 필터는 여기에 나열된 대안보다 사용 및 사용자 정의가 훨씬 쉽습니다.

이 필터는 큰 전환 유형 목록 을 지원하며 기본값은 크로스 페이드입니다.

./ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "gltransition=duration=4:offset=1.5" out.mp4

4
FFmpeg에 패치 제출을 고려 했습니까?
llogan

1
나는 약간의 작은 문제를 해결하고 더 먼저 테스트해야합니다. 좋은 전화!
fisch2

공식 FFmpeg에 있습니까? 나는 그것을 찾을 수없는 것
kraftydevil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.