赞
踩
本文编写时使用的最新ffmpeg4.4版本,与ffmpeg3.x会存在一些区别。
主要模块:
libavcodec
提供格式编解码服务libavfilter
提供滤镜管道服务,例如视频的缩放、旋转、裁剪和拼接,音频重采样libavformat
容器或流格式的打包和解包服务,例如用h264、aac、字幕合成mp4,从接收的rtp流解析音视频数据等,要注意区别于 libavcodeclibavdevice
音视频设备的录制和播放服务,例如列出可用设备,录制摄像头,播放视频等辅助工具:
libswresample
音频混合与重采样相关libswscale
颜色转换和图像缩放相关libavutil
其他工具附带一提:名称 libav* 当中的 av 指 audio 和 video
ffmpeg的主要模块均使用的插件模式来构建,在编译时通过传参来选择启用和关闭对应插件,来保证部署文件不会太过臃肿。例如在 configure 时用 --enable-decoder=h264 来启用h264解码器插件,而该插件归属于 libavcodec,对应源码会编译到 libavcodec.so 当中。
插件的形式有两种,一是自带源码,二是引入第三方库,例如ffmpeg中的h264编码能力,对应的插件来自第三方库libx264,适配文件是 ffmpeg/libavcodec/libx264.c
适配文件的主要作用是区分不同种类的插件,并统一调用接口。
编码过程主要是实现一个结构体,该结构体定义为一个全局变量,ffmpeg会把这个结构体 extern 过去,通过它来控制插件。
不同类型的插件会使用不同的结构体类型,例如注册到 libavcodec 的插件使用 AVCodec、注册到 libavfilter 使用 AVFilter,而这些结构体格式都都具有高度相似性,具体会在后续各模块章节中介绍到。
下图为h264编码器的适配文件,及其定义的适配结构体:
configure 时传入启用配置如 --enable-encoder=libx264 会生成相应宏 CONFIG_LIBX264_ENCODER=1 和 Makefile,Makefile 根据宏判断添加对应源码,最后编译集成到对应模块的动态库中。
下图为Makefile根据宏判断添加插件源文件参与编译:
前面 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调用这些插件的呢?见后续章节。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。