Skip to content

Latest commit

ย 

History

History
355 lines (285 loc) ยท 12.1 KB

File metadata and controls

355 lines (285 loc) ยท 12.1 KB

HTTP ็ฝ‘็ปœ้Ÿณ้ข‘ๆตๆ’ญๆ”พๅฎž็Žฐ่ง„ๅˆ’

ๆฆ‚่ฟฐ

ๆœฌ่ง„ๅˆ’ๆ–‡ๆกฃๆ่ฟฐๅฆ‚ไฝ•ไธบ esp-audio-player ้กน็›ฎๆทปๅŠ  HTTP ็ฝ‘็ปœ้Ÿณ้ข‘ๆตๆ’ญๆ”พๅŠŸ่ƒฝใ€‚

็Žฐ็Šถๅˆ†ๆž

ๅฝ“ๅ‰ๆžถๆž„

ๅบ”็”จๅฑ‚
    โ”œโ”€ audio_player_* (ๅ•ๆต API)
    โ””โ”€ audio_stream_* (ๅคšๆตๆทท้Ÿณ API)
          โ†“
ๆ ธๅฟƒๅฑ‚ (audio_instance / audio_mixer)
          โ†“
่งฃ็ ๅฑ‚ (audio_mp3, audio_wav)
          โ†“
็กฌไปถๆŠฝ่ฑกๅฑ‚ (I2S ๅ›ž่ฐƒ)

ๅฝ“ๅ‰ๆ•ฐๆฎๆต็จ‹

  1. ไปŽ FILE* ่ฏปๅ–ๆ•ฐๆฎ๏ผˆๆœฌๅœฐๆ–‡ไปถ็ณป็ปŸ๏ผ‰
  2. ่งฃ็ ๅ™จ้€ๅธง่งฃ็ 
  3. 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*                    โ”‚
โ”‚  - ไฟๆŒๅŽŸๆœ‰่งฃ็ ้€ป่พ‘ไธๅ˜                                   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                     โ”‚
              ็Žฐๆœ‰ๆทท้Ÿณ/่พ“ๅ‡บๆžถๆž„

ๅฎž็Žฐๆญฅ้ชค

้˜ถๆฎต 1: ่พ“ๅ…ฅๆตๆŠฝ่ฑกๅฑ‚ (ๅŸบ็ก€)

ๆ–‡ไปถ: audio_stream_io.h, audio_stream_io.cpp

  1. ๅฎšไน‰ audio_stream_io_t ็ป“ๆž„ไฝ“
  2. ๅฎž็Žฐๆ–‡ไปถๆตๅŒ…่ฃ…ๅ™จ (audio_stream_io_from_file())
  3. ๆ›ดๆ–ฐ่งฃ็ ๅ™จๆŽฅๅฃไปฅๆ”ฏๆŒ audio_stream_io_t
  4. ไฟๆŒๅ‘ๅŽๅ…ผๅฎน๏ผˆไป็„ถๆŽฅๅ— FILE*๏ผ‰

้˜ถๆฎต 2: HTTP ๆตๆจกๅ—

ๆ–‡ไปถ: audio_http_stream.h, audio_http_stream.cpp

  1. 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;
  2. 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;
  3. HTTP ไธ‹่ฝฝไปปๅŠก

    • ไฝฟ็”จ ESP-IDF esp_http_client
    • ๆ•ฐๆฎๅ†™ๅ…ฅ็Žฏๅฝข็ผ“ๅ†ฒๅŒบ
    • ๅค„็†้‡่ฟžใ€็ผ“ๅ†ฒไธ่ถณ็ญ‰ๆƒ…ๅ†ต
  4. 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;

้˜ถๆฎต 3: ้›†ๆˆๅˆฐ็Žฐๆœ‰ API

ไฟฎๆ”นๆ–‡ไปถ: audio_stream.h, audio_mixer.cpp

  1. ๆ–ฐๅขž 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);
  2. ๆ›ดๆ–ฐ audio_instance_t ไปฅๆ”ฏๆŒ audio_stream_io_t

้˜ถๆฎต 4: ้…็ฝฎๅ’Œไพ่ต–

ไฟฎๆ”นๆ–‡ไปถ: CMakeLists.txt, Kconfig (ๅฏ้€‰)

  1. ๆทปๅŠ  HTTP ๆ”ฏๆŒ็š„ๅฏ้€‰้…็ฝฎ

    if(CONFIG_AUDIO_PLAYER_ENABLE_HTTP_STREAM)
        list(APPEND srcs "audio_http_stream.cpp")
        list(APPEND requires "esp_http_client")
    endif()
  2. Kconfig ้€‰้กน

    • CONFIG_AUDIO_PLAYER_ENABLE_HTTP_STREAM
    • CONFIG_AUDIO_PLAYER_HTTP_BUFFER_SIZE
    • CONFIG_AUDIO_PLAYER_HTTP_LOW_WATERMARK
    • CONFIG_AUDIO_PLAYER_HTTP_HIGH_WATERMARK

ๆ•ฐๆฎๆต็จ‹่ฏฆๆƒ…

HTTP ๆ’ญๆ”พๆต็จ‹

ๅบ”็”จ่ฐƒ็”จ 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

API ่ฎพ่ฎก

้ซ˜ๅฑ‚ API (็ฎ€ๅ•ไฝฟ็”จ)

/**
 * @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);

ไฝŽๅฑ‚ API (้ซ˜็บงๆŽงๅˆถ)

/**
 * @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

ๆต‹่ฏ•่ฎกๅˆ’

  1. ๅ•ๅ…ƒๆต‹่ฏ•: audio_stream_io ็š„ๆ–‡ไปถๆต่ฏปๅ†™
  2. ้›†ๆˆๆต‹่ฏ•: ๆ’ญๆ”พๆœฌๅœฐ MP3 ้€š่ฟ‡ stream_io ๆŽฅๅฃ
  3. ้›†ๆˆๆต‹่ฏ•: ๆ’ญๆ”พ HTTP MP3 ๆต
  4. ็ฝ‘็ปœๅผ‚ๅธธๆต‹่ฏ•: ไธญๆ–ญ่ฟžๆŽฅใ€่ถ…ๆ—ถ็ญ‰ๆขๅคๆต‹่ฏ•

ๅ‘ๅŽๅ…ผๅฎนๆ€ง

  • ไฟๆŒๆ‰€ๆœ‰็Žฐๆœ‰ API ไธๅ˜
  • FILE* ๅ‚ๆ•ฐๅœจๅ†…้ƒจ่ฝฌๆขไธบ audio_stream_io_t
  • ็Žฐๆœ‰ไปฃ็ ๆ— ้œ€ไฟฎๆ”น

้ฃŽ้™ฉๅ’Œๆณจๆ„ไบ‹้กน

  1. ๅ†…ๅญ˜ไฝฟ็”จ: ็Žฏๅฝข็ผ“ๅ†ฒๅŒบไผšๅขžๅŠ ๅ†…ๅญ˜ๅ ็”จ

    • ็ผ“่งฃ: ๅฏ้…็ฝฎ็ผ“ๅ†ฒๅŒบๅคงๅฐ๏ผŒ้ป˜่ฎคๅˆ็†ๅ€ผ
  2. ็ฝ‘็ปœๅปถ่ฟŸ: ๅˆๅง‹็ผ“ๅ†ฒไผšๅฏผ่‡ดๆ’ญๆ”พๅปถ่ฟŸ

    • ็ผ“่งฃ: ๆไพ›็ผ“ๅ†ฒไบ‹ไปถๅ›ž่ฐƒ๏ผŒ็”จๆˆทๅฏๆ˜พ็คบ"็ผ“ๅ†ฒไธญ"
  3. HTTPS ่ฏไนฆ: HTTPS ๆต้œ€่ฆ่ฏไนฆ็ฎก็†

    • ็ผ“่งฃ: ๆ–‡ๆกฃ่ฏดๆ˜Žๅฆ‚ไฝ•้…็ฝฎ่ฏไนฆ
  4. ่งฃ็ ๅ™จไธๆ”ฏๆŒๆตๅผ: ๆŸไบ›่งฃ็ ๅ™จๅฏ่ƒฝ้œ€่ฆ seek

    • ็ผ“่งฃ: MP3/WAV ้ƒฝๆ”ฏๆŒๆตๅผ๏ผŒseek ๅฏ่ฟ”ๅ›ž้”™่ฏฏ