这个源码里面如何实现录音传给http的,代码中没有看到录音的数据缓存,不知道录音的数据是在哪里传到http的?
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "esp_wifi.h"
#include "nvs_flash.h"
#include "esp_http_client.h"
#include "sdkconfig.h"
#include "audio_element.h"
#include "audio_pipeline.h"
#include "audio_event_iface.h"
#include "audio_common.h"
#include "audio_hal.h"
#include "http_stream.h"
#include "i2s_stream.h"
#include "wav_encoder.h"
#include "esp_peripherals.h"
#include "periph_button.h"
#include "periph_wifi.h"
#include "filter_resample.h"
static const char *TAG = "REC_RAW_HTTP";
esp_err_t _http_stream_event_handle(http_stream_event_msg_t *msg)
{
esp_http_client_handle_t http = (esp_http_client_handle_t)msg->http_client;
char len_buf[16];
static int total_write = 0;
if (msg->event_id == HTTP_STREAM_PRE_REQUEST) {
// set header
ESP_LOGI(TAG, "[ + ] HTTP client HTTP_STREAM_PRE_REQUEST, lenght=%d", msg->buffer_len);
esp_http_client_set_header(http, "x-audio-sample-rates", "16000");
esp_http_client_set_header(http, "x-audio-bits", "16");
esp_http_client_set_header(http, "x-audio-channel", "2");
total_write = 0;
return ESP_OK;
}
if (msg->event_id == HTTP_STREAM_ON_REQUEST) {
// write data
int wlen = sprintf(len_buf, "%x\r\n", msg->buffer_len);
if (esp_http_client_write(http, len_buf, wlen) <= 0) {
return ESP_FAIL;
}
if (esp_http_client_write(http, msg->buffer, msg->buffer_len) <= 0) {
return ESP_FAIL;
}
if (esp_http_client_write(http, "\r\n", 2) <= 0) {
return ESP_FAIL;
}
total_write += msg->buffer_len;
printf("\033[A\33[2K\rTotal bytes written: %d\n", total_write);
return msg->buffer_len;
}
if (msg->event_id == HTTP_STREAM_POST_REQUEST) {
ESP_LOGI(TAG, "[ + ] HTTP client HTTP_STREAM_POST_REQUEST, write end chunked marker");
if (esp_http_client_write(http, "0\r\n\r\n", 5) <= 0) {
return ESP_FAIL;
}
return ESP_OK;
}
if (msg->event_id == HTTP_STREAM_FINISH_REQUEST) {
ESP_LOGI(TAG, "[ + ] HTTP client HTTP_STREAM_FINISH_REQUEST");
char *buf = calloc(1, 64);
assert(buf);
int read_len = esp_http_client_read(http, buf, 64);
if (read_len <= 0) {
free(buf);
return ESP_FAIL;
}
buf[read_len] = 0;
ESP_LOGI(TAG, "Got HTTP Response = %s", (char *)buf);
free(buf);
return ESP_OK;
}
return ESP_OK;
}
void app_main(void)
{
audio_pipeline_handle_t pipeline;
audio_element_handle_t http_stream_writer, i2s_stream_reader;
esp_log_level_set("*", ESP_LOG_WARN);
esp_log_level_set(TAG, ESP_LOG_INFO);
esp_err_t err = nvs_flash_init();
if (err == ESP_ERR_NVS_NO_FREE_PAGES) {
// NVS partition was truncated and needs to be erased
// Retry nvs_flash_init
ESP_ERROR_CHECK(nvs_flash_erase());
err = nvs_flash_init();
}
tcpip_adapter_init();
ESP_LOGI(TAG, "[ 1 ] Initialize Button Peripheral & Connect to wifi network");
// Initialize peripherals management
esp_periph_config_t periph_cfg = { 0 };
esp_periph_init(&periph_cfg);
periph_wifi_cfg_t wifi_cfg = {
.ssid = CONFIG_WIFI_SSID,
.password = CONFIG_WIFI_PASSWORD,
};
esp_periph_handle_t wifi_handle = periph_wifi_init(&wifi_cfg);
// Initialize Button peripheral
periph_button_cfg_t btn_cfg = {
.gpio_mask = GPIO_SEL_36 | GPIO_SEL_39, //REC BTN & MODE BTN
};
esp_periph_handle_t button_handle = periph_button_init(&btn_cfg);
// Start wifi & button peripheral
esp_periph_start(button_handle);
esp_periph_start(wifi_handle);
periph_wifi_wait_for_connected(wifi_handle, portMAX_DELAY);
ESP_LOGI(TAG, "[ 2 ] Start codec chip");
audio_hal_codec_config_t audio_hal_codec_cfg = AUDIO_HAL_ES8388_DEFAULT();
audio_hal_codec_cfg.i2s_iface.samples = AUDIO_HAL_16K_SAMPLES;
audio_hal_handle_t hal = audio_hal_init(&audio_hal_codec_cfg, 0);
audio_hal_ctrl_codec(hal, AUDIO_HAL_CODEC_MODE_ENCODE, AUDIO_HAL_CTRL_START);
ESP_LOGI(TAG, "[3.0] Create audio pipeline for recording");
audio_pipeline_cfg_t pipeline_cfg = DEFAULT_AUDIO_PIPELINE_CONFIG();
pipeline = audio_pipeline_init(&pipeline_cfg);
mem_assert(pipeline);
ESP_LOGI(TAG, "[3.1] Create http stream to post data to server");
http_stream_cfg_t http_cfg = HTTP_STREAM_CFG_DEFAULT();
http_cfg.type = AUDIO_STREAM_WRITER;
http_cfg.event_handle = _http_stream_event_handle;
http_stream_writer = http_stream_init(&http_cfg);
ESP_LOGI(TAG, "[3.2] Create i2s stream to read audio data from codec chip");
i2s_stream_cfg_t i2s_cfg = I2S_STREAM_CFG_DEFAULT();
i2s_cfg.type = AUDIO_STREAM_READER;
i2s_stream_reader = i2s_stream_init(&i2s_cfg);
ESP_LOGI(TAG, "[3.3] Register all elements to audio pipeline");
audio_pipeline_register(pipeline, i2s_stream_reader, "i2s");
audio_pipeline_register(pipeline, http_stream_writer, "http");
ESP_LOGI(TAG, "[3.4] Link it together [codec_chip]-->i2s_stream->http_stream-->[http_server]");
audio_pipeline_link(pipeline, (const char *[]) {"i2s", "http"}, 2);
ESP_LOGI(TAG, "[ 4 ] Setup event listener");
audio_event_iface_cfg_t evt_cfg = AUDIO_EVENT_IFACE_DEFAULT_CFG();
audio_event_iface_handle_t evt = audio_event_iface_init(&evt_cfg);
ESP_LOGI(TAG, "[4.1] Listening event from the pipeline");
audio_pipeline_set_listener(pipeline, evt);
ESP_LOGI(TAG, "[4.2] Listening event from peripherals");
audio_event_iface_set_listener(esp_periph_get_event_iface(), evt);
i2s_stream_set_clk(i2s_stream_reader, 16000, 16, 2);
ESP_LOGI(TAG, "[ 5 ] Listen for all pipeline events");
while (1) {
audio_event_iface_msg_t msg;
esp_err_t ret = audio_event_iface_listen(evt, &msg, portMAX_DELAY);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "[ * ] Event interface error : %d", ret);
continue;
}
if (msg.source_type != PERIPH_ID_BUTTON) {
continue;
}
// It's not REC button
if ((int)msg.data == GPIO_NUM_39) {
break;
}
// It's not REC button
if ((int)msg.data != GPIO_NUM_36) {
continue;
}
if (msg.cmd == PERIPH_BUTTON_PRESSED) {
ESP_LOGI(TAG, "[ * ] Resuming pipeline");
audio_element_set_uri(http_stream_writer, CONFIG_SERVER_URI);
audio_pipeline_run(pipeline);
} else if (msg.cmd == PERIPH_BUTTON_RELEASE || msg.cmd == PERIPH_BUTTON_LONG_RELEASE) {
ESP_LOGI(TAG, "[ * ] Stop pipeline");
audio_pipeline_stop(pipeline);
audio_pipeline_wait_for_stop(pipeline);
audio_pipeline_terminate(pipeline);
}
}
ESP_LOGI(TAG, "[ 6 ] Stop audio_pipeline");
audio_pipeline_terminate(pipeline);
/* Terminal the pipeline before removing the listener */
audio_pipeline_remove_listener(pipeline);
/* Stop all periph before removing the listener */
esp_periph_stop_all();
audio_event_iface_remove_listener(esp_periph_get_event_iface(), evt);
/* Make sure audio_pipeline_remove_listener & audio_event_iface_remove_listener are called before destroying event_iface */
audio_event_iface_destroy(evt);
/* Release all resources */
audio_pipeline_deinit(pipeline);
audio_element_deinit(http_stream_writer);
audio_element_deinit(i2s_stream_reader);
esp_periph_destroy();
}
离线
看代码 _http_stream_event_handle 是回调函数吧,应该是这个 HTTP_STREAM_ON_REQUEST 状态实现数据传输的。
路哥,应该是录音的数据放在内存缓冲里,在用http上传到服务器,现在不知道录音的缓冲数据放在那里?
离线
esp_http_client_write 这个函数会写到 ip协议栈的。
路哥,我意思是说iis录音的pcm数据放在那里?
离线
楼主看下这个sdcard 录音demo,更简单一点,可以跟进源码看下
这个也一样,看不出来代码是怎么获得pcm数据,我说的是pcm数据,我说的是pcm数据
,我说的是pcm数据?录音的的数据放在什么变量里???
离线