3——FFMPEG之解复用器-----AVInputFormat(转)
1. 数据结构:
AVInputFormat为FFMPEG的解复用器对象,通过调用av_register_all(),FFMPEG所有的解复用器保存在以first_iformat为链表头的链表中,且还有个链表尾指针last_iformat。
以ff_srt_demuxer为例子来看看该结构体的初始化流程。
先看ff_srt_demuxer的定义:
- AVInputFormat ff_srt_demuxer = {
- .name = "srt",
- .long_name = NULL_IF_CONFIG_SMALL("SubRip subtitle"),
- .priv_data_size = sizeof(SRTContext),
- .read_probe = srt_probe,
- .read_header = srt_read_header,
- .read_packet = srt_read_packet,
- .read_seek2 = srt_read_seek,
- .read_close = srt_read_close,
- };
易知,name成员为解复用器的名称,long_name为对应的文件格式,priv_data_size为和解复用器关联的对象(SRTContext)的大小,read_probe,read_header,read_packet,read_seek2,read_close分别为探测函数,读头函数,读包函数,seek函数及close函数指针。先看SRTContext定义,再看看这几个具体的函数。
SRTContext定义:
- typedef struct {
- AVPacket *subs; //字幕包数组
- int nb_subs; //字幕包条数
- int allocated_size; //(每条)字幕的大小
- int current_sub_idx; ///当前字幕索引
- enum sub_sort sort; ///字幕排序方式
- } FFDemuxSubtitlesQueue;
从代码(比如srt_read_packet)易知,解复用器的关联对象指针存储在AVFormatContext的priv_data成员中。
srt_probe()是探测函数,它从AVProbeData对象的buf成员中读取数据,然后探测2次是否存在以下规则的字符串,若存在,则返回AVPROBE_SCORE_MAX,否则返回0:
- "%*d:%*2d:%*2d%*1[,.]%*3d --> %*d:%*2d:%*2d%*1[,.]%3d"
即srt的格式要为:
- 1
- 00:00:02,436 --> 00:00:06,505
即一行索引+“开始时间-->结束时间”的形式。
srt_read_header()是读头函数(可以看作是初始化函数),该函数实际上把字幕文件中多有的字幕都解析了出来放在FFDemuxSubtitlesQueue对象的队列中。(AVStream???)
注意:1. 该函数会创建流(AVStream),并将流保存到AVFormatContext的streams数组中。
2. 该函数读写文件内容时用的是AVFormat的pb成员(即AVIOContext)。
3. 该函数最后调用了ff_subtitles_queue_finalize()对字幕包进行排序。
srt_read_packet()是读包函数,该函数实际上是从FFDemuxSubtitlesQueue中将当前字幕索引指向的字幕拷贝到传入的包中。(AVPacket???)
srt_read_seek()是搜索函数。
srt_read_close()是关闭函数,主要是释放队列成员及队列本身所占的内存空间。
2. 函数调用:
即:
1. init_input()先调用avio_open2()创建并打开一个AVIOContext对象,用于文件读写;
2. init_input()然后调用av_probe_input_buffer2()探测解复用器类型;
3. av_probe_input_buffer2()包含三个步骤:avio_read()读入探测数据(AVProbeData),然后调用av_probe_input_format2()探测合适的解复用器,最后调用ffio_rewind_witdh_probe_data()将探测数据返回给AVIOContext的缓冲buffer。
av_probe_input_format2()调用av_probe_input_format3(),将得到的匹配分数与要求的匹配值相比较,如果匹配分数>匹配值,这返回得到的解复用器,否则返回NULL。
av_probe_input_format3(),该函数遍历所有的解复用器,调用它们的read_probe()函数计算匹配得分,如果解复用器定义了文件扩展名,还会比较输匹配数据跟扩展名的匹配得分。函数最终返回计算找到的最匹配的解复用器,并将匹配分数也返回。
http://blog.csdn.net/finewind/article/details/39502963
3——FFMPEG之解复用器-----AVInputFormat(转)的更多相关文章
- XBMC源代码简析 5:视频播放器(dvdplayer)-解复用器(以ffmpeg为例)
XBMC分析系列文章: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) XBMC源代码分析 3:核心部分(core)-综述 XBMC源代码分析 4: ...
- FFmpeg详解
认识FFMPEG FFMPEG堪称自由软件中最完备的一套多媒体支持库,它几乎实现了所有当下常见的数据封装格式.多媒体传输协议以及音视频编解码器.因此,对于从事多媒体技术开发的工程师来说,深入研究FFM ...
- ffmpeg 详解
来源:http://blog.itpub.net/9399028/viewspace-1242300/ FFMPEG详解 认识FFMPEG FFMPEG堪称自由软件中最完备的一套多媒体支持库,它几 ...
- FFmpeg4.0笔记:封装ffmpeg的解封装功能类CDemux
Github https://github.com/gongluck/FFmpeg4.0-study/tree/master/Cff CDemux.h /*********************** ...
- FFmpeg(二) 解封装相关函数理解
一.解封装基本流程 ①av_register_All()////初始化解封装,注册解析和封装的格式. ②avformat_netword_init()//初始化网络,解析rtsp协议 ③avforma ...
- window64 PHP ffmpeg详解简单上手 音频amr转mp3
从网上找了一大堆关于window 64 ffmpeg的信息,都是又长又不关键,让人难消化. 我只要简单的amr转MP3格式而已. 终于搞明白.自己总结了下! 希望能帮助到喜欢言简意赅,一眼上手的同学. ...
- FFmpeg软硬解和多线程解码
一. AVCodecContext解码上下文 1.avcodec_register_all() : 注册所有的解码器 2.AVCodec *avcodec_find_decoder(enum AVCo ...
- FFmpeg结构体:AVInputFormat
1.描述 AVInputFormat 是类似COM 接口的数据结构,表示输入文件容器格式,着重于功能函数,一种文件容器格式对应一个AVInputFormat 结构,在程序运行时有多个实例,位于avof ...
- FFmpeg开发笔记(四):ffmpeg解码的基本流程详解
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
随机推荐
- 【知识总结】Java类初始化顺序说明
微信公众号:努力编程的小猪如有问题或建议,请公众号留言 Java类初始化顺序说明 一个类中包含如下几类东西,他们前后是有顺序关系的 静态属性:static 开头定义的属性 静态方法块: static ...
- STM32 DMA简述
STM32 DMA简述 DMA (Direct Memory Access) 直接内存存储器,在做数据传输时能够大大减轻CPU的负担. DMA的作用 DMA提供了一个关于数据的高数传输通道,这个通道不 ...
- supervisor初试
Supervisor (http://supervisord.org) 是一个用 Python 写的进程管理工具,可以很方便的用来启动.重启.关闭进程(不仅仅是 Python 进程).除了对单个进程的 ...
- 转载:使用 OpenCV 识别 QRCode
原文链接:http://coolshell.cn/articles/10590.html#jtss-tsina 识别二维码的项目数不胜数,每次都是开箱即用,方便得很. 这次想用 OpenCV 从零识别 ...
- FMC简介
FMC简介 FMC ( FPGA Mezzanine Card ) 简而言之,是具有特定功能的子卡模块. Developed by a consortium of companies ranging ...
- 支线任务2-Basic Calculator
问题描述: 题目要求我们实现一个简单的加减计算器,计算一个表达式的值,表达式除了数字之外还可能会含有括号,加减符号以及空格. 思路: 其实看到这个题自然就会想到利用后缀式求表达式值的算法作业题,况且这 ...
- jenkins svn源码管理小记
之前对Jenkins管理SVN源码的逻辑不太清楚,简单研究了一下.对于一般的开发通常会有以下三个环境: 1.svn服务器 2.Jenkins服务器 3.开发服务器(部署测试版web应用或者其他应用) ...
- BZOJ4811 [Ynoi2017]由乃的OJ
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- Linux常用命令--网终设置
1.把自己(sa)添加到sudoers配置文件中,以便于获取权限 vim /etc/sudoers 编辑文件(部分centOS版本没有vim命令,则用vi即可) 找到[root ALL=(ALL) A ...
- SpringMVC注解@RequestMapping @RequestParam @ResponseBody 和 @RequestBody 解析
SpringMVC Controller层获取参数及返回数据的方式: @RequestMapping @RequestMapping(“url”),这里的 url写的是请求路径的一部分,一般作用在 C ...