关注振南网站:http://www.znmcu.cn/bbs/topic.asp?id=229&boardid=44&tb=1
自从振南发布了使用STM32实现的简易视频播放器实验之后,很多人都表示很有兴趣。这个实验在我诸多的精彩原创实验中也算是关注度比较高的实验。但是不少人都提出了自己的建议,总结起来主要有三点:1、能否放大图像尺寸,比如使用标准的VGA或QVGA,同时提高帧速,这样也许能达到更好的播放效果;2、是否能够不使用振南自定义的ZNV文件格式,而直接使用通用的视频文件格式,比如AVI、MP4等等;3、能够加入音频的同步播放,这样才能称之为视频播放器。此实验中对TFT液晶与SD卡驱动进行了优化,从而达到了更高的速度,这是实现第一条建议的根本基础。振南的ZN-X开发板上使用的STM32芯片因为没有FSMC控制器,所以TFT液晶采用IO驱动方式,其刷屏速度主要取决于IO的翻转速度与内存的访问速度。振南通过适当的超频(STM32最高可超频到140MHz)使TFT液晶驱动的性能提升到了新的水平(纯色刷屏帧速达到约15fps)。SD卡扇区读写驱动,仍然使用SPI方式,加入了STM32的DMA传输机制,这极大地提升了SD卡的读写速度(读扇区速度可达约2MBps)。至于DMA为什么会对SD卡驱动产生如此大的提升作用,请详见《高性能SD卡驱动的实现》一文。 在前面的实验中,振南确实使用的是一种自定义的视频文件格式,即ZNV。它最大的好处是直接存储了用于显示的原始RGB565数据,而无需解码。如果要使用常见的通用视频格式的话,最大的问题在于:1、文件数据格式也许会比较复杂,需要花时间去仔细研究和解析;2、音视频数据的解码,这部分工作也许难度较大。不过,在此实验中,振南通过一些折中的方法,避开了这些疑难问题。 此实验中使用AVI视频文件,它本身是音视频交错的格式,因此可以实现音频与视频的同步播放。AVI中的音频部分可以使用任何一种编码方式,比如原始PDM、ADPCM、MP3或WMA等等。这里我们使用MP3,所以用到VS1003解码器。 至于AVI文件格式的详细介绍请见振南发布的专贴。AVI文件中的音频与视频数据的组织形式还是比较简单,请见下图。
AVI文件中的各帧图像与音频数据相互交织构成了一个数据块(所以它才被称为音视频交错格式),各个数据块是依次顺序存放的。数据块中的音频与视频子数据块分别以4字节标记"01wb"与"00dc"(数据块ID)开始,紧随其后的是当前子数据块中的实际数据长度。 AVI格式标准并没有对音视频数据的具体编码算法予以限定。从某种意义上来说,AVI文件格式只是定义了一个框架而已,其中的数据到底怎么样,其实它并不关心。这一方面是其灵活之处,但另一方面也使得它可以变得非常复杂而缺乏统一性。比如同样是AVI文件,视频数据有可能是通过H.263编码的,也可能是MPEG4,还可能是JPEG、RLE或者FFD等等;音频数据的编码也会有很多种,比如MP3、ADPCM、OGG、WMA等等。所以,我们会经常遭遇这样的事情:在电脑上一个AVI能播放,而另一个却无法播放,其根本原因就在于它们可能使用了不同的编码方式,而你又没有安装相应的解码器。 AVI中的视频部分是支持未经编码的原始RGB格式的,所以我们仍然可以像使用ZNV一样方便而简单地实现视频播放。这里介绍一款名叫VirtualDub的软件,它可以用于生成这种特定的AVI文件。如图所示。 图中①用于打开源视文件;②用于设置输出视频的帧速、色深与压缩算法,此实验中分别设置为7fps、RGB565与Uncompressed RGB/YUV;③用于设置输出音频的采样率与压缩算法,此实验中分别设置为8kHz与MPEG Layer-3(MP3)。④为最终的AVI文件输出。 在具体的代码实现中,我们只需要搜索视频与音频数据块的开始标记”01wb”与”00dc”,然后读取后面的数据,再分别送至VS1003解码和TFT液晶进行显示即可。
在线视频演示:
|