2013-04-12 4 views
2

비디오를 원시 h264 파일로 변환하는 작은 도구를 쓰고 있습니다. 이 파일들은 나중에 SIP 전화로 재생됩니다. 내가 libx264에서 다음과 같은 출력을 가지고이 프로그램을 실행하면C++에서 libav로 x264 기본 프로파일을 설정하는 방법

eccx->pix_fmt = PIX_FMT_YUV420P; 
    eccx->width = VIDEO_FRAME_WIDTH; 
    eccx->height = VIDEO_FRAME_HEIGHT; 
    eccx->time_base.num = 1; 
    eccx->time_base.den = VIDEO_FRAMES_PER_SEC; 
    eccx->max_b_frames = 0; 

    eccx->rtp_payload_size = VIDEO_RTP_PAYLOAD_SIZE; 

    eccx->bit_rate = VIDEO_BIT_RATE; 
    eccx->rc_max_rate = VIDEO_BIT_RATE; 
    eccx->rc_buffer_size = VIDEO_BIT_RATE * 2; 

    eccx->flags |= CODEC_FLAG_QP_RD; 
    eccx->flags |= CODEC_FLAG_LOW_DELAY; 
    eccx->flags |= CODEC_FLAG_QSCALE; 
    eccx->flags |= CODEC_FLAG_EMU_EDGE; 

    eccx->mb_decision = FF_MB_DECISION_SIMPLE; 

    switch(video){ 
    case H263: 
    break; 
    case H263P: 
    eccx->flags |= CODEC_FLAG_H263P_SLICE_STRUCT; 
    break; 
    case H264: 
    av_dict_set(&options, "vprofile", "baseline", 0); 
    eccx->flags2 = CODEC_FLAG2_FASTPSKIP; 
    eccx->profile = FF_PROFILE_H264_BASELINE; 
    eccx->level = 13; 
    break; 
    } 

:

[libx264 @ 0x10fad60] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.1 Cache64 
[libx264 @ 0x10fad60] profile Main, level 1.3 

는 왜 여전히 메인 프로파일입니다 내가 설정 한 비록 명시 적으로베이스 라인, 나는 다음과 같은 코드가?

또한 누군가가 몇 가지 메모를 추가 할 수 있다면 정말 멋질 것입니다. h264 설정은 SIP 전화 통화에 유용합니다. 고마워요!

+0

VIDEO_FRAME_WIDTH 및 VIDEO_FRAME_HEIGHT은 무엇인가요? 이 결의안이 너무 높을 수 있습니까? – Dundar

+0

프로필이 레벨과 관련이 없습니다. 레벨은 프레임 크기를 제한합니다. 레벨 1.3에서는 CIF까지 프레임을 허용합니다 (http://en.wikipedia.org/wiki/H264#Levels). 입력 비디오 스트림에는 CIF가 있습니다. 입력 비디오에는베이스 라인에서 허용되지 않는 B- 프레임이 포함될 수 있지만, I- 또는 P- 프레임으로 변환하도록 libav를 설득하려면 어떻게해야합니까? –

답변

1

vprofile은 avconv 옵션이며 문서화되지 않은/사용되지 않는/사용하지 않는 것이 좋습니다. 어쨌든 -profile:v을 사용하십시오. avconv가 파싱하고 실제로 libavcodec으로 보내지는 옵션 이름은 단지 profile입니다. 그래서 이것이 당신이 사용해야하는 것입니다.

2

당신은 코덱 컨텍스트의 민간 부분에서 옵션을 설정해야합니다 : 물론

av_opt_set(eccx->priv_data, "profile", "baseline", 0); 

eccxAVCodecContext 예라고 가정. 그 다음으로 코덱을 열

avcodec_open2(eccx, codec, NULL); 

codec 이미이 비슷한으로 입수했습니다해야 당신의 AVCodec 인스턴스 :

AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264); 

당신이 잘못된 프로필 이름을 제공하여 작동하는지 확인할 수 있습니다, 라이브러리는 표준 오류에서 유효한 프로파일 이름을 알려줍니다.