基于SMP86 54芯片的MKV播放器设计
在解析方面,解析的效率关系到能否尽快将数据读入缓冲区,如果处理时间过长,造成一段时间内缓冲区为空,这时候就会出现卡顿。 MKV文件中通常包含一路视频、多路音频和多路字幕,播放时只选中其中一路音频和一路字幕,其他路的数据可以被视为无效数据。在解析时,可以根据Block头的标记判断出这路数据是当前播放需要的有效数据还是无效数据。如果是有效数据,则继续解析,并将音视频数据送入缓冲区,如果是无效数据,不进行解析,直接移动文件指针到下一个Block,这样可大大加快文件解析和数据读取速度。
在播放方面,通常播放时的处理流程是读取一帧数据,然后送入硬件解码器,等到收到硬件解码器为空的信号,再读取下一帧的数据。如果是处理低码率文件的播放,这样做不会有问题,但是当文件分辨率比较高,码率比较高时,解析读取时问和解码时间都会增加,这样做就会造成卡顿。为解决这个问题,我们在内存中设计了一个缓冲FIFO,相当于一个滑动窗口(图4),缓冲区可以存放若干个帧(一帧就是一个Block,根据帧的大小缓冲区存放的个数不等)。当缓冲区未满时,读取文件中的一个Block并解析,然后将实际数据到缓冲区的队尾。当发现硬件缓冲区空闲时,将FIFO队首的数据从内存直接送入硬件缓冲区,不需要再去读取文件。由于缓冲区中有多个帧,能够提供一定的缓冲,这样在码率波动时就仍然能够及时提供数据,避免出现硬件缓冲区为空造成的卡顿,播放不流畅等问题。

4 结语
本文详细介绍了MKV封装格式的特点。并基于SMP86 54提出了一种MKV播放器的设计与实现方案,经验证,能够达到对高清MKV文件的流畅播放,并已经实际应用到产品上。接下来将做进一步研究,在MKV播放器的基础上,设计一种针对多种封装格式的通用媒体播放器框架,将FLV、FLAC等其他格式也融合进来,并提供较好的可扩展性,方便后续扩充其他的封装格式。
评论