上一篇讲完 命令行参数 是如何解析到全局变量的,这篇文章主要分析 writer_open()
函数,
FFprobe 支持几种输出格式,default
,xml
,json
。每种格式都有各自的 Writer
,xml_writer
,json_writer
,default_writer
等等。
writer_open()
这个函数主要是初始化 WriterContext
。下图以 default_writer
为例,展示初始化完成之后的数据结构关系。
上图的数据结构非常精妙,他定义一个 struct WriterContext
作为一个通用 writer
的上下文,AVClass
里面有一个 writer_options
通用设置。然后他里面还有一个 void * priv
用来存储不通用的context
,这个 context
里面也有一个 default_option
作为独立的设置选项。
这种 通用 context
套 独立contexnt
的用法,在 ffmpeg
整个项目是非常常见的,好几处地方都是如此,推荐阅读雷神文章,结构体成员管理系统-AVOption
这就是内核+插件的模式。通用的就是内核,不通用的就是插件。例如
AVCodecContext
里面包一个独立的 H264 contexnt
。
AVCodecContext
里面包一个独立的 HEVC contexnt
。
用 ffmpeg
编解码 api
,只需用到 AVCodecContext
。
其实不必太过纠结 writer 的实现,把他看成一个 print 的封装就行,writer 不会影响到编解码之类的东西,writer只是决定输出格式。
©版权所属:知识星球:弦外之音,QQ:2338195090。
由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。