전체 비디오를 다시 인코딩하지 않고 비디오 중간에 키프레임 추가

전체 비디오를 다시 인코딩하지 않고 비디오 중간에 키프레임 추가

광고 시간에 mp4 중간에 I-프레임을 추가해야 HLS로 분할하고 비디오가 다시 시작될 때 I-프레임을 가질 수 있습니다. 전체 비디오를 다시 인코딩하고 특정 위치에서 키 프레임을 강제하는 동안 이 작업을 수행하는 방법을 알고 있습니다. 하지만 키프레임이 필요한 지점(비디오의 1초 정도)을 잘라내고 키프레임을 추가한 다음 비디오를 다시 연결하는 편이 낫습니다. I-프레임이 추가되는 영상의 1초 부분을 제외하면 대부분 코덱을 복사할 수 있기 때문에 인코딩 시간이 크게 단축될 것입니다.

유일한 문제는 I-프레임을 추가할 때 비디오 프로필과 설정이 변경되고 다시 합칠 때 깔끔한 연결이 이루어지지 않는다는 것입니다. 를 사용하여 다시 인코딩할 수 있다는 것을 이해 concat하지만 처리 시간을 피하려고 노력하고 있습니다.

ffmpeg를 사용하여 수행하려는 작업에 대한 몇 가지 간단한 예는 다음과 같습니다.

ffmpeg -i input.mp4 -ss 30 -t 1 -c:a copy -y -copyts clipped2.mp4

ffmpeg -i input.mp4 -t 30 -c copy -y -copyts clipped1.mp4

ffmpeg -i "concat:clipped1.mp4|clipped2.mp4" -c copy -y newOutput.mp4

ffprobe1초 클립에 대한 비트 전송률, 프로필 및 기타 설정을 사용하고 지정하여 임의의 항목이 기본값으로 설정되지 않도록 해야 할 수도 있지만 여전히 제대로 작동하지 않습니다.

누구든지 이것을 달성 했습니까? 이는 특히 서버측 광고 삽입을 위해 수행됩니다.

답변1

복사하고 있어요이 답변:

ffmpeg를 사용하면 옵션을 사용하여 원하는 위치에 키프레임을 삽입할 수 있습니다 -force_key_frames.

예:

./ffmpeg -i input.mp4 -c:a copy -c:v copy -force_key_frames 0:05:00,0:10:00 out.mp4

키프레임을 5초와 10초 표시에 최대한 가깝게 배치합니다. 시간 값은 hh:mm:ss 형식이거나 초(단일 값, 콜론 없음)일 수 있습니다.

다음을 사용하여 원하는 위치에 프레임이 삽입되었는지 확인할 수 있습니다.

./ffprobe -select_streams v:0 -skip_frame nokey -show_entries frame=pkt_pts_time out.mp4

관련 정보