ESP32那些事儿(八):功能开发之音乐播放功能

本文主要探讨ESP32在资源有限的情况下如何实现本地音频播放,尤其是从使用MP3格式到改用WAV格式以节省内存。通过介绍解码器的使用、WAV文件的读取处理,展示了如何在ESP32上进行音频播放功能的开发。
    本篇对于在线音乐播放不做讨论,如果整个系统只有在线音乐播放的功能,系统资源应该是没有问题的。同时也可以支持多种音频的CODEC。 
    对于本地音频文件播放,由于ESP32芯片系统通常存储和内存资源有限,如果不外挂SRAM,片内只有512KB可用内存,例如我们的项目只有512KB的内存,和4MB的Flash,对于这样的项目,如果要求有音频播放的需求,则要就要考虑:
    文件如何存储?内存是否够用?很明显压缩后的音频文件体积会变小,但是Codec解码的时候会需要更多的内存,则系统内存是否可以满足需求。本项目刚开始是保存的mp3格式的文件,由于开启了蓝牙功能,蓝牙消耗内存比较多,系统可用内存所剩无几,但是mp3解码的时候所用的解码器需要消耗大概十几K的内存,内存比较紧张,后来由于我们的音频资源 比较少,就用空间换内存,就采用wav格式的文件,音频没有压缩,直接读文件写入I2S.

1、mp3播放
用mad解码器。在网上可以找到很多播放mp3的例子,在此就不列举代码了。

2、Raw wav文件播放
/* read 4 bytes of data from wav file */
int read4bytes(uint8_t *pos, uint32_t *chunkId){
  memcpy((uint8_t *)chunkId, pos, sizeof(uint32_t));
  return sizeof(uint32_t);
}

/* these are function to process wav file */
int readRiff(uint8_t *pos, wavRiff_t *wavRiff){
  memcpy((uint8_t *)wavRiff, pos, sizeof(wavRiff_t));
  return sizeof(wavRiff_t);
}

int readProps(uint8_t *pos, wavProperties_t *wavProps){
  memcpy((uint8_t *)wavProps, pos, sizeof(wavProperties_t));
  return sizeof(wavProperties_t);
}

void play_wav_files(uint8_t *fstart, uint8_t *fend)
{
    //uint8_t *pos = fstart;
    //renderer_start();

    uint8_t *pos = fstart;
    //renderer_zero_dma_buffer();
&nbs
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值