如何用MCU播放SD卡视频?——合宙Air105最新demo带你轻松上手

描述

近期好些小伙伴看到SD卡视频播放效果觉得很不错,询问有没有相关教程。

今天我们将以合宙高性能超值款MCU——Air105开发板为例进行讲解

在进行之前先说一下原理,原理很简单——就是通过MCU,将SD卡中的视频字节流数据读出来在LCD上绘制。

 

 

 

01 相关准备工作

 

 


 

硬件准备:

Air105开发板

LCD扩展板

Micro SD读写卡模块

SD卡

排线、面包板若干

注:Air101/Air103开发板也可同样准备,目前demo音频支持尚在开发中,敬请期待。

mcu

软件准备:

开始准备视频字节流数据,我们需要用到FFmpeg这款开源和跨平台的多媒体软件。官方下载win版本的压缩包,获得其中的ffmpeg.exe。

参见https://www.ffmpeg.org/

mcu

 

 

 

02 视频文件制作

 

 


 

文件准备:

首先准备好一段要播放的视频,和之前的ffmpeg.exe放到一起。

mcu

Windows PowerShell命令输入:

Windows PowerShell输入如下命令,即可将视频转为160x128分辨率的字节流文件:

 .\ffmpeg -i mwsy.mp4 -r 20 -vf scale=160:128 -pix_fmt rgb565be -vcodec rawvideo mwsy.rgb 

mcu

然后将生成的mwsy.rgb放在SD卡中:

mcu

 

 

 

03 编写播放代码

 

 


 

代码很简单,首先初始化LCD,之后初始化并挂载SD,然后就是读视频向LCD进行draw。


 

手机上下滑动或横屏查看:

sys.taskInit(function()
    --初始化lcd
    spi_lcd = spi.deviceSetup(5,pin.PC14,0,0,8,48*1000*1000,spi.MSB,1,1)
    log.info("lcd.init",
    lcd.init("st7735",{port = "device",pin_dc = pin.PE08 ,pin_rst = pin.PC12,pin_pwr = pin.PE09,direction = 3,w = 160,h = 128,xoffset = 1,yoffset = 2},spi_lcd))
    --初始化sd
    local spiId = 2
    local result = spi.setup(
        spiId,--串口id
        255, -- 不使用默认CS脚
        0,--CPHA
        0,--CPOL
        8,--数据宽度
        400*1000  -- 初始化时使用较低的频率
    )
    local TF_CS = pin.PB3
    gpio.setup(TF_CS, 1)
    --fatfs.debug(1) -- 若挂载失败,可以尝试打开调试信息,查找原因
    fatfs.mount("SD", spiId, TF_CS, 24000000)
    local data, err = fatfs.getfree("SD")
    if data then
        log.info("fatfs", "getfree", json.encode(data))
    else
        log.info("fatfs", "err", err)
    end
    
    local video_w = 160
    local video_h = 128
    local rgb_file = "mwsy.rgb"

    local buff_size = video_w*video_h*2
    local file_size = fs.fsize("/sd/"..rgb_file)
    print("/sd/"..rgb_file.." file_size",file_size)
    
    local file = io.open("/sd/"..rgb_file, "rb")
    if file then
        local file_cnt = 0
        local buff = zbuff.create(buff_size)
        repeat
            if file:fill(buff) then
                file_cnt = file_cnt + buff_size
                lcd.draw(0, 0, video_w-1, video_h-1, buff)
                sys.wait(20)
            end
        until( file_size - file_cnt < buff_size )
        local temp_data = file:fill(buff,0,file_size - file_cnt)
        lcd.draw(0, 0, video_w-1, video_h-1, buff)
        sys.wait(30)
        file:close()
    end

    while 1 do
        sys.wait(1000)
    end

end)

 

最新demo源码:

https://gitee.com/openLuat/LuatOS/tree/master/demo/video_play/Air105

 

 

 

04 视频播放效果

 

 


 

mcu

 

好了,享受不一样的时光~

今天就讲解到这里,快拿出开发板动手试试。合宙MCU系列demo持续更新中,敬请关注!

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐
  • mcu

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分