반응형

MKV H264 포맷의 다양한 형태

 

AVI h264일 경우는

각 비디오 프레임 앞에 0001 이라는 StartCODE NAL Type 코드가 오도록 되어 있습니다.

그리고 Android OpenCORE에서는 첫번째 프레임일 경우 0001 이라는 Start CODE Node 에서 제거했다가 다시 Codec 에서 StartCODE(0001)을 다시 붙여주는 이상한 작업을 합니다.

 

MKV h264일 경우는

문제가 복잡한데 인코더나 변환 툴에 따라서 프레임의 형태가 천차만별입니다..

1.     첫프레임의 앞 부분에만 부가정보와 SPS, PPS 정보가 들어 있는 경우.

2.     IDR 프레임 마다 SPS, PPS 정보가 모두 들어 있는 경우.

3.     비디오 프레임에는 SPS, PPS 정보가 없고 다른 섹터에 SPS, PPS가 들어있는 경우.

지금 까지 발견한 것은 이정도 상황입니다.

 

비디오를 처음 재생하기 위해서는 IDR프레임을 올려주어야 하는데

IDR프레임을 올려줄 때에는 AVI의 경우와 같이 StartCODE +NAL Type 의 형태로 비디오를 올려주어야 합니다. 하지만 MKV h264에서는 StartCODE가 없습니다. MKV로 변환되면 StartCODE 4byte 대신 각각의 NAL Type에 대한 크기 정보가 앞 4byte에 들어갑니다.

 

그래서 이것을 읽어내서 확인과정을 거친 후 AVI가 작동하는 것과 동일하게 변환해서 올려주어야 하는 과정이 필요합니다.

 

그리고 Seek 을 할 때에도 IDR프레임을 찾기 위해서 이런 과정이 필요하며.

위에 언급한 2번의 경우와 같이 전체 프레임이 이상하게 되어 있을 경우를 대비하여 전체프레임마다 검사루틴을 거치도록 되어 있습니다.

 

이것은 Demuxer를 거친 후의 비디오 프레임 데이터를 바이너리로 열어보면 확인 할 수 있고,

대략적으로도 MKV 파일을 바이너리로 열어서 NAL Type 부분을 확인해보면 알 수 있습니다.

 

이 코드들은 fakeparser.c 파일의 read_frame_data()함수안과 pvmf_mkvffparser_node.cpp 파일의 RetrieveTrackData()함수안에 있습니다.


 

반응형
Posted by Real_G