当前位置: 首页 > news >正文

【涂鸦T5】3. 录音

硬件

开发板上有两个mic,默认用的mic1。不需要外接mic
在这里插入图片描述

注意sd卡不要用大容量的卡,4g或者8g可以,否则会遇到mount失败的问题

编译

在这里插入图片描述

代码

TuyaOpen/examples/multimedia/audio/audio_recorder

可以拷贝example中的代码,但是会有问题,需要部分修改
见如下,可以直接拷贝下来,存成diff.txt,拷贝到TuyaOpen目录下,用git apply diff.txt命令自动复制改动

把模式切换成了sd卡存储

diff --git a/examples/multimedia/audio/audio_recorder/src/example_recorder.c b/examples/multimedia/audio/audio_recorder/src/example_recorder.c
index 397e57c..03e67c6 100644
--- a/examples/multimedia/audio/audio_recorder/src/example_recorder.c
+++ b/examples/multimedia/audio/audio_recorder/src/example_recorder.c
@@ -38,7 +38,7 @@#define USE_RING_BUFFER      0#define USE_INTERNAL_FLASH   1 // Store recording file in internal flash#define USE_SD_CARD          2
-#define RECORDER_FILE_SOURCE USE_RING_BUFFER
+#define RECORDER_FILE_SOURCE USE_SD_CARD#if (RECORDER_FILE_SOURCE == USE_INTERNAL_FLASH)#define RECORDER_FILE_DIR      "/"
@@ -98,12 +98,14 @@ struct recorder_ctx sg_recorder_ctx = {.file_hdl = NULL,};+int flag_status = 0;/**********************************************************************************function define*********************************************************************************/static void app_audio_trigger_pin_init(void){OPERATE_RET rt = OPRT_OK;
+    PR_DEBUG("%s", __func__);TUYA_GPIO_BASE_CFG_T pin_cfg = {.mode = TUYA_GPIO_PULLUP,
@@ -119,7 +121,31 @@ static BOOL_T audio_trigger_pin_is_pressed(void){TUYA_GPIO_LEVEL_E level = TUYA_GPIO_LEVEL_HIGH;tkl_gpio_read(AUDIO_TRIGGER_PIN, &level);
-    return (level == TUYA_GPIO_LEVEL_LOW) ? TRUE : FALSE;
+    if (level == TUYA_GPIO_LEVEL_LOW){
+        PR_DEBUG("TUYA_GPIO_LEVEL_LOW");
+        tal_system_sleep(1000);
+        flag_status += 1;
+        if(flag_status == 3)
+            flag_status = 0;
+        switch (flag_status)
+        {
+        case 0:
+            PR_DEBUG("Flag waitting");
+            break;
+        case 1:
+            PR_DEBUG("Flag start record");
+            break;
+        case 2:
+            PR_DEBUG("Flag end record");
+            break;
+        default:
+            PR_DEBUG("Flag waitting");
+            break;
+        }
+        return TRUE;
+    } else {
+        return FALSE;
+    }}static int _audio_frame_put(TKL_AUDIO_FRAME_INFO_T *pframe)
@@ -139,6 +165,7 @@ static int _audio_frame_put(TKL_AUDIO_FRAME_INFO_T *pframe)static void app_audio_init(void){TKL_AUDIO_CONFIG_T config;
+    PR_DEBUG("%s", __func__);memset(&config, 0, sizeof(TKL_AUDIO_CONFIG_T));@@ -343,10 +370,11 @@ static OPERATE_RET app_pcm_to_wav(char *pcm_file)return rt;}-    TAL_PR_HEXDUMP_DEBUG("wav head", head, WAV_HEAD_LEN);
+    PR_HEXDUMP_DEBUG("wav head", head, WAV_HEAD_LEN);// Create wav fileTUYA_FILE wav_hdl = tkl_fopen(RECORDER_WAV_FILE_PATH, "w");
+    char *read_buf = tkl_system_psram_malloc(PCM_FRAME_SIZE);if (NULL == wav_hdl) {PR_ERR("open file: %s failed", RECORDER_WAV_FILE_PATH);rt = OPRT_FILE_OPEN_FAILED;
@@ -357,7 +385,7 @@ static OPERATE_RET app_pcm_to_wav(char *pcm_file)tkl_fwrite(head, WAV_HEAD_LEN, wav_hdl);// Read pcm file
-    char *read_buf = tkl_system_psram_malloc(PCM_FRAME_SIZE);
+if (NULL == read_buf) {PR_ERR("tkl_system_psram_malloc failed");// return OPRT_COM_ERROR;
@@ -410,13 +438,16 @@ static void app_recorder_thread(void *arg){OPERATE_RET rt = OPRT_OK;+    PR_DEBUG("%s", __func__);app_audio_trigger_pin_init();app_audio_init();+    PR_DEBUG("%s start for", __func__);for (;;) {
+        if(flag_status == 1)app_mic_record();-        if (FALSE == audio_trigger_pin_is_pressed()) {
+        if (FALSE == audio_trigger_pin_is_pressed() && flag_status == 2) {tal_system_sleep(100);// End recording
@@ -451,7 +482,7 @@ static void app_recorder_thread(void *arg)}// Start recording
-        if (FALSE == sg_recorder_ctx.recording) {
+        if ((FALSE == sg_recorder_ctx.recording) && flag_status == 1) {#if (RECORDER_FILE_SOURCE == USE_INTERNAL_FLASH) || (RECORDER_FILE_SOURCE == USE_SD_CARD)// If recording file exists, delete itBOOL_T is_exist = FALSE;

测试

我增加了一个机制,状态转换:wait record -> start record -> record end
按一次开始录制,按第二次停止录制。
在这里插入图片描述

录制完成后可以把sd卡插在电脑上去听。

缺点:示例代码只能录制采样率16k,位深16bit的音频,我试过想要录制48k的,提示size过大,这个等后面有空再看。
就目前听到效果还行,人声基本能听清内容。

问题

rt的问题在USE_RING_BUFFER会遇到,但是切换到USE_SD_CARD就不会了
在这里插入图片描述

需要把代码挪下位置,因为直接go to __EXIT,会导致部分代码无法运行,所以挪到前面

char *read_buf = tkl_system_psram_malloc(PCM_FRAME_SIZE);

在这里插入图片描述

http://www.dtcms.com/a/355772.html

相关文章:

  • 实验项目:Kubernetes Ingress 实战演练
  • Cesium入门教程(三)环境搭建(Vue版)
  • 蓝凌研究院《2025上市公司AI数智化转型白皮书》发布
  • 【力扣】2725. 间隔取消
  • linux 环境 批量发送get请求
  • 大模型常用术语
  • 机器视觉学习-day10-图像添加水印
  • 帕萨特盘式制动器cad+设计说明书
  • TensorFlow 面试题及详细答案 120道(41-50)-- 数据输入与管道
  • workflow/http_parser源码解密:HTTP解析器的双倍扩容与零拷贝策略
  • 【C#】征服 .NET Framework 4.8 中的“古董”日期格式:/Date(1754548600000)/ 和 ISO 8601
  • 【Nacos】优雅规范的使用和管理yml配置文件
  • 苍穹外卖项目笔记day01
  • 工业级TF卡NAND + 北京君正 + Rk瑞芯微的应用
  • 本地大模型部署(下载) vs. 从头训练大模型
  • APP手游使用游戏盾SDK为何能有效抵御各类攻击?
  • ApiFox高并发测试用例
  • hintcon2025 IMGC0NV
  • 2024中山大学研保研上机真题
  • 多模态融合新纪元:Ovis2.5 本地部署教程,实现文本、图像与代码的深度协同推理
  • 力扣hot100:滑动窗口最大值优化策略及思路讲解(239)
  • MySQL 索引失效全解析与优化指南
  • 【软考】中级网络工程师历年真题合集下载(2015-2024)
  • Java多线程超详学习内容
  • Python 中的反射机制与动态灵活性
  • Spring学习笔记:Spring JDBC(jdbc Template)的深入学习和使用
  • 行业前瞻:在线教育系统源码与网校APP开发的技术进化方向
  • C++学习笔记之异常处理
  • Pruning-Guided Curriculum Learning
  • 机器视觉学习-day06-图像旋转