ๆฌ่งๅๆๆกฃๆ่ฟฐๅฆไฝไธบ esp-audio-player ้กน็ฎๆทปๅ HTTP ็ฝ็ป้ณ้ขๆตๆญๆพๅ่ฝใ
ๅบ็จๅฑ
โโ audio_player_* (ๅๆต API)
โโ audio_stream_* (ๅคๆตๆทท้ณ API)
โ
ๆ ธๅฟๅฑ (audio_instance / audio_mixer)
โ
่งฃ็ ๅฑ (audio_mp3, audio_wav)
โ
็กฌไปถๆฝ่ฑกๅฑ (I2S ๅ่ฐ)
- ไป
FILE*่ฏปๅๆฐๆฎ๏ผๆฌๅฐๆไปถ็ณป็ป๏ผ - ่งฃ็ ๅจ้ๅธง่งฃ็
- PCM ๆฐๆฎๅๅ ฅ I2S ๆๆทท้ณๅจ็ฏๅฝข็ผๅฒๅบ
- ่งฃ็ ๅจ็ดๆฅไฝฟ็จ
FILE*่ฟ่กๆไปถๆไฝ - ๆฒกๆๆฝ่ฑก็่พๅ ฅๆตๆฅๅฃ
- ไธๆฏๆ็ฝ็ปๆฐๆฎๆบ
ๅๅปบไธไธชๆฝ่ฑก็่พๅ ฅๆตๆฅๅฃ๏ผๅ ่ฎธไปไธๅๆฐๆฎๆบ๏ผๆไปถใHTTPใๅ ๅญ็ญ๏ผ่ฏปๅๆฐๆฎใ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๅบ็จๅฑ API โ
โ audio_stream_play_url() / audio_http_stream_play() โ
โโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ HTTP Stream ๆจกๅ (ๆฐๅข) โ
โ - HTTP ่ฟๆฅ็ฎก็ โ
โ - ๆฐๆฎ็ผๅฒ็ฏๅฝข็ผๅฒๅบ โ
โ - ไธ่ฝฝไปปๅก โ
โโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ่พๅ
ฅๆตๆฝ่ฑกๅฑ (audio_stream_io) (ๆฐๅข) โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ typedef struct { โ โ
โ โ size_t (*read)(void *ctx, void *buf, size_t);โ โ
โ โ int (*seek)(void *ctx, long offset, int); โ โ
โ โ long (*tell)(void *ctx); โ โ
โ โ int (*eof)(void *ctx); โ โ
โ โ void (*close)(void *ctx); โ โ
โ โ void *ctx; โ โ
โ โ } audio_stream_io_t; โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ - ๆไปถๆตๅฎ็ฐ (fopen/fread ๅฐ่ฃ
) โ
โ - HTTP ๆตๅฎ็ฐ (็ฏๅฝข็ผๅฒๅบ่ฏปๅ) โ
โโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ่งฃ็ ๅจไฟฎๆน (audio_mp3/audio_wav) โ
โ - ๆฅๅ audio_stream_io_t ่้ FILE* โ
โ - ไฟๆๅๆ่งฃ็ ้ป่พไธๅ โ
โโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
็ฐๆๆทท้ณ/่พๅบๆถๆ
ๆไปถ: audio_stream_io.h, audio_stream_io.cpp
- ๅฎไน
audio_stream_io_t็ปๆไฝ - ๅฎ็ฐๆไปถๆตๅ
่ฃ
ๅจ (
audio_stream_io_from_file()) - ๆดๆฐ่งฃ็ ๅจๆฅๅฃไปฅๆฏๆ
audio_stream_io_t - ไฟๆๅๅๅ
ผๅฎน๏ผไป็ถๆฅๅ
FILE*๏ผ
ๆไปถ: audio_http_stream.h, audio_http_stream.cpp
-
HTTP ๆต้ ็ฝฎ็ปๆไฝ
typedef struct { const char *url; size_t buffer_size; // ็ฏๅฝข็ผๅฒๅบๅคงๅฐ (้ป่ฎค: 32KB) uint32_t reconnect_timeout_ms; uint32_t read_timeout_ms; // ๅฏ้: ่ชๅฎไน HTTP ๅคด } audio_http_stream_config_t;
-
HTTP ๆตๅฅๆๅ็ถๆ
typedef struct audio_http_stream* audio_http_stream_handle_t; typedef enum { AUDIO_HTTP_STREAM_STATE_IDLE, AUDIO_HTTP_STREAM_STATE_CONNECTING, AUDIO_HTTP_STREAM_STATE_BUFFERING, AUDIO_HTTP_STREAM_STATE_PLAYING, AUDIO_HTTP_STREAM_STATE_PAUSED, AUDIO_HTTP_STREAM_STATE_ERROR, AUDIO_HTTP_STREAM_STATE_DISCONNECTED } audio_http_stream_state_t;
-
HTTP ไธ่ฝฝไปปๅก
- ไฝฟ็จ ESP-IDF
esp_http_client - ๆฐๆฎๅๅ ฅ็ฏๅฝข็ผๅฒๅบ
- ๅค็้่ฟใ็ผๅฒไธ่ถณ็ญๆ ๅต
- ไฝฟ็จ ESP-IDF
-
HTTP ๆตๅ่ฐไบไปถ
typedef enum { AUDIO_HTTP_STREAM_EVENT_CONNECTED, AUDIO_HTTP_STREAM_EVENT_BUFFERING, // ็ผๅฒไธญ (ไฝไบไฝๆฐดไฝ) AUDIO_HTTP_STREAM_EVENT_BUFFER_READY, // ็ผๅฒ่ถณๅค (้ซไบ้ซๆฐดไฝ) AUDIO_HTTP_STREAM_EVENT_DISCONNECTED, AUDIO_HTTP_STREAM_EVENT_ERROR, AUDIO_HTTP_STREAM_EVENT_FINISHED } audio_http_stream_event_t;
ไฟฎๆนๆไปถ: audio_stream.h, audio_mixer.cpp
-
ๆฐๅข API ๅฝๆฐ
// ็ดๆฅไป URL ๆญๆพ๏ผๅๅปบๆต + HTTP ๅฎขๆท็ซฏ + ่งฃ็ ๏ผ esp_err_t audio_stream_play_url(audio_stream_handle_t h, const char *url); // ๆ่ ๆด็ป็ฒๅบฆ็ๆงๅถ๏ผ audio_http_stream_handle_t audio_http_stream_open(audio_http_stream_config_t *cfg); esp_err_t audio_http_stream_get_stream_io(audio_http_stream_handle_t h, audio_stream_io_t **io); esp_err_t audio_stream_play_from_io(audio_stream_handle_t h, audio_stream_io_t *io);
-
ๆดๆฐ
audio_instance_tไปฅๆฏๆaudio_stream_io_t
ไฟฎๆนๆไปถ: CMakeLists.txt, Kconfig (ๅฏ้)
-
ๆทปๅ HTTP ๆฏๆ็ๅฏ้้ ็ฝฎ
if(CONFIG_AUDIO_PLAYER_ENABLE_HTTP_STREAM) list(APPEND srcs "audio_http_stream.cpp") list(APPEND requires "esp_http_client") endif()
-
Kconfig ้้กน
CONFIG_AUDIO_PLAYER_ENABLE_HTTP_STREAMCONFIG_AUDIO_PLAYER_HTTP_BUFFER_SIZECONFIG_AUDIO_PLAYER_HTTP_LOW_WATERMARKCONFIG_AUDIO_PLAYER_HTTP_HIGH_WATERMARK
ๅบ็จ่ฐ็จ audio_stream_play_url(stream, "http://example.com/audio.mp3")
โ
โโ ๅๅปบ HTTP ๆตๅฅๆ
โโ ๅๅปบ็ฏๅฝข็ผๅฒๅบ (ไพๅฆ 32KB)
โโ ๅฏๅจ HTTP ไธ่ฝฝไปปๅก
โ โ
โ โโ ่ฟๆฅ HTTP ๆๅกๅจ
โ โโ ๆฅๆถ HTTP ๅๅบๅคด
โ โโ ไธ่ฝฝๆฐๆฎ โ ๅๅ
ฅ็ฏๅฝข็ผๅฒๅบ
โ โโ ๆ็ปญไธ่ฝฝ...
โ
โโ ็ญๅพ
็ผๅฒ่พพๅฐ้ซๆฐดไฝ (ไพๅฆ 50%)
โ
โโ ๅๅปบ audio_stream_io_t ็ปๅฎๅฐ HTTP ๆต
โ
โโ ่ฐ็จ audio_instance_play_from_io(instance, io)
โ
โโ ่งฃ็ ๅจไป io->read() ่ฏปๅๆฐๆฎ
โ
โโ ไป็ฏๅฝข็ผๅฒๅบ่ฏปๅ
โ
โโ ๅฆๆ็ผๅฒๅบ็ฉบ๏ผ่งฃ็ ๅจ้ปๅก็ญๅพ
้ซๆฐดไฝ (ๅผๅงๆญๆพ) -> [===========]
ไฝๆฐดไฝ (ๆๅๆญๆพ) -> [==== ]
็ถๆๆบ:
IDLE โ CONNECTING โ BUFFERING โ (็ผๅฒโฅ้ซๆฐดไฝ) โ PLAYING
โ
(็ผๅฒโคไฝๆฐดไฝ)
โ
BUFFERING_WAIT
โ
(็ผๅฒโฅ้ซๆฐดไฝ)
โ
PLAYING
/**
* @brief ไป URL ๆญๆพ้ณ้ข
*
* @param h ้ณ้ขๆตๅฅๆ
* @param url HTTP/HTTPS URL
* @return esp_err_t
*/
esp_err_t audio_stream_play_url(audio_stream_handle_t h, const char *url);
/**
* @brief ไป URL ๆญๆพ้ณ้ข๏ผๅธฆ้
็ฝฎ๏ผ
*
* @param h ้ณ้ขๆตๅฅๆ
* @param url HTTP/HTTPS URL
* @param cfg HTTP ๆต้
็ฝฎ๏ผๅฏไธบ NULL ไฝฟ็จ้ป่ฎค๏ผ
* @return esp_err_t
*/
esp_err_t audio_stream_play_url_with_config(audio_stream_handle_t h, const char *url,
audio_http_stream_config_t *cfg);/**
* @brief ๆๅผ HTTP ๆต
*
* @param cfg ้
็ฝฎ
* @return HTTP ๆตๅฅๆ๏ผๅคฑ่ดฅ่ฟๅ NULL
*/
audio_http_stream_handle_t audio_http_stream_open(audio_http_stream_config_t *cfg);
/**
* @brief ่ทๅๆต IO ๆฅๅฃ
*
* @param h HTTP ๆตๅฅๆ
* @param io_out ่พๅบ IO ๆฅๅฃๆ้
* @return esp_err_t
*/
esp_err_t audio_http_stream_get_io(audio_http_stream_handle_t h, audio_stream_io_t **io_out);
/**
* @brief ๆณจๅ HTTP ๆตไบไปถๅ่ฐ
*/
typedef void (*audio_http_stream_event_cb_t)(audio_http_stream_event_t event, void *user_ctx);
esp_err_t audio_http_stream_register_cb(audio_http_stream_handle_t h,
audio_http_stream_event_cb_t cb,
void *user_ctx);
/**
* @brief ่ทๅๅฝๅ็ผๅฒ็บงๅซ
*
* @param h HTTP ๆตๅฅๆ
* @return ๅทฒ็ผๅฒๅญ่ๆฐ
*/
size_t audio_http_stream_get_buffered_bytes(audio_http_stream_handle_t h);
/**
* @brief ๅ
ณ้ญ HTTP ๆต
*/
esp_err_t audio_http_stream_close(audio_http_stream_handle_t h);
/**
* @brief ไปๆต IO ๆญๆพ๏ผๅ
ผๅฎนๆไปถ/HTTP/ๅ
ๅญๆต๏ผ
*/
esp_err_t audio_stream_play_from_io(audio_stream_handle_t h, audio_stream_io_t *io);include/
โโ audio_stream_io.h # ่พๅ
ฅๆตๆฝ่ฑกๆฅๅฃ
โโ audio_http_stream.h # HTTP ๆตๅ
ฌๅ
ฑ API
audio_stream_io.cpp # ่พๅ
ฅๆตๆฝ่ฑกๅฎ็ฐ + ๆไปถๆต
audio_http_stream.cpp # HTTP ๆตๅฎ็ฐ
include/
โโ audio_player.h # ๆทปๅ play_from_io ๅฃฐๆ
โโ audio_stream.h # ๆทปๅ play_url ๅฃฐๆ
audio_player.cpp # ไฟฎๆน่งฃ็ ๅจไปฅไฝฟ็จ audio_stream_io_t
audio_mixer.cpp # ๆทปๅ HTTP ๆต้ๆ
audio_mp3.cpp # ไฟฎๆนไปฅไฝฟ็จ audio_stream_io_t
audio_wav.cpp # ไฟฎๆนไปฅไฝฟ็จ audio_stream_io_t
audio_decode_types.h # ๅฏ่ฝ้่ฆไฟฎๆน
audio_instance.h # ๆทปๅ stream_io ๆฏๆ
CMakeLists.txt # ๆทปๅ HTTP ๆตๆบๆไปถๅไพ่ต
Kconfig # ๆทปๅ ้
็ฝฎ้้กน๏ผๅฏ้๏ผ
- ESP-IDF ็ปไปถ:
esp_http_client - ๅฏ้ HTTPS ๆฏๆ:
esp-tls
- ๅๅ
ๆต่ฏ:
audio_stream_io็ๆไปถๆต่ฏปๅ - ้ๆๆต่ฏ: ๆญๆพๆฌๅฐ MP3 ้่ฟ stream_io ๆฅๅฃ
- ้ๆๆต่ฏ: ๆญๆพ HTTP MP3 ๆต
- ็ฝ็ปๅผๅธธๆต่ฏ: ไธญๆญ่ฟๆฅใ่ถ ๆถ็ญๆขๅคๆต่ฏ
- ไฟๆๆๆ็ฐๆ API ไธๅ
FILE*ๅๆฐๅจๅ ้จ่ฝฌๆขไธบaudio_stream_io_t- ็ฐๆไปฃ็ ๆ ้ไฟฎๆน
-
ๅ ๅญไฝฟ็จ: ็ฏๅฝข็ผๅฒๅบไผๅขๅ ๅ ๅญๅ ็จ
- ็ผ่งฃ: ๅฏ้ ็ฝฎ็ผๅฒๅบๅคงๅฐ๏ผ้ป่ฎคๅ็ๅผ
-
็ฝ็ปๅปถ่ฟ: ๅๅง็ผๅฒไผๅฏผ่ดๆญๆพๅปถ่ฟ
- ็ผ่งฃ: ๆไพ็ผๅฒไบไปถๅ่ฐ๏ผ็จๆทๅฏๆพ็คบ"็ผๅฒไธญ"
-
HTTPS ่ฏไนฆ: HTTPS ๆต้่ฆ่ฏไนฆ็ฎก็
- ็ผ่งฃ: ๆๆกฃ่ฏดๆๅฆไฝ้ ็ฝฎ่ฏไนฆ
-
่งฃ็ ๅจไธๆฏๆๆตๅผ: ๆไบ่งฃ็ ๅจๅฏ่ฝ้่ฆ seek
- ็ผ่งฃ: MP3/WAV ้ฝๆฏๆๆตๅผ๏ผseek ๅฏ่ฟๅ้่ฏฏ