基于SMP86 54芯片的MKV播放器设计
元素进行解析,以获得必需的音视频参数和媒体数据。MKV作为一种封装格式,实际的视频和音频数据都被封装到某一个子模块中,要想获得实际的数据,必须首先对文件进行解析,并且文件解析贯穿播放的全过程。能否有效并正确的解析,关系到读取数据的准确性,进而影响播放的效果。MKV格式采用可变长编码,能够减少存储空间,另一方面,也给解析带来了新问题。
MKV文件格式建立在EBML(Extensible Binary MetaLanguagel基础上,EBML是一种类似于XML格式的可扩展二进制元语言,使用可变长度的整数存储,以节省空间。EBML的基本结构是典型的TLV结构,有三部分组成:
![](../img/eep-analog/analog-53415li2epa4fjr.jpg)
ID标志属性类型,size为后面data部分的大小,data部分为ID所标识属性的实际数据,ID和size均为可变长编码的整数。整数的长度为length=1+[number of leading zero bits]。前面的零的个数最多为7个,即最多能表示56个比特的整数。文件中不允许出现大于56比特的数。
![](../img/eep-analog/analog-5342dcecnb4pnh1.jpg)
MKV文件格式的显著特点是模块化、结构化存储。每一个高一级的元素由若干次一级的元素组成,直至最基本的组成元素,每个元素都是一个TLV结构。一个标准的MKV文件有两部分组成:EBML Header和Segment。EBML Header由EBMLVersion、DocType等子元素组成,包含了文件的版本、文档类型等相关信息。Segment部分保存了媒体文件的视频和音频的实际数据,其data部分又可以分为SeekHead、Tracks、Cluster等若干子元素(表1)。所有元素的处理都可以按照一个统一的流程来进行。我们可以仿照TCP/IP协议分层的思想,对每一层的每个功能都用一个函数来完成,使用更底层的函数完成此项功能,并可被更高层的函数调用。文件解析时,从文件顶层开始,每当上一级的元素解析到有某个子元素时,调用此函数进行次一级的解析,依次直至文件结束,即可完成对文件的解析处理。整个MKV的解析调用过程如图3所示。Hea-der Parse和Segment Parse为文件最上层的元素解析函数,Cluster Parse、Tracks_Parse等为次一级组成元素的解析函数。ebml_read_ele-ment_idebml read element length为最底层基本组成元素的解析函数。
![](../img/eep-analog/analog-5343t4inazl0qlk.jpg)
3.2 设置硬件解码器音视频核心参数
Tracks用来描述文件中包含的每一路多媒体流的信息。一路多媒体流用一个TrackEntry描述,所有的track都要在一个Tracks中进行描述。一个TrackEntry主要包含:TrackNumber(判定属于哪一路流的ID)、TrackType(video、audio或者su^itle)、TimeScale(时间戳单位)、CodecID(编码格式);CodecPrivate(不同的编码格式所需的私有数据)等;对于视频,还包含以下信息:PixelWidth、PixelHeight等。对于音频,track还包含以下信息:channels、Sampling Frequency等。这些是关于音视频能否正确解码播放的关键参数,需要在解析时获得,然后通过硬件操纵函数设置。
Cluster包含实际的数据,一个Cluster块,通常是几秒钟时间跨度的媒体数据,一个文件有数以千计的Cluster。每个Cluster又有若干个BlockGroup。根据Cluster和BlockGroup的起始pts和持续时间,可以计算出当前Block的实际pts。PTS是用来确定播放时间的重要数据,也是音视频同步的关键信息。这部分信息要在送入视频或音频数据的同时设置硬件解码器。
3.3 性能优化
MKV封装的影片通常为高清影片,分辨率在1920×1080,即使采用H.264等先进编码格式,码率依然非常高。同时,MKV支持可变码率,可变码率能够减少文件的体积,但是剧烈波动的码率会使播放不能流畅进行。在高清文件中码率一般在10~30M/ps之间,最高可60Mp/ s,如此高的码率,如果不做特殊处理,播放时很容易出现卡顿,播放不流畅等问题。为解决这个问题,我们从两方面考虑。
在解析方面,解析的效率关系到能否尽快将数据读入缓冲区,如果处理时间过长,造成一段时间内缓冲区为空,这时候就会出现卡顿。 MKV文件中通常包含一路视频、多路音频和多路字幕,播放时只选中其中一路音频和一路字幕,其他路的数据可以被视为无效数据。在解析时,可以根据Block头的标记判断出这路数据是当前播放需要的有效数据还是无效数据。如果是有效数据,则继续解析,并将音视频数据送入缓冲区,如果是无效数据,不进行解析,直接移动文件指针到下一个Block,这样可大大加快文件解析和数据读取速度。
在播放方面,通常播放时的处理流程是读取一帧数据,然后送入硬件解码器,等到收到硬件解码器为空的信号,再读取下一帧的数据。如果是处理低码率文件的播放,这样做不会有问题,但是当文件分辨率比较高,码率比较高时,解析读取时问和解码时间都会增加,这样
模拟电路 模拟芯片 德州仪器 放大器 ADI 模拟电子 相关文章:
- 12位串行A/D转换器MAX187的应用(10-06)
- AGC中频放大器设计(下)(10-07)
- 低功耗、3V工作电压、精度0.05% 的A/D变换器(10-09)
- PIC16C5X单片机睡眠状态的键唤醒方法(11-16)
- 用简化方法对高可用性系统中的电源进行数字化管理(10-02)
- 利用GM6801实现智能快速充电器设计(11-20)