esp32实现在线音频播放

环境

vscode+platformio+arduion && 串口,wifi-CSDN博客

代码

cpp 复制代码
// Welcome to www.LingShunLAB.com

#include "Arduino.h"
#include "WiFiMulti.h"
#include "Audio.h"

// Digital I/O used
#define I2S_DOUT      7
#define I2S_BCLK      15
#define I2S_LRC       16

Audio audio;
WiFiMulti wifiMulti;

// config your wifi
String ssid =     "0000";
String password = "000";

void setup() {
    Serial.begin(115200);
    delay(1000);
    Serial.println("\n\nESP32-S3 Audio Streamer Starting...");

    // 初始化 WiFi
    WiFi.mode(WIFI_STA);
    WiFi.disconnect();
    delay(100);
    
    // 添加 WiFi 网络
    wifiMulti.addAP(ssid.c_str(), password.c_str());
    
    Serial.println("Connecting to WiFi...");
    Serial.print("SSID: ");
    Serial.println(ssid);
    
    // 尝试连接 WiFi,最多重试10次
    int retryCount = 0;
    while (wifiMulti.run() != WL_CONNECTED && retryCount < 20) {
        delay(500);
        Serial.print(".");
        retryCount++;
    }
    
    if (WiFi.status() == WL_CONNECTED) {
        Serial.println("\nWiFi Connected!");
        Serial.print("IP Address: ");
        Serial.println(WiFi.localIP());
        Serial.print("Signal Strength: ");
        Serial.print(WiFi.RSSI());
        Serial.println(" dBm");
    } else {
        Serial.println("\nWiFi Connection Failed!");
        Serial.println("Possible causes:");
        Serial.println("1. Wrong SSID or password");
        Serial.println("2. WiFi network not in range");
        Serial.println("3. Network requires special authentication");
        Serial.println("4. Hardware issue");
        // 继续执行,音频库可能会重试
    }
    
    // 初始化音频
    audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
    audio.setVolume(12); // 0...21
    
    // 只有在WiFi连接成功后才尝试连接音频流
    if (WiFi.status() == WL_CONNECTED) {
        Serial.println("Connecting to audio stream...");
        audio.connecttohost("http://ngcdn001.cnr.cn/live/zgzs/index.m3u8"); // 128k mp3
    }
}

void loop()
{
    audio.loop();
    
    // 定期检查WiFi状态
    static unsigned long lastCheck = 0;
    if (millis() - lastCheck > 10000) { // 每10秒检查一次
        lastCheck = millis();
        if (WiFi.status() != WL_CONNECTED) {
            Serial.println("WiFi disconnected! Attempting to reconnect...");
            wifiMulti.run();
        }
    }
    
    if(Serial.available()){ // put streamURL in serial monitor
        audio.stopSong();
        String r=Serial.readString(); r.trim();
        if(r.length()>5) audio.connecttohost(r.c_str());
        log_i("free heap=%i", ESP.getFreeHeap());
    }
}

// optional callback functions (same as before)
void audio_info(const char *info){
    Serial.print("info        "); Serial.println(info);
}
void audio_id3data(const char *info){
    Serial.print("id3data     ");Serial.println(info);
}
void audio_eof_mp3(const char *info){
    Serial.print("eof_mp3     ");Serial.println(info);
}
void audio_showstation(const char *info){
    Serial.print("station     ");Serial.println(info);
}
void audio_showstreamtitle(const char *info){
    Serial.print("streamtitle ");Serial.println(info);
}
void audio_bitrate(const char *info){
    Serial.print("bitrate     ");Serial.println(info);
}
void audio_commercial(const char *info){
    Serial.print("commercial  ");Serial.println(info);
}
void audio_icyurl(const char *info){
    Serial.print("icyurl      ");Serial.println(info);
}
void audio_lasthost(const char *info){
    Serial.print("lasthost    ");Serial.println(info);
}

// 添加WiFi事件处理回调
void WiFiEvent(WiFiEvent_t event) {
    switch(event) {
        case ARDUINO_EVENT_WIFI_STA_GOT_IP:
            Serial.println("WiFi Connected! Got IP: " + WiFi.localIP().toString());
            break;
        case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
            Serial.println("WiFi Disconnected. Attempting to reconnect...");
            wifiMulti.run();
            break;
        default:
            break;
    }
}
相关推荐
潜创微科技--高清音视频芯片方案开发32 分钟前
2026年切换器方案服务商市场格局分析与主流品牌选型指南
音视频·硬件工程
潜创微科技--高清音视频芯片方案开发1 小时前
2026年高清音视频切换器方案选型分
音视频
二等饼干~za8986683 小时前
源码可控:云罗 GEO 源头工厂,开源搭建 + 二次开发全链路解决方案
服务器·开发语言·开源·php·音视频·ai-native
feasibility.4 小时前
OpenClaw+LibTV视频生成实测(含安装+配置+分析):ai生成工作流很规范,但画面在“打架“
人工智能·aigc·音视频·内容运营·短剧·openclaw·libtv
深念Y5 小时前
FFmpeg 480p 转码失败但 1080p/720p 正常的坑
ffmpeg·音视频·转码·流媒体·分辨率·hls·m3u8
不吃鱼的猫7486 小时前
【音视频流媒体进阶:从网络到 WebRTC】第04篇-流媒体场景下的网络优化
网络·音视频·webrtc
不吃鱼的猫7488 小时前
【音视频流媒体进阶:从网络到 WebRTC】第02篇-I/O 多路复用:从 select 到 epoll
网络·音视频·webrtc
不吃鱼的猫7488 小时前
【音视频流媒体进阶:从网络到 WebRTC】第03篇-Reactor 模式与事件驱动网络框架
网络·音视频·webrtc
不吃鱼的猫7488 小时前
【音视频流媒体进阶:从网络到 WebRTC】第01篇-Socket 编程基础:TCP 与 UDP 的选择
网络·音视频·webrtc
Flamingˢ21 小时前
ZYNQ + OV5640 视频系统开发(四):HDMI 显示链路
嵌入式硬件·fpga开发·硬件架构·音视频