mkv是一种新的多媒体封装格式,支持多种视频和音频编码格式,能够将多达16路不同格式的音频和不同语言的字幕流封装到一个文件中,在高清影片中得到了广泛的应用,越来越多的视频和影片采用mkv作为其封装格式。能否支持mkv封装格式是高清播放机性能的一个重要指标。本文提出了一种基于smp8654平台的mkv播放器设计与实现方案,并针对嵌入式系统和高清媒体的特点做了进一步优化,能够提供对mkv文件的流畅播放。
1 mkv封装格式
mkv全称为matroska video,是一种新的多媒体封装格式。多媒体封装格式也称多媒体容器(multimedia container),它不同于h264、mpeg-2、mpeg-4这类编码格式,它只是为多媒体编码提供了一个“外壳”,本身不涉及编码。mkv是由开源组织matroska development team制定的一个标准,总共包括三部分:mkv(matroska video)、mka(matroska audio)和mks(matroska subtitles),后两种格式分别针对音频和字幕,应用较少。mkv的目的是代替avi等传统封装格式。avi是microsoft于1992年推出一种封装格式。其含义是audio video interactive,就是把视频和音频编码混合在一起储存。微软在1996年推出了avi的改进版本avl2.0。avi格式上限制比较多,只能有一个视频轨道和一个音频轨道,还可以有一些附加轨道,如文字等。avi格式不提供任何控制功能。总体而言,avi为主的传统封装格式结构陈旧,只能包含少数几种音视频格式,并且不够开放,可扩展性差。正因为如此,才促成了matroska这类新的多媒体封装格式的诞生。
mkv相对于传统的封装格式,有如下优点:支持可变比特率(vbr),支持错误检测以及修复软字幕,支持流式传输,强大的开放性和跨平台兼容性,支持16 路以上的音频流和字幕流等。matroska最大的特点是能容纳几乎所有类型的视频、音频及字幕流,除h.264以外,也可包括mpeg4、mpeg2、 ac3、aac等其他视频和音频格式,即使是非常封闭的realmedia及quickltime也被它包括进去了,并将它们的音视频进行了重新组织来达到更好的效果。
由于mkv封装格式本身具有众多优点,随着互联网和高清影片的流行,mkv格式得到了广泛的应用,互联网上越来越多的高清影片采用mkv格式。然而,mkv是一个由开源组织制定和推广的标准,缺乏大商业公司的支持,导致mkv文件的播放缺乏一个完整和有效的设计实现。在性能和资源受限的嵌入式平台上,这个问题尤为严重。虽然目前有很多高清播放机都提供了对mkv格式的支持,但是大部分实现方案都存在支持不完善、播放效率比较低的问题,播放高码率的影片时会出现不流畅、画面卡顿等问题,影响观看效果。本文提出了一种基于smp8654平台的mkv播放器的设计与实现方案,并针对嵌入式系统的特点做了优化,较好地达到了mkv文件流畅播放的要求。
2 硬件平台和软件总体设计
硬件平台以smp8654芯片为核心,通过总线与ram、sata硬盘、flash闪存、输入输出设备等外设相连。smp8654是sigma design公司推出的多媒体播放soc解决方案,集成了一个强大的多媒体处理器、强健的内容保障系统、新的ddr2内存控制器、多个片上cpu以及完备的系统外围设备接口。从媒体播放角度看,smp8654提供了一个完整支持高清晰度视频解码的先进解码引擎,能够支持对mpegl、mpeg-2、 mpeg-4、h.264、wmv9、vcl以及avs等格式的硬件解码,支持高效能的图形加速,支持多标准音频解码和先进的显示处理能力。siena design公司为方便第三方厂商开发应用,提供了与芯片相关的开发工具包和开发框架。本文的工作也基于这个框架进行二次开发。软件平台方面,由于一个完善的播放系统已经相当复杂,不适合直接操纵底层硬件来完成功能,需要操作系统的支持。本项目中操作系统采用uclinux,文件系统采用romfs。 uclinux是专为嵌入式系统定制的一款linux,它具有标准linux操作系统的稳定性、强大网络功能等主要优点,但是却不像标准li-nux那样复杂,主要针对没有mmu(内存管理单元)的微控制器。romfs是一款专门为嵌入式系统设计的文件系统,体积小、可靠性好、读取速度快,是嵌入式系统常用的文件系统。
媒体文件的播放流程一般包括如下几个步骤:系统初始化、判断文件类型、文件解析、设置硬件解码器和音视频解码,其中文件解析和音视频解码是关键部分。由于 smp8654集成了完善的音视频硬件解码器,解码工作主要由硬件完成,我们只需将音视频数据按要求送入相应的解码缓冲区即可。整体的软件架构如图2所示。
3 系统关键技术设计和实现
3.1 mkv文件解析
mkv文件解析主要是对mkv格式的各个组成元素进行解析,以获得必需的音视频参数和媒体数据。mkv作为一种封装格式,实际的视频和音频数据都被封装到某一个子模块中,要想获得实际的数据,必须首先对文件进行解析,并且文件解析贯穿播放的全过程。能否有效并正确的解析,关系到读取数据的准确性,进而影响播放的效果。mkv格式采用可变长编码,能够减少存储空间,另一方面,也给解析带来了新问题。
mkv文件格式建立在ebml(extensible binary metalanguagel基础上,ebml是一种类似于xml格式的可扩展二进制元语言,使用可变长度的整数存储,以节省空间。ebml的基本结构是典型的tlv结构,有三部分组成:
id标志属性类型,size为后面data部分的大小,data部分为id所标识属性的实际数据,id和size均为可变长编码的整数。整数的长度为 length=1+[number of leading zero bits]。前面的零的个数最多为7个,即最多能表示56个比特的整数。文件中不允许出现大于56比特的数。
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为最底层基本组成元素的解析函数。
3.2 设置硬件解码器音视频核心参数
tracks用来描述文件中包含的每一路多媒体流的信息。一路多媒体流用一个trackentry描述,所有的track都要在一个tracks中进行描述。一个trackentry主要包含:tracknumber(判定属于哪一路流的id)、tracktype(video、audio或者 subtitle)、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,这样可大大加快文件解析和数据读取速度。
在播放方面,通常播放时的处理流程是读取一帧数据,然后送入硬件解码器,等到收到硬件解码器为空的信号,再读取下一帧的数据。如果是处理低码率文件的播放,这样做不会有问题,但是当文件分辨率比较高,码率比较高时,解析读取时问和解码时间都会增加,这样做就会造成卡顿。为解决这个问题,我们在内存中设计了一个缓冲fifo,相当于一个滑动窗口(图4),缓冲区可以存放若干个帧(一帧就是一个block,根据帧的大小缓冲区存放的个数不等)。当缓冲区未满时,读取文件中的一个block并解析,然后将实际数据到缓冲区的队尾。当发现硬件缓冲区空闲时,将fifo队首的数据从内存直接送入硬件缓冲区,不需要再去读取文件。由于缓冲区中有多个帧,能够提供一定的缓冲,这样在码率波动时就仍然能够及时提供数据,避免出现硬件缓冲区为空造成的卡顿,播放不流畅等问题。
4 结语
本文详细介绍了mkv封装格式的特点。并基于smp8654提出了一种mkv播放器的设计与实现方案,经验证,能够达到对高清mkv文件的流畅播放,并已经实际应用到产品上。接下来将做进一步研究,在mkv播放器的基础上,设计一种针对多种封装格式的通用媒体播放器框架,将flv、flac等其他格式也融合进来,并提供较好的可扩展性,方便后续扩充其他的封装格式。
ESD硬接地和导电工作台面软接地之间电阻读数不稳定的原因是什么
联发科新一代天玑问世,芯片市场格局生变
拿什么拯救你,日本科技巨头?
电子封装供热管理解决方案:铝碳化硅是关键
生态型摄像机采用了部分技术—单晶硅光伏板及刀片锂电
基于SMP8654平台的MKV播放器设计
Techradar发布2018全球10大最佳游戏手机排名
基于ACP平行视觉理论的车道线检测系统设计
揭秘真相:小米2发布会卖门票的目的
探讨多个不同的Python包,并学习如何从PDF中提取某些图片
新的人工智能算法可以发现在线巨魔
为什么美光会对人工智能如此看重?
接触器自锁控制线路图解
四大展区重磅登场,看中国电子展(CEF)如何助力中国电子产业发展!
阿里云全球大崩溃是意外?盘点那些自称安全的云厂商
上海协堡电子激光测距传感器
MAX1403和μC/μP及DAC组成的4~20mA变送器(
纯电阻电路和非纯电阻电路的区别
iOS10.3正式版怎么样?iOS10.3值不值得更新?网友评论:iOS10.3我要为你点赞!
腾讯企点腾采通发布,助力电子产业进入数字化转型快车道