ESP32驱动MJPEG视频与AAC音频播放:复古电视项目全解析
1. 项目概述:用ESP32复刻一台能揣进口袋的复古电视
几年前,我在整理旧物时翻出了一台老式CRT电视,那种厚重的机身、圆润的屏幕边框和开机时“嗡”的一声,瞬间把我拉回了童年。可惜它早已无法工作,成了摆设。当时我就想,能不能用现在手边的微控制器,自己做一台能播放视频的迷你复古电视,把那份感觉找回来?这就是这个项目的起点。
我选择了ESP32作为核心。这不仅仅是因为它便宜、易得,更重要的是它内置的双核处理器和充足的PSRAM,让它具备了处理视频流这种“重活”的潜力。市面上很多用ESP32驱动显示屏的项目,大多停留在显示静态图片或简单动画上,真要流畅播放视频,尤其是从SD卡读取、解码再显示,对资源调度是个不小的挑战。这个项目的核心,就是探索如何让ESP32这颗“小心脏”同时平稳地驱动起视频解码、音频播放和文件读取这三驾马车。
最终成品是一台巴掌大小的“电视”,它有一个1.69英寸的圆角屏幕,模仿了老式CRT的造型,通过SD卡充当“录像带”,可以播放转换好的MJPEG视频和AAC音频。整个系统基于Arduino框架开发,使用了Arduino_GFX来驱动ST7789显示屏,用libhelix库解码音频,并通过I2S接口将声音送到MAX98357功放芯片和微型扬声器上。下面,我就把这套从硬件选型、软件架构到调试踩坑的完整过程拆开揉碎了讲给你听,无论你是想复刻一个怀旧小玩具,还是想深入学习ESP32上的多媒体应用开发,相信都能找到有用的东西。
2. 核心硬件选型与设计思路
做硬件项目,选对零件就成功了一半。对于这个迷你电视,我的目标是:外形要复古,性能要足够,结构要紧凑,最后还得能比较容易地做出来。
2.1 主控与显示:为什么是TTGO T7和1.69寸圆角屏?
主控板我选择了TTGO T7这款ESP32开发板。市面上ESP32板子很多,选它有几个很实际的理由。首先,它板载了PSRAM(虽然本项目最终未启用),引脚全部引出,且自带USB转串口和复位、Boot按钮,开发调试非常方便。其次,它的尺寸适中,能严丝合缝地放进我设计的3D打印外壳里。最重要的是,它有一个重要的硬件特性:GPIO2在默认情况下是连接板载LED的,但在使用SD_MMC 4位模式时,这个引脚必须用作数据线。TTGO T7的设计允许通过跳线帽断开这个连接,避免了冲突,这在后期尝试不同SD卡库时给了我们灵活性。
显示屏的选择直接决定了“复古感”。老式CRT电视的屏幕比例接近4:3,而且是圆角的。我找到了一款分辨率为280x240的1.69英寸IPS屏,驱动芯片是ST7789,关键是它的面板做了圆角处理。这个分辨率非常巧妙:240行垂直分辨率,恰好对标了早期VCD(Video CD)的240p标准,一下子就把复古的味儿做足了。280的宽度略大于4:3比例,但可以通过视频裁剪来适配,后面会详细说。Arduino_GFX库对ST7789的支持非常好,提供了硬件SPI加速,这是实现流畅播放的关键。
2.2 音频系统:从数字信号到耳边声音
声音方面,我放弃了ESP32内部精度有限的DAC,选择了更专业的I2S数字音频接口。I2S是一种专门用于传输数字音频数据的串行总线,能提供高保真、低抖动的音频信号。我选用MAX98357这款I2S类D音频功放芯片。它堪称“傻瓜式”芯片,只需连接I2S的三根数据线(时钟BCLK、字选择LRCLK、数据DOUT)和电源,就能直接驱动扬声器,无需额外的模拟电路设计,极大简化了硬件连接。
扬声器则搭配了一个24mm的全频段微型扬声器,额定功率2-4W,与MAX98357的3.2W输出能力匹配。虽然不能指望这么小的腔体发出多震撼的低音,但用于播放人声和背景音乐,清晰度完全足够。这里有一个细节:MAX98357可以通过一个引脚设置增益(3dB, 6dB, 9dB, 12dB, 15dB)。考虑到这是一个迷你设备,我将其设置为3dB,避免增益过高产生破音或底噪,实际听感也更舒适。
2.3 供电与结构:把一切塞进“笨重”的外壳
老式电视给人的另一个深刻印象是“笨重”。为了模仿这种质感,我决定利用外壳的厚度来容纳所有组件。电源方案很灵活:可以通过USB Type-C口直接供电,也可以在开发板下方塞入一块小体积的锂电池(比如602525规格),实现无线播放。TTGO T7板载了充电管理芯片,插上USB就能给电池充电,非常省心。
所有的组件——ESP32主板、SD卡模块、音频功放板、扬声器——都通过排针和杜邦线连接在一块万用板上,再整体固定在外壳内部。这种“飞线”方式虽然看起来不那么规整,但却意外地复刻了老式电视机内部线束杂乱的感觉,也算是一种有趣的致敬。外壳使用白色哑光PLA材料3D打印,灵感来源于苹果经典的iMac G3“花卉力量”设计,让这台小电视在复古之余又多了一点时尚感。
注意:在连接所有硬件之前,特别是焊接排针或连接电源线时,务必断开USB供电。最安全的做法是,先只连接主板和电脑进行程序烧录测试,确保软件基础功能正常后,再逐一添加其他模块并测试,即“分步上电,逐步集成”,能有效避免因接线错误导致的芯片损坏。
3. 软件架构与多任务分工
软件是这个项目的大脑,其核心挑战在于:如何让单颗ESP32流畅地同时处理视频解码、音频播放和文件读取这些计算密集型任务?答案就是利用ESP