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;
    }
}
相关推荐
REDcker3 天前
WebCodecs VideoDecoder 的 hardwareAcceleration 使用
前端·音视频·实时音视频·直播·webcodecs·videodecoder
gihigo19983 天前
基于TCP协议实现视频采集与通信
网络协议·tcp/ip·音视频
山河君3 天前
四麦克风声源定位实战:基于 GCC-PHAT + 最小二乘法实现 DOA
算法·音视频·语音识别·信号处理·最小二乘法·tdoa
音视频牛哥3 天前
Android平台RTMP/RTSP超低延迟直播播放器开发详解——基于SmartMediaKit深度实践
android·人工智能·计算机视觉·音视频·rtmp播放器·安卓rtmp播放器·rtmp直播播放器
qq_416276423 天前
通用音频表征的对比学习
学习·音视频
美狐美颜sdk3 天前
Android全局美颜sdk实现方案详解
人工智能·音视频·美颜sdk·视频美颜sdk·美狐美颜sdk
EasyDSS3 天前
私有化部署EasyDSS视频点播能力:全链路视频技术赋能,打造企业级视听新体验
音视频·hls·m3u8·点播技术·智能转码
qq_416276423 天前
DeLoRes——一种通用的音频表征学习新方法(DeLoRes(基于 Barlow Twins 的冗余最小化方法)
学习·音视频
Q_4582838683 天前
从定位到视频:808 + 1078 在各行业的落地实践
音视频
山顶望月川3 天前
实测MiniMax-Hailuo-02:当“开工大吉“变成“无字天书“,国产AI视频模型的能与之不能
人工智能·音视频