查看原文
其他

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

让万物互联更简单 合宙LuatOS 2023-05-17

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

今天我们将以合宙高性能超值款MCU——Air105开发板为例进行讲解,文末【阅读原文】链接获取最新demo源码。


Air105开发板播放SD卡视频



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





01 相关准备工作






硬件准备:

  • Air105开发板

  • LCD扩展板

  • Micro SD读写卡模块

  • SD卡

  • 排线、面包板若干

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


软件准备:

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

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





02 视频文件制作






文件准备:

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

Windows PowerShell命令输入:

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

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

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





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系列demo持续更新中,敬请关注!


更多内容:https://wiki.luatos.com/








这几月我们一起追的Air105 



打破传统MCU“价高、缺货、开发难”的行业桎梏,不仅需要依托多年的技术积累和供应链优势,更需要不断创新突破。愿每个你我的付出与努力,共同推动国产替代进程。






更多物联网应用开发
欢迎加入微信/QQ技术交流群探讨沟通

- 合宙技术交流微信群 -

即刻微信/企业微信扫码加入

每个建议都值得关注

每个技能都值得分享


- 合宙技术交流QQ群 -

QQ扫码入群:827963649

行业人士交流分享,让万物互联更简单


- 合宙全国招聘进行时 -

不限城市地区,还可居家办公

自由舞台等你来

和合宙一起成就真正的自己


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存