Programming/MFC-C++

FFMpeg x264 Header 패킷 분석

빠릿베짱이 2013. 4. 2. 18:11
반응형

FFmpeg 에서 디버깅 메시지 출력하게하는 함수

av_log_set_level(AV_LOG_DEBUG);

x264로 인코딩할 경우에 데이터는 NAL이라는 것으로 사용되는 것 같음.

분석 결과

0x00 0x00 0x00 0x01 또는

0x00 0x00 0x01 로 시작되는 것이 Start Code 같음.

키 프레임의 경우 총 3~4개의 NAL로 구성되어있는 듯함.

처음 프레임의 경우에는 인코더 정보에 대한 문자열을 포함하여 4개의 NAL로 구성되며,

다음부터 키프레임은, 3개의 NAL로 구성된다.

Start Code 뒤에

0x67, 0x68, 0x41, 0x01, 0x65, 0x06

이런식으로 나오는데

분석 결과

0x06 :  NAL_SEI  맨 처음 프레임에서 나오는데, uuid와 기타 코덱 정보를 가지고 있다.        

0x67 : NAL_SPS

0x68 : NAL_PPS

0x41 : NAL_SLICE    -> 일반적인 프레임에서 나옴

0x01 : NAL_SLICE -> 일반적인 프레임에서 나옴

0x65 : NAL_SLICE_IDR    -> 키 프레임에서 나온다.

 

참고

enum nal_unit_type_e

{

    NAL_UNKNOWN     = 0,

    NAL_SLICE       = 1,

    NAL_SLICE_DPA   = 2,

    NAL_SLICE_DPB   = 3,

    NAL_SLICE_DPC   = 4,

    NAL_SLICE_IDR   = 5,    /* ref_idc != 0 */

    NAL_SEI         = 6,    /* ref_idc == 0 */

    NAL_SPS         = 7,

    NAL_PPS         = 8,

    NAL_AUD         = 9,

    NAL_FILLER      = 12,

    /* ref_idc == 0 for 6,9,10,11,12 */

};

x264 분석 방법

소스 코드 분석 후, 적당한 곳에 로그 함수를 추가한다.

예제

x264_log( h, X264_LOG_DEBUG,   "Nal num=%d, size=%d type=%d ref_idc=%d%s\n",
   kk,   (*pp_nal)[kk].i_payload,   (*pp_nal)[kk].i_type,   (*pp_nal)[kk].i_ref_idc,   psz_message);

그리고 파일을 저장하고,

컴파일을 다시 수행한다. 획득한 dll을 새로 덮어씌워서 ffmpeg을 돌리면, 로그가 찍힌다.

반응형