FFMPEG 오버레이 필터 부분 변환


0

비디오에 오버레이 필터를 적용하여 단일 이미지를 몇 초 동안 혼합하려고합니다. 내 비디오 지속 시간은 약 1 분이므로 FFMPEG가 변경해야하는 비디오 부분을 다시 인코딩하는 대신 전체 비디오를 다시 인코딩하려고하면 낭비가됩니다.

내 블렌드 비디오 명령은 다음과 같습니다

ffmpeg -i beach.mp4 -i logo.png 
-filter_complex "[0:v][1:v] overlay=25:25:enable='between(t,0,20)'" 
-pix_fmt yuv420p -c:a copy output.mp4

아무도 내가 이것을 피할 수있는 방법을 알고 있습니까? (비디오를 분할하려고했지만 시작 및 종료 프레임을 지정하여 비디오를 정확하게 분할 할 수없는 것 같습니다)


오버레이를 사용하여 20 초 세그먼트를 별도의 파일로 인코딩 한 다음을 사용하여 원본에서 처음 ~ 20 초를 트리밍 할 수 -c copy있습니다. 그런 다음 concat demuxer 를 사용하여 결합하십시오. 결합 할 두 개의 결과 세그먼트는 매개 변수 (코덱, 타임베이스 등)와 일치해야하며 최상의 결과를 얻으려면 키 프레임을 잘라야합니다. 1 분 분량의 비디오 작업. 내 게으름은 다시 인코딩하거나 오버레이를 처리하지 않는다고 말합니다. 웹 기반 플레이어를 사용하는 경우 대신 로고를 추가하도록 할 수 있습니다.
llogan

@LordNeckbeard 감사하지만이 작업은 한 번이 아니라 여러 번 실행됩니다. 그렇기 때문에 성능이 필요합니다.
dajuric

나는 그것이 가능성이 있다고 생각했지만 질문에 언급하지 않았습니다. 명령에서 완전한 콘솔 출력을 표시해야합니다.
llogan

@LordNeckbeard 언급하지 않아서 죄송합니다. 그것은 완전한 출력이었습니다. 첫 번째 단계를 밟았을 때 다른 것을 쓰지 않았습니다.
dajuric

오버레이가 정확히 20 초 동안 발생해야합니까?
Gyan

답변:


2

부정확 한 내용은 괜찮으므로 다음 방법을 제안합니다.

비디오 입력 세그먼트

ffmpeg -i beach.mp4 -c copy -segment_time 20 -f segment beach_seg%02d.mp4

첫 번째 세그먼트에 오버레이 로고

ffmpeg -i beach_seg00.mp4 -loop 1 -i logo.png 
-filter_complex "[0:v][1:v] overlay=25:25:shortest=1" 
-pix_fmt yuv420p -c:a copy overlay.mp4

연결 세그먼트

먼저 텍스트 파일을 준비하십시오 segments.txt

file 'overlay.mp4'
file 'beach_seg01.mp4'
file 'beach_seg02.mp4'
file 'beach_seg03.mp4'
...

그런 다음 연결

ffmpeg -f concat -i segments.txt -c copy beach_with_logo.mp4

여기서주의해야 할 점은 overlay.mp4의 타임베이스가 해변 세그먼트의 타임베이스와 일치하지 않을 수 있다는 것입니다. 이 경우 해변 세그먼트 중 하나의 타임베이스 ( tbn) -video_track_timescale <tbn>를 확인하고 오버레이 명령에 추가하십시오 .


감사합니다 (Mulvya와 LordNeckbeard)! 비디오를 세 조각으로 자르고 소프트웨어로 중간 조각을 처리해야하고 소프트웨어에 프레임 오프셋이 필요한 경우 어떻게 설명 할 수 있습니까? 어떻게 프레임 오프셋을 얻어야합니까? (force_keyframes를 사용하여 키 프레임을 설정 한 다음 절단 작업을 수행했습니다. 괜찮습니까?)
dajuric
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.