在ffmpeg中添加编解码器

本文基于ffmpeg-2.2,添加基于QSV(Intel Media SDK / Quick Sync Video)的系列编解码器qsvavc_enc、qsvavc_dec、qsvmpeg2_dec、 qsvvc1_dec,通过一个命令行参数--enable-qsv打开和关闭。

1. 在libavcodec目录添加相应的代码实现

可参考hevc.c, libx265.c。如qsvdec.c,qsvenc.c。

文件名可以随意起,实现中注意下面红字标出的地方需注意。

ff_qsvavc_decoder/ff_qsvavc_encoder是全局变量,在libavcodec/allcodecs.c中调用REGISTER_ENCDEC宏注册编解码器时会引用此全局变量,因此要保值一致。

.name项影响到ffmpeg命令行参数-vcodec的名称。

AVCodec ff_qsvavc_decoder = {

.name           = "qsvavc",

.long_name      = NULL_IF_CONFIG_SMALL("H.264 / AVC Decoder via Intel Media SDK / Quick Sync Video (QSV)"),

.type           = AVMEDIA_TYPE_VIDEO,

.id             = AV_CODEC_ID_H264,

.priv_data_size = sizeof(qsvContext),

.init           = qsv_decode_init_avc,

.close          = qsv_decode_close,

.decode         = qsv_decode_frame,

.flush          = qsv_decode_flush,

.capabilities   = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_TRUNCATED,

};

2. 在libavcodec/allcodecs.c中添加编解码器的注册

REGISTER_ENCODER(QSVAVC,            qsvavc);

REGISTER_DECODER(QSVAVC,            qsvavc);

REGISTER_DECODER(QSVMPEG2,          qsvmpeg2);

REGISTER_DECODER(QSVVC1,            qsvvc1);

allcodecs.c定义了REGISTER_ENCDEC,REGISTER_DECODER,REGISTER_ENCODER三个宏,用于注册编码解码器,仅编码器,仅解码器。

查看REGISTER_DECODER的宏定义可以看到,先引用全局的ff_xxx_decoder变量,然后调用avcodec_register()函数添加到解码器列表中。

#define REGISTER_DECODER(X, x)                                          \

{                                                                   \

extern AVCodec ff_##x##_decoder;                                \

if (CONFIG_##X##_DECODER)                                       \

avcodec_register(&ff_##x##_decoder);                        \

}

3. 在libavcodec/Makefile中添加目标文件

将.c文件名替换为.o

OBJS-$(CONFIG_QSV)              += qsvdec.o

OBJS-$(CONFIG_QSV)              += qsvenc.o

OBJS-$(CONFIG_QSVAVC_DECODER)              += qsvdec.o

OBJS-$(CONFIG_QSVAVC_ENCODER)              += qsvenc.o

$(CONFIG_XXX)在./configure时生成的config.mak中定义。

4. 修改configure文件,使编解码器可以在./configure时禁用和启用

这个步骤是网上一些文章中没有的。

搜索show_help()函数,添加./configure --help时的帮助显示,非必须。

--enable-qsv           enable codecs via Intel Media SDK

在EXTERNAL_LIBRARY_LIST变量中添加qsv,否则./configure --enable-qsv会提示没有这个选项。另外,./configure会根据此生成config.h的#define CONFIG_QSV 1和config.mak的CONFIG_QSV=yes。

添加依赖关系,将qsvavc_decoder/qsvavc_encoder和--enable-qsv的配置项关联起来。

可以搜索“libx264_encoder_deps”,在后面添加。

qsvavc_decoder_deps="qsv"

qsvavc_encoder_deps="qsv"

qsvmpeg2_decoder_deps="qsv"

qsvvc1_decoder_deps="qsv"

添加依赖库的检查。可以搜索“enabled libx264”在后面添加。

enabled qsv             && { check_lib mfxvideo.h MFXInit -lmfxhw64 -lva -lva-drm ||

die "ERROR: Intel Media SDK not found"; }

5. configure时相关宏定义和环境变量的生成

config.h

#define CONFIG_QSV 1

#define CONFIG_QSVAVC_DECODER 1

#define CONFIG_QSVMPEG2_DECODER 1

#define CONFIG_QSVVC1_DECODER 1

#define CONFIG_BINTEXT_DECODER 1

config.mak

CONFIG_QSV=yes

CONFIG_QSVAVC_DECODER=yes

CONFIG_QSVMPEG2_DECODER=yes

CONFIG_QSVVC1_DECODER=yes

CONFIG_BINTEXT_DECODER=yes

$ALL_COMPONENTS -> $DECODER_LIST -> find_things() 通过sed提取allcodecs.c中的编码解码器,添加到$ALL_COMPONENTS列表中。

configure -> check_deps() $ALL_COMPONENTS 默认为yes -> do_check_deps()根据qsvavc_decoder_deps的依赖关系检测,disable不符合依赖关系的。如qsvavc_decoder的依赖设置为qsvavc_decoder_deps="qsv",configure时不添加--enable-qsv参数,qsvavc_decoder的值先设置为yes,do_check_deps()时检测不满足依赖关系,将qsvavc_decoder的值改为no。

configure -> print_config() 读取$ALL_COMPONENTS每项的值,在config.h或config.mak中生成相应的宏定义或环境变量。如qsvavc_decoder项的值为no,生成#define CONFIG_QSVAVC_DECODER 0,config.mak中的CONFIG_QSVAVC_DECODER=yes被注掉。

map ‘eval echo "$v \${$v:-no}"‘ "[email protected]"

如果qsvavc_decoder_deps="qsv"没有被正确添加,会生成#define CONFIG_QSVAVC_DECODER 1和CONFIG_QSVAVC_DECODER=yes,而导致相应模块被误编译,但关联库和头文件的搜索路径未添加,从而会导致编译错误。

来自为知笔记(Wiz)

在ffmpeg中添加编解码器

时间: 2024-11-09 00:34:27

在ffmpeg中添加编解码器的相关文章

ffmpeg 中添加264支持

转自:http://blog.sina.com.cn/s/blog_513f4e8401011yuq.html ffmpeg 中带有264的解码,没有编码,需要添加x264: 参考百度上的“windows_ffmpeg编译 ” 文档 下载ffmpeg 代码合x264代码, ffmpeg 代码:http://ffmpeg.org/ x264代码:http://www.videolan.org/developers/x264.html 相关资源获取的地方: http://ffmpeg.zeranoe

Gstreamer中添加x265编解码器

官方的当前gstreamer版本还不支持x265编解码,因此要添加x265,需要自己编译.本文基于gstreamer1.3.3版进行编译安装.需要首先自己编译gstreamer1.3.3,以及相应的base.good.bad.ugly插件 一.安装编译x265编码器 1.     下载源码. 开源x265编码器的官方网站是 https://bitbucket.org/multicoreware/x265/wiki/Home 源码下载地址: hg clone https://bitbucket.o

Ffmpeg drawtext 向视频中添加文字

Ffmpeg支持添加文字功能,具体如何将文字叠加到视频中的每一张图片,FFmpeg调用了文字库FreeSerif.ttf.当我们 用到ffmpeg 添加文字功能时 我们需要先下载改文字库,下载地址是http://www.fonts2u.com/free-serif.font,这算是 前期准备工作.准备工作完成以后,我来介绍下Ffmpeg实现视频文件添加文字功能的基本流程,流程图如下图所示: 图1. Ffmpeg 向视频添加文字流程

零基础学习视频解码之FFMpeg中比较重要的函数以及数据结构(转)

在正式开始解码练习前先了解下关于FFmpeg中比较重要的函数以及数据结构. 1. 数据结构:  (1) AVFormatContext  AVFormatContext是一个贯穿始终的数据结构,很多函数都要用到它作为参数.FFmpeg代码中对这个数据结构的注释是:format I/O context 此结构包含了一个视频流的格式内容.其中存有了AVInputFormat(or AVOutputFormat同一时间AVFormatContext内只能存在其中一个),和AVStream.AVPack

[原]零基础学习视频解码之FFMpeg中比较重要的函数以及数据结构

在正式开始解码练习前先了解下关于FFmpeg中比较重要的函数以及数据结构. 1. 数据结构:  (1) AVFormatContext  AVFormatContext是一个贯穿始终的数据结构,很多函数都要用到它作为参数.FFmpeg代码中对这个数据结构的注释是:format I/O context 此结构包含了一个视频流的格式内容.其中存有了AVInputFormat(or AVOutputFormat同一时间AVFormatContext内只能存在其中一个),和AVStream.AVPack

(转)ffmpeg 中 av_read_frame_internal分析

作者: chenwei1983    时间: 2012-3-5 04:21 PM标题: ffmpeg 中 av_read_frame_internal分析                            原出处:http://www.chinavideo.org/viewthread.php?action=printable&tid=13846av_read_frame_internal 在ffmpeg中实现了将format格式的packet,最终转换成一帧帧的es流packet,并解析填

ffmpeg中av_log的实现分析

[时间:2017-10] [状态:Open] [关键词:ffmpeg,avutil,av_log, 日志输出] 0 引言 FFmpeg的libavutil中的日志输出的接口整体比较少,但是功能还是不错的,对于后续自己实现日志模块还是值得参考的.本文就libavutil中的日志模块部分的实现做一个简要的整理.希望可以达到解释清楚的目的. 注意:本部分的主要代码位于libavtuil/log.h.libavutil/log.c. 1 AVClass的定义部分 log接口的输出是依赖于AVClass的

ffmpeg中AVBuffer的实现分析

[时间:2017-10] [状态:Open] [关键词:ffmpeg,avutil,avbuffer, 引用计数] 0 引言 AVBuffer是ffmpeg提供的基于引用计数的智能指针的一个实现版本. FFmpeg中很多结构体是基于AVBuffer实现的,比如AVFrame.AVPacket. AVBuffer实现 主要实现文件位于libavutil中的buffer.h.buffer_internal.h.buffer.c三个文件中.其中最主要的是两个结构体AVBufferRef和AVBuffe

浪潮服务器向集群中添加esxi主机

软件环境:esxi6.0  vcenter6.0 硬件:浪潮服务器 hba卡 浪潮存储 博科san 要求:向目前集群中添加一台esxi主机 步骤:安装esxi6.0,配置bmc和网卡,光纤连接hba卡,注意:光纤方向,hba中发光的接到san不发光的口. 配置san交换机 配置浪潮存储 esxi中识别存储添加OK!