博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
x264 -----FFmpeg与libx264接口源代码简单分析
阅读量:3918 次
发布时间:2019-05-23

本文共 3351 字,大约阅读时间需要 11 分钟。

在这里插入图片描述

//libx264对应的AVCodec结构体AVCodec ff_libx264_encoder = {
.name = "libx264", .long_name = NULL_IF_CONFIG_SMALL("libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"), .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_H264, .priv_data_size = sizeof(X264Context),//与之对应的x264的AVCodeContext中的void * priv_data👉👉👉X264Context *x4 .init = X264_init, .encode2 = X264_frame, .close = X264_close, .capabilities = CODEC_CAP_DELAY | CODEC_CAP_AUTO_THREADS, .priv_class = &x264_class, .defaults = x264_defaults, .init_static_data = X264_init_static,};从ff_libx264_encoder定义中可以看出: init()指向X264_init(), encode2()指向 X264_frame(), close()指向 X264_close()。此外priv_class指向一个x264_class静态结构体,该结构体是libx264对应的AVClass,定义如下。static const AVClass x264_class = {
.class_name = "libx264", .item_name = av_default_item_name, .option = options,//选项 .version = LIBAVUTIL_VERSION_INT,};x264_class中的option指向一个options[]静态数组,其中包含了libx264支持的AVOption选项,如下所示。//FFmpeg针对libx264提供的可以通过AVOption设置的选项#define OFFSET(x) offsetof(X264Context, x)#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAMstatic const AVOption options[] = {
{
"preset", "Set the encoding preset (cf. x264 --fullhelp)", OFFSET(preset), AV_OPT_TYPE_STRING, {
.str = "medium" }, 0, 0, VE}, {
"tune", "Tune the encoding params (cf. x264 --fullhelp)", OFFSET(tune), AV_OPT_TYPE_STRING, {
0 }, 0, 0, VE}, {
"profile", "Set profile restrictions (cf. x264 --fullhelp) ", OFFSET(profile), AV_OPT_TYPE_STRING, {
0 }, 0, 0, VE}, {
"fastfirstpass", "Use fast settings when encoding first pass", OFFSET(fastfirstpass), AV_OPT_TYPE_INT, {
.i64 = 1 }, 0, 1, VE}, {
"level", "Specify level (as defined by Annex A)", OFFSET(level), AV_OPT_TYPE_STRING, {
.str=NULL}, 0, 0, VE}, {
"passlogfile", "Filename for 2 pass stats", OFFSET(stats), AV_OPT_TYPE_STRING, {
.str=NULL}, 0, 0, VE}, {
"wpredp", "Weighted prediction for P-frames", OFFSET(wpredp), AV_OPT_TYPE_STRING, {
.str=NULL}, 0, 0, VE}, {
"x264opts", "x264 options", OFFSET(x264opts), AV_OPT_TYPE_STRING, {
.str=NULL}, 0, 0, VE}, ....... {
NULL },};options[]数组中包含的选项支持在FFmpeg中通过AVOption进行设置。

下面是3个主要函数:初始化 编码 关闭

X264_init()调用了如下函数:	[libx264 API] x264_param_default():设置默认参数。//传参AVCodecContext👉👉决定avctx->priv_data(x264context)中的参数 priv_data(x264context)中的部分参数决定另一部分参数	[libx264 API] x264_param_default_preset():设置默认preset。	convert_pix_fmt():将FFmpeg像素格式转换为libx264像素格式。	[libx264 API] x264_param_apply_profile():设置Profile。	[libx264 API] x264_encoder_open():打开编码器。	[libx264 API] x264_encoder_headers():需要全局头的时候,输出头信息。X264_init()主要将各种选项值传递给libx264。这些选项有两个来源:AVCodecContext和X264Context。	AVCodecContext中包含了编码器的一些通用选项,	而X264Context包含了一些libx264特有的选项。//FFmpeg中的一些选项的单位和libx264中对应选项的单位是不一样的,因此需要做一些转换。例如像素格式的转换函数convert_pix_fmt()就是完成了这个功能。X264_frame()调用了如下函数://输入:AVFrame	//↓格式转换↓	[libx264 API] x264_encoder_encode():编码一帧数据。	//输入x264_picture_t	//输出x264_nal_t	[libx264 API] x264_encoder_delayed_frames():输出编码器中缓存的数据。	encode_nals():将编码后得到的x264_nal_t转换为AVPacket。	//输入:x264_nal_t👉👉输出:AVPacket	//将sei数据+多个nal数据连续写入packet->dataX264_close()调用了如下函数:	[libx264 API] x264_encoder_close():关闭编码器。

转载地址:http://zbhrn.baihongyu.com/

你可能感兴趣的文章
Linux的ip指令
查看>>
mount(挂载)详解
查看>>
Centos7安装pssh2.3版本
查看>>
pssh(1) - Linux man page
查看>>
pssh参数及例子
查看>>
linux grep指令
查看>>
grep -w和grep -e使用
查看>>
ks.cfg文件参数详解
查看>>
Linux 标准目录结构
查看>>
Centos7 tftp安装配置
查看>>
TFTP相关指令内容
查看>>
Centos7 安装http
查看>>
log目录
查看>>
Centos7安装DHCP服务
查看>>
dhcpd.conf配置
查看>>
systemctl命令
查看>>
Windows域帐户的好处 域控制器的优点介绍
查看>>
swap分区
查看>>
固态硬盘与普通硬盘区别
查看>>
Linux压缩文件格式总结
查看>>