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;
    }
}
相关推荐
Android系统攻城狮6 小时前
Android16音频之开始录制AudioRecord.startRecording:用法实例(一百八十八)
音视频·android16·音频进阶
blackorbird6 小时前
Android Pixel 9 的零点击漏洞利用链全解析:从发送杜比音频解码到内核提权
android·音视频
Aaron_9456 小时前
VideoRAG:革新视频理解的检索增强生成技术深度解析
人工智能·音视频
Android系统攻城狮6 小时前
Android16音频之设置Privacy信息AudioRecord.Builder.setPrivacySensitive:用法实例(一百九十七)
音视频·android16·音频进阶
byte轻骑兵7 小时前
【LE Audio】BAP协议精讲[1]: 开启低功耗音频新纪元
人工智能·音视频·蓝牙·le audio·bap
小咖自动剪辑7 小时前
视频去水印与去字幕教程:免费去水印软件与去字幕工具推荐
人工智能·音视频·实时音视频·视频编解码
冷冷的菜哥8 小时前
springboot调用ffmpeg实现对视频的截图,截取与水印
java·spring boot·ffmpeg·音视频·水印·截图·截取
TEL189246224771 天前
IT6225B:USB-C(DP Alt 模式)及电源传输控制器 内置双通道 DP 1.4 转 HDMI 2.0 转换器
音视频·实时音视频·视频编解码
Guheyunyi1 天前
智慧消防管理平台的关键技术突破与创新
大数据·运维·人工智能·安全·音视频