如何在c++中使用libav设置x264基线配置文件
How to set x264 baseline profile with libav in C++
我正在编写一个小工具,它将视频转换为原始的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电话有用,我会很酷。非常感谢!
您应该在编解码器上下文的私有部分设置选项:
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);
您可以通过提供一个无效的配置文件名称来检查这是否有效,然后库将在标准错误中告诉您有效的配置文件名称。
vprofile
是一个avconv选项(并且无论如何都是一个未记录/已弃用/不推荐使用的选项,使用-profile:v
代替)。avconv解析它,实际上被发送到libavcodec
的选项名称只是profile
。这就是你应该使用的
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 如何在24位SDL_Surface上设置像素的颜色
- std::设置自定义比较器
- 如何设置一个范围来提取我想要获得的信息
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 通过选项卡的文本设置QTabWidget顺序
- 在 libav格式中设置"re"标志
- 如何在c++中使用libav设置x264基线配置文件