esp-adf音频框架 :audio stream->HTTP Stream

http stream一般作为整个管道的最后一个元素或第一个元素,用于读取http 音频流或者是将音频流发送到http 服务器中。

http stream实现了一个http client 设备,当运行http stream元素时创建一个基于http client与远程的http server 通信。

HTTP Stream 文件位置在:

/esp-adf/components/audio_steam/http_stream.c
/esp-adf/components/audio_steam/include/http_stream.c
  • http stream hook 类型
typedef enum {
    HTTP_STREAM_PRE_REQUEST = 0x01, //将在HTTP客户端与服务器建立连接之前调用事件处理程序
    /*
     * 当HTTP Client请求数据时,将调用事件处理程序。
     * 如果fucntion返回值(-1:ESP_FAIL),则HTTP Client将停止.
     * 如果fucntion返回值> 0,则HTTP Stream将忽略post_field
     * 如果fucntion返回值= 0,HTTP流继续从post_field发送数据(如果有)
     */
    HTTP_STREAM_ON_REQUEST,
    /*
     * 当HTTP客户端接收数据时,将调用事件处理程序。
     * 如果fucntion返回值(-1:ESP_FAIL),则HTTP Client将停止.
     * 如果fucntion返回值> 0,则HTTP Stream将忽略读取函数。
     * 如果fucntion返回值= 0, HTTP流继续从HTTP Server读取数据
     */
    HTTP_STREAM_ON_RESPONSE,  
    /*
     * 在HTTP客户端将标头和正文发送到服务器之后,在获取标头之前,将调用事件处理程序
     */
    HTTP_STREAM_POST_REQUEST,   
    /*
     * 在HTTP客户端获取标头并准备读取HTTP正文之后,将调用事件处理程序
     */
    HTTP_STREAM_FINISH_REQUEST,    
    HTTP_STREAM_RESOLVE_ALL_TRACKS,
    HTTP_STREAM_FINISH_TRACK,
    HTTP_STREAM_FINISH_PLAYLIST,
} http_stream_event_id_t;
  • 事件回调函数处理
/**
 * @brief  http stream 事件处理消息
 */
typedef struct {
    http_stream_event_id_t  event_id;       /*!< 事件 ID */
    void                    *http_client;   /*!< 通过这个http stream 指针可以引用整个http client  */
    void                    *buffer;        /*!< 通过这个指针可以获得http stream 缓冲区 */
    int                     buffer_len;     /*!< 缓冲区长度 */
    void                    *user_data;     /*!< 用户指针,在http_stream_cfg_t中设置 */
    audio_element_handle_t  el;             /*!< 音频元素上下文 */
} http_stream_event_msg_t;

/*事件回调函数*/
typedef int (*http_stream_event_handle_t)(http_stream_event_msg_t *msg);
  • http stream 配置选项
typedef struct {
    audio_stream_type_t         type;                   /*!< 流类型  */
    int                         out_rb_size;            /*!< 输出环形缓冲区的大小 */
    int                         task_stack;             /*!< 任务堆栈大小 */
    int                         task_core;              /*!< 任务所在内核(0或1)*/
    int                         task_prio;              /*!< 任务优先级 */
    http_stream_event_handle_t  event_handle;           /*!< HTTP Stream 的回调函数 */
    void                        *user_data;             /*!< 用户数据 */
    bool                        auto_connect_next_track;/*!< 无需打开/关闭即可连接下一首曲目 */
    bool                        enable_playlist_parser; /*!< 启用播放列表解析器*/
    int                         multi_out_num;          /*!< 倍数输出*/
} http_stream_cfg_t;
  • http stream 初始化
/**
 * @brief      创建音频元素的句柄,以将数据从HTTP流传输到另一个元素,或从发送到HTTP的其他元素获取数据,
 *             具体取决于流类型(AUDIO_STREAM_READER或AUDIO_STREAM_WRITER)的配置。
 *
 * @param      配置选项
 *
 * @return     音频元素手柄
 */
audio_element_handle_t http_stream_init(http_stream_cfg_t *config);
  • 使用方法
#define AAC_STREAM_URI "http://open.ls.qingting.fm/live/274/64k.m3u8?format=aac"

    /*定义回调函数*/
    int _http_stream_event_handle(http_stream_event_msg_t *msg)
    {
        if (msg->event_id == HTTP_STREAM_RESOLVE_ALL_TRACKS) {
            return ESP_OK;
        }

        if (msg->event_id == HTTP_STREAM_FINISH_TRACK) {
            return http_stream_next_track(msg->el);
        }
        if (msg->event_id == HTTP_STREAM_FINISH_PLAYLIST) {
            return http_stream_restart(msg->el);
        }
        return ESP_OK;

    }
    /*初始化*/
    http_stream_cfg_t http_cfg = HTTP_STREAM_CFG_DEFAULT();
    http_cfg.event_handle = _http_stream_event_handle;
    http_cfg.type = AUDIO_STREAM_READER;
    http_cfg.enable_playlist_parser = true;
    http_stream_reader = http_stream_init(&http_cfg);
    /*将元素注册到管道中*/
    audio_pipeline_register(pipeline, http_stream_reader, "http");
    /*链接管道中的各个元素*/
    audio_pipeline_link(pipeline, (const char *[]) {"http",  "aac", "i2s"}, 3);
    /*设置http 服务器路径*/
    audio_element_set_uri(http_stream_reader, AAC_STREAM_URI);
    /*运行管道*/
    audio_pipeline_run(pipeline);

欢迎关注我的个人网站:zwww.zcxbb.com

知乎专栏:物联网开发入门 - 知乎 (zhihu.com)

你可能感兴趣的:(ESP32开发快速入门,音视频)