zoukankan      html  css  js  c++  java
  • 3——FFMPEG之解复用器-----AVInputFormat(转)

    1. 数据结构

    AVInputFormat为FFMPEG的解复用器对象,通过调用av_register_all(),FFMPEG所有的解复用器保存在以first_iformat为链表头的链表中,且还有个链表尾指针last_iformat。

    以ff_srt_demuxer为例子来看看该结构体的初始化流程。

    先看ff_srt_demuxer的定义:

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. AVInputFormat ff_srt_demuxer = {  
    2.     .name        = "srt",  
    3.     .long_name   = NULL_IF_CONFIG_SMALL("SubRip subtitle"),  
    4.     .priv_data_size = sizeof(SRTContext),  
    5.     .read_probe  = srt_probe,  
    6.     .read_header = srt_read_header,  
    7.     .read_packet = srt_read_packet,  
    8.     .read_seek2  = srt_read_seek,  
    9.     .read_close  = srt_read_close,  
    10. };  

    易知,name成员为解复用器的名称,long_name为对应的文件格式,priv_data_size为和解复用器关联的对象(SRTContext)的大小,read_probe,read_header,read_packet,read_seek2,read_close分别为探测函数,读头函数,读包函数,seek函数及close函数指针。先看SRTContext定义,再看看这几个具体的函数。

    SRTContext定义:

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. typedef struct {  
    2.     AVPacket *subs;         //字幕包数组  
    3.     int nb_subs;            //字幕包条数  
    4.     int allocated_size;     //(每条)字幕的大小  
    5.     int current_sub_idx;    ///当前字幕索引  
    6.     enum sub_sort sort;     ///字幕排序方式  
    7. } FFDemuxSubtitlesQueue;  

    从代码(比如srt_read_packet)易知,解复用器的关联对象指针存储在AVFormatContext的priv_data成员中。

    srt_probe()是探测函数,它从AVProbeData对象的buf成员中读取数据,然后探测2次是否存在以下规则的字符串,若存在,则返回AVPROBE_SCORE_MAX,否则返回0:

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. "%*d:%*2d:%*2d%*1[,.]%*3d --> %*d:%*2d:%*2d%*1[,.]%3d"  

    即srt的格式要为:

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. 1  
    2. 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

  • 相关阅读:
    【20210930】连岳摘抄
    【20211002】连岳摘抄
    网站首页head区代码规范(网页设计师必看)
    让你的VMware Workstation随主系统自动启动
    asp中使用图片验证码的方法
    文本筐怎样让它只能输入数字(以及怎么只能输入一个小数点和数字)
    asp通用分页函数
    系统安装秘技:精心打造WinXP万能GHOST(图)
    asp调用存储过程
    在 win2k3 下安装 webeasymail
  • 原文地址:https://www.cnblogs.com/xihong2014/p/6707826.html
Copyright © 2011-2022 走看看