深入解析ffmpeg-(1)基础架构

深入解析ffmpeg-(1)基础架构

本文编写时使用的最新ffmpeg4.4版本,与ffmpeg3.x会存在一些区别。

一、主要模块


主要模块:

  • libavcodec 提供格式编解码服务
  • libavfilter 提供滤镜管道服务,例如视频的缩放、旋转、裁剪和拼接,音频重采样
  • libavformat 容器或流格式的打包和解包服务,例如用h264、aac、字幕合成mp4,从接收的rtp流解析音视频数据等,要注意区别于 libavcodec
  • libavdevice 音视频设备的录制和播放服务,例如列出可用设备,录制摄像头,播放视频等

辅助工具:

  • libswresample 音频混合与重采样相关
  • libswscale 颜色转换和图像缩放相关
  • libavutil 其他工具

附带一提:名称 libav* 当中的 av 指 audio 和 video

二、插件系统

ffmpeg的主要模块均使用的插件模式来构建,在编译时通过传参来选择启用和关闭对应插件,来保证部署文件不会太过臃肿。例如在 configure 时用 --enable-decoder=h264 来启用h264解码器插件,而该插件归属于 libavcodec,对应源码会编译到 libavcodec.so 当中。

插件框架


1、插件形式

插件的形式有两种,一是自带源码,二是引入第三方库,例如ffmpeg中的h264编码能力,对应的插件来自第三方库libx264,适配文件是 ffmpeg/libavcodec/libx264.c


2、插件适配

适配文件的主要作用是区分不同种类的插件,并统一调用接口。

编码过程主要是实现一个结构体,该结构体定义为一个全局变量,ffmpeg会把这个结构体 extern 过去,通过它来控制插件。

不同类型的插件会使用不同的结构体类型,例如注册到 libavcodec 的插件使用 AVCodec、注册到 libavfilter 使用 AVFilter,而这些结构体格式都都具有高度相似性,具体会在后续各模块章节中介绍到。

下图为h264编码器的适配文件,及其定义的适配结构体:
h264编码器的适配文件


3、插件编译

configure 时传入启用配置如 --enable-encoder=libx264 会生成相应宏 CONFIG_LIBX264_ENCODER=1 和 Makefile,Makefile 根据宏判断添加对应源码,最后编译集成到对应模块的动态库中。

下图为Makefile根据宏判断添加插件源文件参与编译:
在这里插入图片描述


4、插件收集

前面 configure 时还会为各模块生成一个xxx_list.c文件,文件内容是各插件适配文件的结构体数组,该过程等于把注册到模块下的插件全都收集了起来。

在 ffmpeg3.X 版本中使用链表来收集插件结构体,在调用 xxx_register_all() 时添加各结构体到链表中;而在 ffmpeg4.4 版本中 xxx_register_all() 不需要该过程,只保留插件静态初始化操作。

(所谓静态初始化就是对插件的静态配置,可以理解为修改了插件本地用 static 定义的参数,不管该插件开了多少个实例,都受该参数影响)

在 allcodecs.c 中 extern 引入注册到 avcodec 的插件结构体:
在这里插入图片描述

为 avcodec 模块生成的插件数组,把注册插件结构体整理为数组:
在这里插入图片描述
在 allfilters.c 中 extern 引入注册到 avfilter 的插件结构体:
在这里插入图片描述

为 avfilter 模块生成的插件数组,把注册插件结构体整理为数组:
在这里插入图片描述


至此,从插件准备,到编译集成,ffmpeg准备就绪,那么用户app是怎么透过api调用这些插件的呢?见后续章节。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值