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.