2013-04-12 40 views
2

我在寫一個小工具,它將視頻轉換爲原始h264文件。這些文件將在稍後由SIP電話播放。我有以下代碼:如何在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以下的輸出:

[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幀,這在基線中是不允許的,但我如何說服libav將它們轉換爲I幀或P-幀? –

回答

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); 

您可以檢查這個工程給予了無效的配置文件名稱,那麼庫會告訴你標準錯誤的有效配置文件名稱。

相關問題