2013-04-12 18 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); 

您可以检查这个工程给予了无效的配置文件名称,那么库会告诉你标准错误的有效配置文件名称。

相关问题