从多媒体播放器基础知识中知道,解复用器的目的就是把不同的流从容器中分离(解析出来),FFMPEG中的流对象为AVStream,他是由解复用器的read_header()函数创建,并保存在AVFormatContext的nb_streams(容器中的流条数)及streams数组中。
以ff_srt_demuxer为例子,它的read_header()指向srt_read_header()函数,该函数主要完成以下功能:
1. 调用avformat_new_stream()创建一条流;
a. 调整AVFormatContext->streams的大小;
b. 申请流空间并清零;
c. 申请AVStream->info空间并清零;
d. 申请AVStream->codec(AVCodecContext对象)空间并设置默认值(由avcodec_get_context_defaults3()设置);
c. 设置流的其余参数默认值(目前大部分的成员不知道作用,因此先不关注);
d. 将流指针放入到AVFormatContext->streams数组的末尾。
2. 设置AVStream->codec->codec_type及AVStream->codec->codec_id分别为AVMEDIA_TYPE_SUBTITLE,AV_CODEC_ID_SUBRIP;
3. 循环读入每一条字幕(ff_subtitles_read_chunk()),并从中解析出字幕信息(pts,duration及字幕内容),然后调用ff_subtitles_queue_insert()将
字幕内容插入队列并返回AVPacket指针(以便于插入从字幕中解出的私有数据??);
4. 读入完成后,调用ff_subtitles_queue_finalize()对队列中的数据进行排序,并调整字幕持续时间(如果有必要)。