挑战51单片机(STC12C5A32S2)性能极限!19264+SD+FAT播放视音频!附视频取模软件

来源:互联网 发布:mach3如何编程 编辑:程序博客网 时间:2024/05/22 23:55
STC12C5A32S2 25FPS流畅播放视音频。

效果如下:


  SD卡工作在SPI模式,由单片机的硬件SPI驱动。原创的FAT驱动支持簇预处理在性能方面比较突出,STC单片机工作在22.1184M的晶振下估计吞吐量达120+kB/s,当然这个是空跑估算的实际用起来没这么高,缺陷是只支持8.3文件名,不能有中文,且文件只读。我这个LCD19264是基于KS0108驱动芯片的,驱动也是自己写里面有不少功能,有兴趣的话可以参考一下。PWM驱动音箱这个没有什么好说的~通过一个隔直电容电位器直推。

  播放的MUX格式是这样的,可以参考一下三楼的AVMuxer的源码,在FAT的512B的扇区里,前256B是1/4帧视频,接着的128B是留空备用的(我的LCD是19264,现在播放的是12864的视频),最后的128B是8bit 12.8k采样率的单声道RAW音频,以25FPS播放。至于为什么要这样设计,先卖个关子,你想到了吗?嘿嘿~~

  视频可以用二楼的LCDmodX生成,最近在弄这个东西呵呵,带演示的视频,注意要调整取模规则,我的这个19264是“字节垂直,水平扫描;左上开始,右下结束;低位优先”,不同的屏幕要不同的驱动至于你的LCD的驱动怎么写,你可以参考一下我的源码,只要接口一样就OK了。

  音频的生成暂时还没有好的解决方法,因为这不是标准的音频格式,我是用Audition生成的,8bit 12.8k采样率的单声道RAW音频(PCM WAV 音频流)。

  三楼是AVMuxer的源码,我用VS2008编译通过,估计VC6也能行,没有制作一个GUI,用的时候改其中的文件路径。

  原理图如下:



  东西在学校,现在好不容易找到的一张全家福,在自己围脖上挖的......





Keil51 UV4 51工程源码包: VideoPlayer.rar (234 K) 下载次数:165
原理图PDF: VideoPlayer.pdf (23 K) 下载次数:102


在洞洞板上搭的电路,可以看看我以前发的那个无声的烂苹果,现在加上了PWM输出,使用了硬件SPI I/O,FAT文件系统。

http://bbs.mydigit.cn/read.php?tid=242358


视频取模软件 LCDmodX Alpha

转换器只支持AVI文件,在使用之前首先确定系统已经安装过视频解码包(如:终极解码、完美解码等等),个人用的是完美解码(PureCodec20091225)。
推荐安装完美解码http://www.newhua.com/soft/52770.htm

演示



LCDmodX 0.3.2.110712 alpha.rar (1819 K) 下载次数:80 


简易视音频混流器源码:

#include <windows.h>#include <tchar.h>#include <stdio.h>int APIENTRY _tWinMain(HINSTANCE hInstance,                     HINSTANCE hPrevInstance,                     LPTSTR    lpCmdLine,                     int       nCmdShow){    FILE *fprv,*fpra,*fpw;    BYTE Buffer[512] = {0};    TCHAR String[MAX_PATH];    DWORD i,j = 0;    if(_tfopen_s(&fpra, _T("D:\\av.raw"), _T("rb")))   //8bit 12.8kHz raw 音频流        return 1;    if(_tfopen_s(&fprv, _T("D:\\av.bin"), _T("rb")))   //25fps LCDmodX生成文件        return 1;    if(_tfopen_s(&fpw, _T("D:\\av.mux"), _T("wb")))    //输出        return 1;    while(1){        if(!(fread(Buffer, sizeof(BYTE), 256, fprv)))            return 1;        if(!(fread(Buffer + 384, sizeof(BYTE), 128, fpra)))            return 1;        fwrite(Buffer, sizeof(BYTE), 512, fpw);    }    fclose(fprv);    fclose(fpra);    fclose(fpw);    return 0;}

转载自:http://bbs.mydigit.cn/read.php?tid=285953&page=1


原创粉丝点击