FFmpeg中av_opt_set()的使用

在使用FFmpeg库进行编码的时候,由于需要设置AVCodecContext的参数值,需要使用到av_opt_set()这个函数,该函数被声明在libavutil\opt.h中,用来设置AVOption。这个函数的兄弟成员有:

int av_opt_set         (void *obj, const char *name, const char *val, int search_flags);
int av_opt_set_int     (void *obj, const char *name, int64_t     val, int search_flags);
int av_opt_set_double  (void *obj, const char *name, double      val, int search_flags);
int av_opt_set_q       (void *obj, const char *name, AVRational  val, int search_flags);
int av_opt_set_bin     (void *obj, const char *name, const uint8_t *val, int size, int search_flags);
int av_opt_set_image_size(void *obj, const char *name, int w, int h, int search_flags);
int av_opt_set_pixel_fmt (void *obj, const char *name, enum AVPixelFormat fmt, int search_flags);
int av_opt_set_sample_fmt(void *obj, const char *name, enum AVSampleFormat fmt, int search_flags);
int av_opt_set_video_rate(void *obj, const char *name, AVRational val, int search_flags);
int av_opt_set_channel_layout(void *obj, const char *name, int64_t ch_layout, int search_flags);

他们之间的不同是第三个参数,av_opt_set()中第三个参数是一个字符串,值为val, 用来设置obj中的name值,而其他函数多了一些后缀比如int double,使用这些函数设置参数值的时候不需要使用字符串,使用对用的变量类型就可以。

AVOption是存储在AVClass结构体中的,AVClass中的成员变量option必须指向一个AVOption类型的静态数组。如果一个结构体要支持AVOption的话,它的第一个成员必须是一个指向AVClass结构体的指针,比如上面提到的AVCodecContext,以及AVFormatContext等等。AVClass的作用就是给结构体如AVCodecContext增加AVOption功能的支持,起到了AVCodecContext与AVOption之间的桥梁作用,即:AVCodecContext中包含AVClass,AVClass中包含AVOption。

AVOption除了可以对常用的结构体AVFormatContext、AVCodecContext等进行设置之外,还可以对它们的私有数据priv_data进行赋值。这些字段里面通常存储了各种编码器特有的结构体。如使用libx264进行编码的时候,通过AVCodecContext的priv_data字段可以对X264Context(libavcodec\libx264.c)结构体中的变量进行赋值,设置preset、profile等
FFmpeg中av_opt_set()的使用_第1张图片

下面针对AVCodecContext进行举例。
FFmpeg中av_opt_set()的使用_第2张图片
AVCodecContext中的第一个AVClass成员定义于libavcodec\options.c中
FFmpeg中av_opt_set()的使用_第3张图片
这里有一个重要的参数option,指向了avcodec_options,这个数组单独定义于:libavcodec\options_table.h中
FFmpeg中av_opt_set()的使用_第4张图片
比如参数 b,代表的是AVCodecContext中的 bitrate,在使用av_opt_set函数的之后,可以这样对AVCodecContext中的bitrate 进行设置。
av_opt_set(pCodecCtx,“b”,”400000”,0); // bitrate
如果使用av_opt_set函数设置AVCodecContext参数,不知道参数值对应的字符串是什么的时候,可以查阅这个static const AVOption avcodec_options[]数组(位于libavcodec\options_table.h),如果要设置AVFormat,就在libavformat\options_table.h中查阅static const AVOption avformat_options[]。
此外,上面提到可以对AVCodecContext的私有数据priv_data进行赋值。
libx264中的AVClass为:
static const AVClass x264_class = {
.class_name = “libx264”,
.item_name = av_default_item_name,
.option = options,
.version = LIBAVUTIL_VERSION_INT,
}; // options指向的数组位于libavcodec\libx264.c中的static const AVOption options[]。
如设置preset:
av_opt_set(pCodecCtx->priv_data,“preset”,”slow”,0); preset参数在libavcodec\libx264.c中:
FFmpeg中av_opt_set()的使用_第5张图片
这里的参数”slow”是哪里来的呢?雷神的代码里有提示(http://blog.csdn.net/leixiaohua1020/article/details/46890739)
FFmpeg中av_opt_set()的使用_第6张图片
经搜索,是在x264的源文件x264.h里:C:\Users\LLX\Desktop\x264\x264-snapshot-20180110-2245\x264.h。
FFmpeg中av_opt_set()的使用_第7张图片
总结一下:本片文章主要简单梳理的一下av_opt_set()的使用,其中大部分内容是出自雷神的:最简单的基于FFmpeg的AVUtil例子 (AVLog, AVOption等)(链接:http://blog.csdn.net/leixiaohua1020/article/details/46890739)其中包括AVClass、AVOption、以及AVOption参数option存在的位置,在使用av_opt_set()对AVCodecContext等结构体里参数进行设置之外,还可以对它们的私有数据priv_data进行赋值(比如:libavcodec\options_table.h、x264源代码里的x264.h)。

你可能感兴趣的:(音视频开发)