특정 위치를 찾은 후 인코딩하고 첫 번째 프레임을 키프레임으로 만들고 싶습니다. 여기서는 제가 사용한 명령을 사용했습니다.
ffmpeg -ss 300 -i howimet.mp4 -acodec libfaac -ar 48000 -ab 128k -ac 2 -vcodec libx264 -vf "scale=480:270" -f mpegts -force_key_frames 300 -t 120 howimet2.ts
-force_key_frames는 키 프레임을 만들기 위한 위치를 찾도록 설정됩니다. 나는 다음 스크립트를 사용합니다 (여기) 첫 번째 프레임이 키프레임인지 확인합니다.
ffprobe -show_frames -v quiet howimet2.ts | awk -F= ' /pict_type=/ { if (index($2, "I")) { i=1; } else { i=0; } }
/pkt_pts_time/ { if (i && ($2 >= 0)) print $2; }
' | head -n 1
결과는 첫 번째 키 프레임이 두 번째 0에 위치하지 않음을 보여줍니다.
내 명령이 올바르지 않은 것 같아요. 내가 무엇을 놓치고 있나요?
답변1
비디오를 인코딩할 때 첫 번째 프레임은가지다키프레임이 됩니다. 이는 완전히 인코딩된 첫 번째 프레임이 되며 후속 프레임에서는 프레임 간 예측에 이를 사용할 수 있습니다. 또한 코딩된 비디오 시퀀스의 시작 부분에는 디코더에 새로 고침을 지시하는 H.264 액세스 장치가 있습니다.
따라서 무엇을 하든 비트스트림을 복사하지 않는 한 비디오를 다시 인코딩하게 되며 첫 번째 프레임은 키프레임이어야 합니다.
이제 어떤 이유로든 스트림 시작 시간에 오프셋이 있습니다. 이는 모든 프레젠테이션 타임스탬프도 이 오프셋에 따라 이동됨을 의미합니다. 출력 의 헤드를 검사하면 ffprobe -show_frames
프레임 0이 실제로 키프레임이지만 PTS가 다르다는 것을 알 수 있습니다.
이를 보완하기 위해 모든 PTS에서 시작 시간을 뺄 수 있습니다.
답변2
앞서 언급한 것처럼 동영상의 첫 번째 프레임은 I-Frame이어야 합니다. 문제는 인코딩(또는 원하는 경우 복사)이 아니라 디코딩에서 발생합니다. 입력 앞에 -ss를 사용하는 것은 정확하지 않으므로 ffmpeg는 원하는 위치로 이동할 수 있도록 최선을 다하고 있습니다. Ffmpeg는 해당 위치를 전달하여 0이 아닌 첫 번째 타임스탬프를 알려줍니다.
-i 다음에 두 번째 -ss를 시도하는 것이 좋습니다. -ss 299 -i 입력 -ss 1을 따라.
이는 원하는 위치로 이동한 다음 처리하기 전에 1초 동안 디코딩한다는 의미입니다. 이것이 귀하의 pts 문제를 해결할지는 잘 모르겠지만 희망적으로 이것이 귀하를 올바른 방향으로 이끌기를 바랍니다.
지적하자면, 나는 force_key_frames 명령이 여러분이 생각하는 대로 작동하지 않는다고 생각합니다. 어떤 작업을 수행하는 경우 300초마다 출력에 키 프레임을 추가하라고 지시할 가능성이 높지만 이는 단지 추측일 뿐입니다. 이는 출력의 첫 번째 프레임만 키 프레임(t=120)이 됨을 의미합니다.
답변3
"-g"를 사용하여 GOP 크기를 설정합니다.
정확성을 보여주기 위해 다음은 1초 세그먼트입니다.
ffmpeg -i in.mkv -g 30 -hls_time 1 -hls_list_size 0 index.m3u8
m3u8의 모습은 다음과 같습니다.
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:1.001000,
index0.ts
#EXTINF:1.001000,
index1.ts
#EXTINF:1.001000,
index2.ts
#EXTINF:1.001000,
index3.ts
#EXTINF:1.001000,
index4.ts
#EXTINF:1.001000,
index5.ts
#EXTINF:1.001000,
index6.ts
#EXTINF:1.001000,
index7.ts
#EXTINF:1.001000,
index8.ts
#EXTINF:1.001000,
index9.ts
#EXTINF:1.001000,
index10.ts
#EXTINF:1.001000,
index11.ts
#EXTINF:1.001000,
index12.ts
#EXTINF:1.001000,
index13.ts
#EXTINF:1.001000,
....