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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用: 在Ubuntu 20.04.4 LTS操作系统中,我已经安装了ESP-idf开发环境并使用了一段时间。现在我想安装esp-adf音频开发框架,但遇到了问题。可以在https://***/index.html找到相关文档。 引用: LinkGUI™ Air E32是一个开发平台,基于ESP32 WROVER芯片组,可以实现完美的图形交互体验。它将GUI系统嵌入到乐鑫开源的ESP-ADF/ESP-IDF开发环境中,提供了丰富的UI交互功能。LinkGUI™ Air E32平台由ESP32 WROVER芯片、LCD、按键、T卡插槽、喇叭插槽、麦克风和扩展接口组成。它的SDK以基于ESP-ADF的LinkGUI图形系统为核心,与ESP-ADF开发环境无缝连接,实现了WIFI/BT/音频和高级图形交互的功能。 根据您的问题,您想了解在Ubuntu操作系统上使用esp-adf和lvgl。首先,esp-adf是一个音频开发框架,用于在ESP32芯片上开发音频应用程序。它提供了丰富的音频功能和示例,可以实现音频播放、录制、语音识别等功能。 而lvgl是一个开源的图形库,用于创建嵌入式设备上的用户界面。它提供了丰富的图形元素和交互功能,可以实现按钮、滑块、进度条、列表等常见的UI元素。 在Ubuntu操作系统上,您可以按照ESP-ADF文档中提供的步骤安装和配置esp-adf开发环境。然后,您可以使用lvgl库开发具有图形界面的应用程序。您可以参考lvgl的官方文档和示例来学习如何使用lvgl库进行UI设计和交互。 总结起来,esp-adf是一个音频开发框架,lvgl是一个图形库。您可以在Ubuntu操作系统上使用esp-adf开发音频应用程序,并结合lvgl库创建图形界面。希望这能帮助到您。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Ubuntn环境下安装ESP 音频框架时出现Failed to resolve component ‘jsmn‘.问题(已解决)](https://blog.csdn.net/qq_41601311/article/details/124293303)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [基于ESP-ADF的图形系统](https://blog.csdn.net/skdev/article/details/120765588)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值