当前位置:   article > 正文

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

深入理解ffmpeg pdf

深入解析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调用这些插件的呢?见后续章节。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/646963
推荐阅读
相关标签
  

闽ICP备14008679号