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

本文详细介绍了如何使用STC12C5A32S2单片机实现SD卡音视频播放系统,包括硬件配置、驱动开发、文件系统支持及音视频流格式的自定义设计。具体涉及到LCD显示驱动、PWM音频输出、SPI通信、FAT文件系统优化等关键组件的实现细节。
摘要由CSDN通过智能技术生成
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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值