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;
    }
}
相关推荐
音视频牛哥1 小时前
视频编码的终局不是“更省码率”:从 H.266、AV2 到 AI 编解码的下一场竞争
音视频·h.266·rtsp h.266·h.266编解码·rtp h.266·rtp vvc·ai编解码
程序员老陆5 小时前
WHIP 与 WHEP:WebRTC 直播的标准化入口与出口
ffmpeg·音视频·webrtc·whip·whep
linux_cfan6 小时前
16 · `custom-media-element`:属性拦截与转发
前端·javascript·音视频
纽格立科技9 小时前
动力的转向:当智能不再依赖碳基
车载系统·音视频·信息与通信·传媒
烟雨江南78510 小时前
会议语音识别私有化部署方案:音频不出内网,如何接入现有会议系统
人工智能·websocket·音视频·语音识别·ai客服
镭封1 天前
短剧多人对白怎么配?一人完成多角色配音的办法
人工智能·音视频·语音识别·媒体
技灵AI1 天前
Wan 3.0 API怎么做多参考商品视频?从图片、视频、音频分工到30秒交付
人工智能·prompt·aigc·音视频·wan 3.0
赛博仓鼠1 天前
MiniMax H3 实测:8GB显存跑2K视频+原生音频,开源视频生成的新卷王
开源·aigc·音视频
byte轻骑兵1 天前
【LE Audio】PBP精讲[4]: 公共广播通告的设计逻辑与数据交互流程
人工智能·音视频·le audio·低功耗蓝牙音频
hz567891 天前
手术室视频示教系统解决方案:让临床教学突破空间限制
安全·音视频·实时音视频·信息与通信·智能硬件