音视频录像开发流程
📎 原始文档:https://www.kdocs.cn/l/cdjxSIq4HAFB 音视频录像开发流程
最新版本:
701n_v221_Camare_avi_带录音录像_优化帧率_20241111.rar
701n_v221_Camera_avi_带录音录像_20250110.rar
注意:
- 适配的摄像头是BY20A6,SPI时钟频率为96MHz,当需要适配BY30A2型号的摄像头时,需要更改SPI的时钟频率改为48MH,及以下;
- 由于模组的封装不一样,有的模组需要将SPI的CLK初始化为上拉或者下拉;
补丁:
20250110:
701n_v221_20250110补丁.rar
此补丁是基于最新版本的,需要先升级20241111的sdk
- 修复已知内存泄露问题
- 修复删除摄像头ui回放线程死机
- 修复频繁开关摄像头线程死机
- 修复录制过程中死机
- 修复jpg显示死机
- 修复录制时长不对导致的音频播放卡顿,以及录制时长不正确的问题。
20241111:
- 适配基于20241111之前的软件版本:
- 补丁修改的文件:





- 编译异常、使用异常: 查看8.异常处理。
音视频录像开发流程
此文档主要以方便客户可以快速开发为目的,所以此文档主要说明录像组件开发demo的使用。客户可在文档下留言,会动态对文档进行改动。
录像功能开发的流程图
图1录音功能开发的流程图
图2手表701摄像头性能资源评估(RAM消耗与帧率评估) https://kdocs.cn/l/csDJk6KoEKuC
手表701摄像头性能数据评估(1).otl原理图
摄像头硬件IO配置

音频音频硬件连接原理图
图4
注意,MIC和MICLDO的硬件连接分别是PA1和PA0。
5. 硬件连接 
- 音视频录像组件的软件开发流程
- 图像录像开发流程
- 相关宏定义 文件路径:apps\watch\board\br28\board_701n_demo\board_701n_demo.c
apps\watch\video\avi_recode_demo.c
I2C结构体配置const struct soft_iic_config soft_iic_cfg[]={}主要配置IIC的硬件GPIO引脚。而\avi_recode_demo.c的宏定义,只要配置JPG编码对应配置,包括SPI数据包包头SPI_FEND_SIZE、包尾SPI_LEND_SIZE、以及行头SPI_FHEAD_SIZE和行尾SPI_LHEAD_SIZE的大小。同时,配置图像的像素为240*320,JPG一次编码的大小为DMA_LBUF_SIZE,但注意,当JPG编码质量大的时候需要增大该变量。SPI通信是JL701N使用SPI2从机通信,SPI时钟由IO_PORTA_05提供。
图5
通过修改board_701n_demo_cfg.h对应的宏来控制录像是否需要音频、录像时同步开启音频播放等配置信息。
- 选择接入的摄像头类型:
/*选择摄像头类型*/
#define CAMRAE_30A2 0
#define CAMRAE_20A6 1
#define TCFG_CAMARE_OPTION CAMRAE_30A2 //0:30a2, 1:20a6 (默认0)
- 选择在录像的时候是否需要录音:
- 选择是否在录音的时候同步播放音频:
//在录音的时候同时播放音频
#define TCFG_SUPPORT_MIC_SYNC_PLAY DISABLE_THIS_MOUDLE
在audio_mic_cbuf.c/.h文件添加标志位设置函数:
void audio_set_sync_flag(u8 status);
u8 audio_get_sync_flag(void);
在使能了宏控制TCFG_SUPPORT_MIC_SYNC_PLAY后,需要对该标志位sync_flags进行控制 audio_set_sync_flag(1),控制完成以下几个步骤:
1. 在开启mic adc采集前audio_mic_open(),需要初始化mci_cbuf_hdl->pcm_cbuf链表; 2. 在将mic adc数据传输到音频设时usr_audio_mic_cbuf_data_write(),要同步将数据写到mci_cbuf_hdl->pcm_cbuf链表中保存(在第3)步中),方便进行后续的pcm解码。 3. 将数据传输到pcm组件进行解码audio_dac_pcm_fread(),需要读取mci_cbuf_hdl->pcm_cbuf中的数据; 4. 解码结束或者录音结束,在kill录音线程中,需要清除标志位audio_set_sync_flag(0); 5. 同时,在avi_replay_demo.c中的aci_replay_start()函数中清除sync_flags标志位,减少mci_cbuf_hdl->pcm_cbuf内存的使用,不清除该标志位,可能会出现操作空指针的异常。 2. 按键响应和处理事件入口 文件路径:apps\watch\task_manager\app_common.c
使用按键作为录像事件的触发机制,key2是触发录像功能,key1是复位,也是触发录像回放的按键。
图6
通过key2按键事件KEY_UI_SHORTCUT触发录像组件的录像功能,其中avi_set_recode_flag()和reset_stop_flag()函数分别是视频流转化为avi编码的标志和停止录像的标志,avi_recode_demo()函数是获取视频流后,进行avi视频编码函数,set_play_mode(1)设置开始录像的标志;
图7
3. avi录像编码函数 文件路径:apps\watch\video\avi_recode_demo.c
avi_recode_demo()是avi视频编码函数,其主要是配置音视频同步封装配置,以及实现avi视频编码功能,其中vpkg_cycle_time = cycle_time配置视频采样率,info.minfo.vid_fps = fps是配置视频帧率,该图像传感器的最大视频帧率为30fps,值得注意的是,info.minfo.aud_en = 1是开启音频封装的重要标志,同时,音频的采样率info.minfo.aud_sr = 8000要和mic的adc采样率保持一致。
图8
4. 录像标志 文件路径:apps\watch\ui\lcd\STYLE_WATCH_NEW\ui_action_watch.c
set_play_mode()函数是设置录像与否的标志,通过设置play_mode变量的值来决定是否开始录像,play_mode=1开始录像,play_mode=0回放录像,这两个状态是在ui_action_watch.c文件中DRAW_DEMO_onchange()函数中通过ON_CHANGE_FIRST_SHOW事件实现,如图10所示。
图9
5. 录像开始线程 文件路径:apps\watch\ui\lcd\STYLE_WATCH_NEW\ui_action_watch.c
cpu\br28\audio_enc\audio_mic_cbuf.c 和apps\watch\video\avi_recode_demo.c
开启录像操作的函数在是DRAW_DEMO_onchange()函数中实现,在play_mode置位1的时候,开启录音线程creat_aud_task()和录像线程creat_vid_task(); 其内部实现的函数如图13和图11所示。
图10
6. 音视频流处理线程 1)录视频文件路径:apps\watch\video\avi_recode_demo.c
视频录制线程实现函数vid_stream_task(),其内容是初始化BF30A2图像传感器和开启
mic数据采集,其内容二是通过spi获取图像传感器数据,将分辨率为240320的图像保存在lbuf中,并通过将240320分辨率的图片分成10张分辨率为240*32的图片进行YUV编码处理。
需要注意是,音频和视频流的avi编码接口函数aud_din(u8 *data,u32 len)和vid_stream_din(u8 *data, u32 len)的传参指针u8 *data是需要外部申请一段动态内存后传入,其在avi编码函数内部自动进行释放,若传参指针变量不是动态申请的内存,可能会出现系统错误等问题。
图11
Mic录音的adc采样率MIC2CBUF_SR宏大小要与avi音频编码的info.minfo.aud_sr = 8000采样率保持一致。
图12
2)录音文件路径:cpu\br28\audio_enc\audio_mic_cbuf.c
音频数据采用cbuf 的管理方式,每次编码8K数据(对应avi编码的buf 大小)。
图13
7. 录像播放线程 1)文件路径:apps\watch\task_manager\app_common.c apps\watch\video\avi_replay_demo.c
apps\watch\ui\lcd\STYLE_WATCH_NEW\ui_action_watch.c
图14
2)文件路径:apps\watch\task_manager\app_common.c
apps\watch\video\avi_replay_demo.c
函数avi_replay_start()主要创建录音回放线程audio_replay_task()和录像回放线程video_replay_task();
图15
3)文件路径:apps\watch\video\avi_replay_demo.c
播放音视频,需要将音频数据传到pcm解码组件进行解码操作后,才能在扩音器上播放。在手表等设备上播放带声传录像,可调用avi_replay_start()函数,在函数内部进行了相关配置如下,使能音频功放使能引脚PG7、初始化pcm组件,以及开启音频数据总包统计__this->auds_total。如图16和图17所示。
开启功放使能宏定义和audio回放demo:
图16
图17
修改音频回放函数audio_replay_task(),添加链表cbuf_write()保存音频数据包信息,如图18所示。
图18
4)Pcm解码组件文件路径:cpu\br28\audio_enc\audio_mic_cbuf.c
编写pcm编码组件demo,录取的mic音频数据,需要经过pcm解码,才能在音频设备播放,具体函数如图19所示。
图19
7. 录像结束
回播结束:删除回播线程;
录像结束:删除录音线程、录像线程和avi视频编码线程:
图20
8. 修改的文件全观
查看所要修改的文件
图21
图22
9. 异常处理
CodeBlock编译出错,缺失creat_aud_task... 解决方法:添加audio_mic_cbuf.c和audio_mic_cbuf.h


30A2型号摄像头不能正常使用: 701n_v221_Camare_avi_带录音录像_优化帧率_20241111适配的摄像头是BY20A6,SPI时钟频率为96MHz,当需要适配BY30A2型号的摄像头时,需要更改SPI的时钟频率改为48MH,及以下
出现[2-HSB] emu err msg : axi read reserved memory at dev id: 0x00000080 DBG_AXI_M1的死机:imb硬件访问到非法地址了,排查下跟哪个imb任务有关