用你的 ESP32 做一个音乐电台

Posted tidyjiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用你的 ESP32 做一个音乐电台相关的知识,希望对你有一定的参考价值。

本工程源代码托管位置 https://github.com/tidyjiang8/esp32-projects

在 GitHub 上找到一个德国小伙移植的 ESP32 音频相关的项目,实现起来比较简单,在这里分享一下。该项目主要是向一个网络服务器获取音乐,然后在 ESP32 上面进行本地解码、播放,从而做成了一个网络电台的功能。

【所需硬件】

最简单的方案包括:

  • 一块 ESP32 开发板
  • 一个低功率的喇叭

由于没有喇叭,我直接用的耳机代替的。

【硬件接线】

对于内置 DAC 模式,一共需要接三根线:

GPIO25   ----   左声道
GPIO26   ---    右声道
GND      ---    

一般耳机的左/右声道如下图所示:

【快速开始】

【 假设】

  • 你已经安装好 ESP-IDF 和工具链。
  • 你已经有一个 WiFi 热点。
  • 板子与耳机的线已经接好(PS:我是板子跑起来后用手直接将线按在耳机的接口上的)。

【步骤】

  • 使用数据线将开发板连接到你的系统中,让系统能够识别到你的板子(Windows 是COM\\*, Linux 是/dev/ttyUSB\\*)。
  • 进入web_radio所在目录。
  • 执行命名make menuconfig进行配置。
    • 对串口进行配置。
    • 对需要连接的 AP 的 SSID 和 PASSWORD 进行配置。依次进入Web Radio / Bluetooth Speaker --->Wifi Configuration --->,然后输入热点的 SSID密码
    • 对音频输出模式进行选项。依次进入Web Radio / Bluetooth Speaker --->Audio Output --->Select Audio Output Mode,然后选择Built-In DAC
  • 执行命令make进行编译
  • 执行命令make flash monitor将编译生成的镜像烧写到 ESP32 开发板上面,并查看串口输出。

【现象】

带上耳机,有没有听到音乐呢?

此外,按下 boot 按键,音乐会暂停,再次按下 boot 按键,音乐会重新播放。

【实现原理总结】

整个 Web Radio 的实现过程可以划分为三部分:

  • 获取音频流。程序使用的 http 协议从一个服务器上面获取的音频数据,并将整个数据存放到一个 buffer 中。
  • 对音频流进行解码。当 buffer 中有一定的数据后(可以通过宏进行调整),开启解码线程。解码线程会从这个 buffer 中取出数据,然后调用解码库,将音频流解码为可直接输出的数字信号。
  • 将解码后的数据通过 DAC 输出。解码线程每解完一帧数据后,将它通过 I2S 驱动程序直接送给 DAC。

这里面存在一个同步的问题,即从服务器上面获取音频流与对音频流进行解码的同步。如果获取的音频流过快,超过了解码的速度,则它可能将 buffer 撑爆,因此会丢失部分数据;如果解码的速度过快,超过了获取音频的速度,则它可能将 buffer 消耗的干干净净,从而也会出现声音卡顿问题。这需要进行权衡。

以上是关于用你的 ESP32 做一个音乐电台的主要内容,如果未能解决你的问题,请参考以下文章

从浮点数组iOS Swift播放音频

Arduino框架下ESP32使用固件自带的SD库的总结

ESP32(IDF)EC11旋转编码器使用总结

工科生的信仰 ESP32 + HaaS Python 打造HaaS收音机

esp32cam接错烧了

手机版网易云音乐怎么把下载了的电台节目添加到歌单里