我正在编写一个小工具,将视频转换为原始h264文件。这些文件稍后将由SIP电话播放。我有以下代码:
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 :(得分:3)
您应该在编解码器上下文的私有部分设置选项:
av_opt_set(eccx->priv_data, "profile", "baseline", 0);
当然假设eccx
是AVCodecContext
个实例。然后用
avcodec_open2(eccx, codec, NULL);
其中codec
是您的AVCodec
个实例,您应该已经使用类似的内容:
AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264);
您可以通过提供无效的个人资料名称来检查这是否有效,然后该库会告诉您标准错误的有效个人资料名称。
答案 1 :(得分:1)
vprofile
是一个avconv选项(无论如何都是未记录/已弃用/不推荐使用,请改用-profile:v
)。 avconv解析它,实际发送到libavcodec
的选项名称只是profile
。这就是你应该使用的。