제가 생각하는 질문은 매우 간단합니다.
때때로 나는 내 웹 서버에서 대용량 MKV 파일을 다운로드하고 다운로드하는 동안 재생하는 것을 좋아합니다. 그러나 트랜스코딩한 MKV 파일에 대해 이 작업을 수행하면 파일이 실제보다 훨씬 짧은 것으로 표시되는 경우가 많으며, 파일이 끝난 후에도 계속 재생되고 잘못된 시간이 표시됩니다. 예: 2:50/2:50이 표시되지만 계속 재생됩니다. 그러나 화살표 키를 사용하여 뒤로 탐색하려고 하면 플레이어가 충돌하거나 파일의 시작 부분으로 건너뜁니다.
그렇다면 플레이어가 전체 내용 없이 파일 길이를 알 수 있도록 인코딩하는 동안 모든 메타데이터를 파일 시작 부분으로 어떻게 이동할 수 있습니까?mp4
다음을 사용하여 형식 으로 이 작업을 수행할 수 있습니다.-movflags faststart
, 하지만 어떻게 해야 합니까 mkv
?
이미 다른 곳에서 질문하고 답변했다면 죄송합니다. 제가 사용한 것보다 더 나은 키워드를 생각할 수 없었고 제가 사용한 키워드로는 결과가 나오지 않았습니다.
답변1
Matroska 재단은 다음과 같은 도구를 제공합니다.mkclean, 이는 MOV/MP4에 대해 qt-faststart가 수행하는 것과 유사한 작업을 수행합니다.
통사론:
mkclean in.mkv out.mkv
그러면 큐 인덱스가 재생성됩니다. 원래 신호를 유지하려면,
mkclean --keep-cues in.mkv out.mkv
FFmpeg도 할 수 있습니다이것, 사용자 측에서는 약간의 추측을 하기도 합니다.
ffmpeg -i in.mkv -c copy -reserve_index_space 50k out.mkv
여기서 reserve_index_space
바이트 단위의 값은 인덱스에 필요한 크기입니다. 50k
bytes는 1시간 분량의 미디어에 권장되는 크기입니다.
답변2
위에 건물기얀의 대답, mkclean은 스트리밍을 위해 MKV를 최적화하는 데 적합한 도구입니다. 그러나 mkclean이 파일을 생성하는 방식에서 몇 가지 이상한 점을 발견하여 포크를 만들었습니다.https://github.com/XMB5/mkclean-pragmatic
사용 예:mkclean test.mkv test_streaming_optimized.mkv
다음은 읽어보기에서 발췌한 내용입니다.
배경(먼저 mkclean이 필요한 이유)
mkv 파일을 스트리밍하려면 비디오 플레이어가단서 요소, 비디오 타임스탬프를 바이트 오프셋에 매핑하는 파일의 일부입니다. 이러한 오프셋을 사용하면 비디오 플레이어가 파일의 바이트 위치를 추측하지 않고도 비디오 전체에서 타임스탬프를 찾을 수 있습니다.
일반적으로 큐 요소는 matroska 파일의 끝에 위치합니다(참조:마트로스카 구조도). 이는 mkv를 생성하는 애플리케이션이 먼저 모든 비디오 데이터를 기록한 다음 나중에야 비디오 콘텐츠의 정확한 바이트 위치를 알 수 있기 때문입니다.
그러나 파일 끝에 큐 요소가 있는 것은 이상적이지 않습니다. 비디오 플레이어는 파일 시작 부분에서 탐색 헤드를 읽은 다음 파일 끝을 탐색하여 큐 정보를 읽은 다음 다시 탐색하여 읽어야 합니다. 영상 콘텐츠. HTTP 스트리밍의 경우 이는 3개의 개별 요청에 해당하며 1개의 요청에 비해 몇 초의 지연이 추가됩니다.
mkclean
큐 요소가 시작 부분에 있도록 mkv 파일을 재구성하여 비디오 재생을 더 빨리 시작할 수 있도록 합니다.
포크의 기술적 변경 사항(원래 mkclean과 비교)
matroska v4
기본적으로 doctype 버전을 다음으로 설정합니다.- 문서 읽기 버전을 2로 설정합니다(호환성을 위해 그렇지 않으면 vlc, mpv, ffmpeg 등과 작동하지 않습니다).
- 기본적으로 최적화 비활성화(일반 mkclean
--no-optimize
플래그와 동일) - 클러스터 타임스탬프가 시간순으로 진행되지 않는 경우 무시
- 타임스탬프를 강제로 변경하면 mpv에서 "잘못된 비디오 타임스탬프: 10.085000 -> 10.060000"이라는 경고가 표시됩니다.