在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}"' "$@"
如果qsvavc_decoder_deps="qsv"没有被正确添加,会生成#define CONFIG_QSVAVC_DECODER 1和CONFIG_QSVAVC_DECODER=yes,而导致相应模块被误编译,但关联库和头文件的搜索路径未添加,从而会导致编译错误。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在 Windows 上安装 ffmpeg 的步骤: 1. 首先,从 ffmpeg 的官方网站下载 Windows 版本的二进制文件。可以从 https://ffmpeg.org/download.html 页面下载。 2. 解压下载的文件。将下载的 zip 文件解压到一个文件夹。 3. 将解压后的文件夹添加到环境变量 PATH 。可以按 Win + R 组合键打开运行窗口,输入 sysdm.cpl 打开系统属性窗口,选择“高级”选项卡,点击“环境变量”按钮,在“系统变量”区域找到 PATH 变量,双击进行辑,将 ffmpeg 的文件夹路径添加到变量值。 4. 验证 ffmpeg 是否正确安装。在命令行输入 ffmpeg,如果出现了类似以下的输出,则表示 ffmpeg 已经成功安装了。 ``` ffmpeg version 4.4 Copyright (c) 2000-2021 the FFmpeg developers built with gcc 10.2.0 (Rev3, Built by MSYS2 project) configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-libsnappy --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg libavutil 56. 70.100 / 56. 70.100 libavcodec 58.134.100 / 58.134.100 libavformat 58. 76.100 / 58. 76.100 libavdevice 58. 13.100 / 58. 13.100 libavfilter 7.110.100 / 7.110.100 libswscale 5. 9.100 / 5. 9.100 libswresample 3. 9.100 / 3. 9.100 libpostproc 55. 9.100 / 55. 9.100 ``` 安装完成后,你就可以使用 ffmpeg 进行解码操作了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值