继上篇拿W806制作了NES模拟器之后,我又突发奇想,是不用还可以使用它做媒体应用呢?
先来顿百度,发现了一篇文章“基于W801和Helix解码库的MP3播放器(W801单片机学习笔记)热血沸腾,流畅播放”,看来w806也能做mp3播放器了,既然已经被人证明能做mp3播放器,那么能不能播放视频呢?
再一顿百度,没有发现关于w80x系列做视频的资料,那咱只好自己探索一番。
还是使用上篇做NES模拟器的那套环境:那张祖传512M的sd卡,读使用主从spi,这个最高时钟为20MHZ;lcd还是使用st7796s,使用sdio的spi方式刷屏,时钟配网60MHZ;i2s使用MAX98357,输出到3W8Ω的喇叭上;此外就没有其它解码器了。
工作流程我准备这么干:w806从sd卡上读取视频文件,每读一段数据,经过处理,分别在lcd显示画面和在i2s放大器上播放声音。画面尺寸从刷屏速度和观看效果双重考虑,选择的视频文件是320*240的画面,因为太大的话刷屏会比较慢,再太小的话观看起来也不是那么清楚,音频采样率是22050,这也是从上篇时得到的启发,11025的音质太渣,44100消耗大,所以22050是个非常不错的选择。
经过测试发现,这样操作下来,倒是能达成目的:
虽然效果不是十分理想,但是咱这次仅是探讨做视频播放器的可能性,所以我认为还是可以做视频播放的,原因如下:
·画面不流畅,问题在于读sd卡速度过慢,这次使用瓶颈不在刷屏了。
·主从spi读sd卡使用字节模式,没有使用dma模式,测试时发现调用“tls_spi_trans_type(SPI_DMA_TRANSFER)”之后就无法正常读卡了,不知道是SD卡的原因还是spi驱动的问题,以咱的功力尚不想花时间研究这原因。以默认的“tls_spi_trans_type(SPI_BYTE_TRANSFER)”读卡大概每秒才是500KB,当然我对这流程也没有做优化。
·声音破音问题,既有读sd慢,也有本次没有对音频数据做缓冲处理,读到就送i2s,音频数据不连续极易破音。
所以针对这种情况,我认为可以用下面几种方式来优化,如果达到之后适配播放应该就会达到流畅级别了:
·使用主从spi读sd卡的话,使用dma方式读卡,这样读数据速度就不会再成瓶颈。320*240显示一屏大概是二十多毫秒,普通视频一秒内刷30帧不成问题,当播放不是极高帧率的视频时足够使用。
·画面还可以继续缩小,比如播放100*100的视频,无论数据量还是刷屏都会更快;
·既然主从spi比较慢,那么使用sdio四线制来读卡,lcd和sd分时切换来使用sdio控制器;
·音频部分,声音做些缓存,不要造成断续应该就不会有破音了。
但是,以上方法我基本都没尝试,我想到了另一种思路:视频画面裁小之后,用spi来刷屏,用sdio来读卡。果然,这样基本上就可以流畅播放了,下面是一个我播放240*132分辨率视频的效果视频(上传这个视频可把我折腾坏了,b站因版权不让上传,我只好做了打码和剪辑,所以部分场景的跳转就非常突兀了。而且手机对焦有问题拍的不是很清晰,实际画面比这个要清晰):
最后说明一下:这是播放avi视频文件。
avi文件因其格式规则,vedio流可以使用rgb565,audio流可以使用pcm,因此w800在播放avi文件时,就可以读取avi,分别解析vedio和audio数据,分别在lcd输出和i2s音频输出。
所以,播放的视频需要进行一些转码和画面裁剪以适应屏幕的大小,pc端有很多工具可以选择,如神器ffmpeg,但是这里推荐使用VirtualDub,其图形化界面点几下就完事。本文转码avi使用的格式:vedio为 Uncompressed RGB565 画面大小240X132 帧率 15fps、audio为22050采样率 16bits数据 mono单声道。
这里也简单对VirtualDub使用做个简单介绍,先是打开一个视频文件,然后分别对audio和vedio进行设置。
audio设置如下:
vedio设置如下:
如果想对视频的画面尺寸进行裁剪、颠倒位置则可以点击Filter添加filter即可:
· 裁剪画面大小,null transform -> Cropping...
· 调整画面大小,resize
· 水平或垂直翻转,flip horizontally或flip vertically
最后就是保存vedio:
底部也会显示出来最终的配置,可以确认正确了再保存即可。
最后,我整理出了这个视频播放器的相关工具和源码,供感兴趣的朋友参考,源码只能使用cdk编译,工具使用看上图。
点击右边下载 ---> VirtualDub.7z w800_avi_player.7z
好了,关于w80x视频播放就讨探到这里,欢迎感兴趣的朋友下面留意讨论。
PS:之所以开始选择播放“唐马儒”这个视频,是为了纪念曾经的一个朋友,有些人、有些事,从此后会无期。。。。。。