news 2026/5/13 23:50:58

黄山派播放TF卡MP4视频

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
黄山派播放TF卡MP4视频

文章目录

  • 一、简介
  • 二、播放文件中视频
  • 三、 播放TF卡中MP4视频文件
    • 1.开启menuconfig配置
    • 2.代码修改
      • 1)添加TF卡挂载相关代码
      • 2) mnt_init()函数修改
      • 3) mnt_init() 代码说明
      • 4)视频引用
  • 四、现象
    • 1.SD卡检测成功
    • 2.成功挂载文件系统
    • 3.打开失败
    • 4.读取成功
    • 5.开始播放

一、简介

黄山派播放视频例程

  • 播放文件中的mp4视频
  • 播放TF卡中视频
    例程源码:本地视频播放

二、播放文件中视频

使用的例程默认播放 disk目录下的video_example.mp4 视频文件

  • 源视频文件内容为空文件,直接编译使用代码是不能播放出视频的
  • 使用自己的MP4文件替换disk目录下文件后编译下载即可播放
  • 代码默认没有开启TF卡的使用

三、 播放TF卡中MP4视频文件

这里不使用源代码中 SDIO (RT_USING_SDIO)相关的代码,使用前面学习的 SPI_TF (RT_USING_SPI_TF)

1.开启menuconfig配置




proj.conf文件内添加的配置

CONFIG_BSP_USING_SPI1=y CONFIG_BSP_SPI1_TX_USING_DMA=y CONFIG_BSP_SPI1_RX_USING_DMA=y CONFIG_RT_USING_SPI_MSD=y

2.代码修改

1)添加TF卡挂载相关代码

#include"dfs_file.h"#include"spi_msd.h"#defineFS_ROOT"root"#defineFS_ROOT_PATH"/"//统一根目录路径为 '/'#defineFS_ROOT_OFFSET0X00000000//起始地址#defineFS_ROOT_LEN500*1024*1024//500M#defineFS_BLOCK_SIZE0x200structrt_device*fal_mtd_msd_device_create(char*name,longoffset,longlen){rt_device_tmsd=rt_device_find("sd0");if(msd==NULL){rt_kprintf("Error: the flash device name (sd0) is not found.\n");returnNULL;}structmsd_device*msd_dev=(structmsd_device*)msd->user_data;structmsd_device*msd_file_dev=(structmsd_device*)rt_malloc(sizeof(structmsd_device));if(msd_file_dev){msd_file_dev->parent.type=RT_Device_Class_MTD;#ifdefRT_USING_DEVICE_OPSmsd_file_dev->parent.ops=msd_dev->parent.ops;#elsemsd_file_dev->parent.init=msd_dev->parent.init;msd_file_dev->parent.open=msd_dev->parent.open;msd_file_dev->parent.close=msd_dev->parent.close;msd_file_dev->parent.read=msd_dev->parent.read;msd_file_dev->parent.write=msd_dev->parent.write;msd_file_dev->parent.control=msd_dev->parent.control;#endifmsd_file_dev->offset=offset;msd_file_dev->spi_device=msd_dev->spi_device;msd_file_dev->geometry.bytes_per_sector=FS_BLOCK_SIZE;msd_file_dev->geometry.block_size=FS_BLOCK_SIZE;msd_file_dev->geometry.sector_count=len;rt_device_register(&msd_file_dev->parent,name,RT_DEVICE_FLAG_RDWR|RT_DEVICE_FLAG_REMOVABLE|RT_DEVICE_FLAG_STANDALONE);rt_kprintf("fal_mtd_msd_device_create dev:sd0 part:%s offset:0x%x, size:0x%x\n",name,msd_file_dev->offset,msd_file_dev->geometry.sector_count);returnRT_DEVICE(&msd_file_dev->parent);;}returnNULL;}#include"dfs_file.h"#include"spi_msd.h"

2) mnt_init()函数修改

#ifndefFS_REGION_START_ADDR#error"Need to define file system start address!"#endifintmnt_init(void){char*name[2];rt_kprintf("===auto_mnt_init===\n");uint16_ttime_out=100;while(time_out--){rt_thread_mdelay(30);if(rt_device_find("sd0"))break;}memset(name,0,sizeof(name));name[0]="sd0";fal_mtd_msd_device_create(FS_ROOT,FS_ROOT_OFFSET>>9,FS_ROOT_LEN>>9);/* 挂载 FS_ROOT,挂载路径 FS_ROOT_PATH,挂载类型 'elm' */if(dfs_mount(FS_ROOT,FS_ROOT_PATH,"elm",0,0)==0)// fs exist{rt_kprintf("mount fs on flash to root success\n");}else{// auto mkfs, remove it if you want to mkfs manualrt_kprintf("mount fs on flash to root fail\n");if(dfs_mkfs("elm",FS_ROOT)==0)//Format file system{rt_kprintf("make elm fs on flash sucess, mount again\n");if(dfs_mount(FS_ROOT,"/","elm",0,0)==0)rt_kprintf("mount fs on flash success\n");else{rt_kprintf("mount to fs on flash fail\n");returnRT_ERROR;}}elsert_kprintf("dfs_mkfs elm flash fail\n");}// #ifdef RT_USING_SDIO// //Waitting for SD Card detection done.// int sd_state = mmcsd_wait_cd_changed(3000);// if (MMCSD_HOST_PLUGED == sd_state)// {// rt_kprintf("SD-Card plug in\n");// name[0] = "sd0";// }// else// {// rt_kprintf("No SD-Card detected, state: %d\n", sd_state);// }// #endif /* RT_USING_SDIO */name[1]="flash0";register_mtd_device(FS_REGION_START_ADDR,FS_REGION_SIZE,name[1]);for(uint32_ti=0;i<sizeof(name)/sizeof(name[0]);i++){if(NULL==name[i])continue;if(dfs_mount(name[i],"/","elm",0,0)==0)// fs exist{rt_kprintf("mount fs on %s to root success\n",name[i]);break;}else{rt_kprintf("mount fs on %s to root fail\n",name[i]);}}returnRT_EOK;}INIT_ENV_EXPORT(mnt_init);

3) mnt_init() 代码说明

注册并将FS_ROOT挂载到’/‘目录下,挂载类型为 ‘elm’

fal_mtd_msd_device_create(FS_ROOT,FS_ROOT_OFFSET>>9,FS_ROOT_LEN>>9);/* 挂载 FS_ROOT,挂载路径 FS_ROOT_PATH,挂载类型 'elm' */if(dfs_mount(FS_ROOT,FS_ROOT_PATH,"elm",0,0)==0)// fs exist{rt_kprintf("mount fs on flash to root success\n");}else{// auto mkfs, remove it if you want to mkfs manualrt_kprintf("mount fs on flash to root fail\n");if(dfs_mkfs("elm",FS_ROOT)==0)//Format file system{rt_kprintf("make elm fs on flash sucess, mount again\n");if(dfs_mount(FS_ROOT,"/","elm",0,0)==0)rt_kprintf("mount fs on flash success\n");else{rt_kprintf("mount to fs on flash fail\n");returnRT_ERROR;}}elsert_kprintf("dfs_mkfs elm flash fail\n");}

源代码中的挂载文件系统函数

  • 如果根目录下已经挂载了文件系统后续文件系统则视为挂载失败
  • 所以使用了这里使用了SD卡中的视频文件后就不能使用代码中的视频文件了。
for(uint32_ti=0;i<sizeof(name)/sizeof(name[0]);i++){if(NULL==name[i])continue;if(dfs_mount(name[i],"/","elm",0,0)==0)// fs exist{rt_kprintf("mount fs on %s to root success\n",name[i]);break;}else{rt_kprintf("mount fs on %s to root fail\n",name[i]);}}

4)视频引用

  • 将 VIDEO_SRC 数组下的文件名称改为SD卡下的存放的mp4文件名称,mp4文件存放在SD卡的根目录下。
  • 或者直接修改filename
    完成后编译下载即可播放TF卡中的视频文件



四、现象

正常即可播放TF卡中的视频文件

1.SD卡检测成功

2.成功挂载文件系统

3.打开失败

这里可以看到local.mp4是TF卡中没有的视频名称,所以自然也是打开失败,ret返回的值为-2(这里ret等于0说明成功获取到视频了,ret小于0就是失败了)

4.读取成功

可以看到,成功读取到视频 ret=0 而且会返回视频的数据信息


5.开始播放

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 8:01:16

TouchGal视觉小说社区平台:终极使用指南与技巧分享

TouchGal视觉小说社区平台&#xff1a;终极使用指南与技巧分享 【免费下载链接】kun-touchgal-next TouchGAL是立足于分享快乐的一站式Galgame文化社区, 为Gal爱好者提供一片净土! 项目地址: https://gitcode.com/gh_mirrors/ku/kun-touchgal-next 作为专为Galgame爱好者…

作者头像 李华
网站建设 2026/5/9 15:12:29

APKMirror安卓应用下载工具使用指南

APKMirror安卓应用下载工具使用指南 【免费下载链接】APKMirror 项目地址: https://gitcode.com/gh_mirrors/ap/APKMirror APKMirror是一款功能强大的安卓应用下载工具&#xff0c;为用户提供安全可靠的应用获取渠道。无论你是需要获取官方应用商店中无法找到的应用&am…

作者头像 李华
网站建设 2026/5/4 12:36:13

Qwen3-VL年画创作助手:吉祥寓意图像元素智能组合

Qwen3-VL年画创作助手&#xff1a;吉祥寓意图像元素智能组合 在数字艺术与人工智能交汇的今天&#xff0c;一个古老的传统正在被重新唤醒——中国年画。这门承载着“福禄寿喜财”美好祝愿的艺术形式&#xff0c;曾是千家万户春节窗棂上的风景。然而&#xff0c;随着时代变迁&am…

作者头像 李华
网站建设 2026/5/4 3:51:15

APKMirror安全下载神器:5分钟掌握安卓应用获取全攻略

APKMirror安全下载神器&#xff1a;5分钟掌握安卓应用获取全攻略 【免费下载链接】APKMirror 项目地址: https://gitcode.com/gh_mirrors/ap/APKMirror 还在为找不到心仪的安卓应用而苦恼吗&#xff1f;担心第三方下载网站的安全风险&#xff1f;今天我要向你介绍一款专…

作者头像 李华
网站建设 2026/5/12 5:48:54

英雄联盟智能助手:告别盲选,制霸排位赛的终极解决方案

英雄联盟智能助手&#xff1a;告别盲选&#xff0c;制霸排位赛的终极解决方案 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在…

作者头像 李华
网站建设 2026/5/9 0:49:23

APKMirror安卓应用高效获取:实用方案深度解析

还在为官方商店找不到心仪应用而苦恼&#xff1f;新版本频繁闪退却无法回退&#xff1f;今天我要为你介绍一个安卓应用获取的实用工具——APKMirror下载工具&#xff0c;它能帮助你应对应用获取的种种挑战&#xff01; 【免费下载链接】APKMirror 项目地址: https://gitcode…

作者头像 李华