干货,记一次解决录音杂音问题
最近在项目上遇到一个问题,也不能说是最近项目上的问题了,是之前一直存在的问题,但是对项目没什么影响,所以我就不怎么理会,直到最近,同事说这个杂音已经影响到了项目的开发,所以今天花了一天时间整理了下问题,不断的修改测试中,终于搞完了。
说个题外话,年前招了一个帅哥有了新的发展,离开了我们,我内心非常不舍,说不舍有点牵强,他特别喜欢踢足球⚽,平时交集不是特别多。但是他在技术上真的也是我学习的榜样,我喜欢看他对事情认真的样子,总结一个文档和技术也非常有条理,在面对新的问题和技术难点的时候,他总是能找到解决的办法。在这点上,我觉得自己确实从他身上吸收到了好的东西。
然后,他现在去做的也是音频相关的,希望他在新的岗位,新的企业能发展得更好。
之前音频相关的文章
音频系统,Alsa 里面的buff 是怎么计算的?
为什么需要超过48k的采样音频?
我在MTK平台下调试音频ALSA
音频几个重要的参数
openwrt 音频开发
(干货)Ai音箱和Linux音频驱动小谈
Android 音频数据流分析之程序员干架产品经理
Alsa里面恶心的DAPM
1、问题
正常使用tinycap录音,在音频的开始位置会有一段杂波,这段杂波让人看起来会非常不爽。
2、排查过程
先是排查了硬件,我担心是硬件的GPIO口模式不正确,这个也是同事提醒的,后面检查了下,发现这个GPIO口是特殊口,这个GPIO口就是干这个事情的,所以说没有模式正确不正确,它就只有这个功能。
然后检查了上电,因为DMIC有一个供电,之前的文章写过,我担心供电时间过慢导致,后面修改了代码让DMIC持续供电,不过测试几次录音的时候问题还是存在,所以排除了这个问题。
还有就是DMIC的特性了,查看了DMIC的上电特性,DMIC有一个上电的时间,也就是这个时间影响了稳定。
如下图
后面跟思必驰的技术沟通,跟他讨论了这个问题,他也说到他们在其他项目中也遇到过,解决的办法就是写0。
3、解决
上面已经说了解决办法了,就是在开始录音的时候写0,但是在哪里写成了问题,如果应用直接写0就好了,但是我不能直接修改应用的代码。所以只能在内核里面做手脚。
在HAL搞这个事情可能会标准化一些。
先是确定了读音频的函数,流程是
snd_pcm_capture_ioctl1()
->snd_pcm_lib_read()
-->snd_pcm_lib_read_transfer()
修改的patch如下
diff --git a/kernel-4.4/include/sound/pcm.h b/kernel-4.4/include/sound/pcm.h
old mode 100644
new mode 100755
index b0be092799..ecaca74273
--- a/kernel-4.4/include/sound/pcm.h
+++ b/kernel-4.4/include/sound/pcm.h
@@ -460,6 +460,7 @@ struct snd_pcm_substream {/* -- assigned files -- */void *file;int ref_count;
+ int once_f;/*weiqifa modify*/atomic_t mmap_count;unsigned int f_flags;void (*pcm_release)(struct snd_pcm_substream *);
diff --git a/kernel-4.4/sound/core/pcm_lib.c b/kernel-4.4/sound/core/pcm_lib.c
old mode 100644
new mode 100755
index 17e69848d3..8a057f1445
--- a/kernel-4.4/sound/core/pcm_lib.c
+++ b/kernel-4.4/sound/core/pcm_lib.c
@@ -2220,6 +2220,11 @@ static int snd_pcm_lib_read_transfer(struct snd_pcm_substream *substream,return err;} else {char *hwbuf = runtime->dma_area + frames_to_bytes(runtime, hwoff);
+ if(substream->once_f < 1)
+ {
+ memset(hwbuf,0,frames_to_bytes(runtime, frames));
+ substream->once_f++;
+ }if (copy_to_user(buf, hwbuf, frames_to_bytes(runtime, frames)))return -EFAULT;}
diff --git a/kernel-4.4/sound/core/pcm_native.c b/kernel-4.4/sound/core/pcm_native.c
old mode 100644
new mode 100755
index 3de88974ee..0ead670a38
--- a/kernel-4.4/sound/core/pcm_native.c
+++ b/kernel-4.4/sound/core/pcm_native.c
@@ -2229,6 +2229,7 @@ static void pcm_release_private(struct snd_pcm_substream *substream)void snd_pcm_release_substream(struct snd_pcm_substream *substream){
+ substream->once_f = 0;substream->ref_count--;if (substream->ref_count > 0)return;
@@ -2277,6 +2278,7 @@ int snd_pcm_open_substream(struct snd_pcm *pcm, int stream,goto error;substream->hw_opened = 1;
+ substream->once_f = 0;err = snd_pcm_hw_constraints_complete(substream);if (err < 0) {
里面写0的帧大小需要调试一下,这是我最后测试出来的结果。
修改后录音得到的音频频谱图如下
从之前的文章知道计算公式,从这里反推断mute写0的时间
跟上面截图看到的时间差不多。
完美~ 下班
推荐阅读:
专辑|Linux文章汇总
专辑|程序人生
专辑|C语言
我的知识小密圈
干货,记一次解决录音杂音问题相关推荐
- 记一次 解决 vue 兼容ie11 的问题
记一次 解决 vue 兼容ie11 的问题 参考文章: (1)记一次 解决 vue 兼容ie11 的问题 (2)https://www.cnblogs.com/qq735675958/p/117757 ...
- android 嘶嘶 录音 电流音_线程安全引起的录音杂音电流音问题
前段时间写了一个录音模块,需求是:『录音的时候实时语音转文字,实时计算音量大小,实时进行 MP3 转码保存为文件』 首先进行需求分析,确定技术方案: 使用 AudioRecord 进行录音,实时获取原 ...
- path manipulation怎么解决_干货!终于!解决macOS下pyenv安装python3.8.2缺少tkinter模块的问题!...
前言: 笔者不过是一个刚立下flag要学习Python的小白, (这也是笔者的第一篇网文.知乎文,如果没用,求轻虐), 为此还冲动傻傻地配了一台2019款13寸的MacBook Pro. 电脑配置(作 ...
- 杂学第十篇:这几天,在毕业论文调整格式中踩过的坑,满满的干货助你快速解决格式调整的烦恼
以下内容,来自我的公众号. 你是来看论文格式,还是来看我奄奄一息的爱情?? 这几天,为了我的论文,殚精竭虑.历经生死.悲欢离合.甚至错了一个重要的节日,真是赔了夫人还好没折兵.看来我要多哄哄我家那美若 ...
- java专业编码_java编码中的坑(记一次解决编码BUG的经历) - 贪吃蛇学院-专业IT技术平台...
1.2016年11月15日(周二),我被经理外派出差渝北金开大道,任务:解决那边的一个数据库乱码异常 2.那边的负责人描述:数据库原是utf8编码,他为了兼容emoji表情,改为utf8mb4,之后出 ...
- 记一次解决 quill(vue-quill-editor) 编辑器中莫名多出一行“pbr/p”的过程...
问题描述: 在使用 vue-quill-editor 富文本编辑器过程中,加载已有的富文本数据到编辑器,经常会出现编辑器中莫名其妙多出一段换行内容 <p><br></p& ...
- oracle查看数据库是否恢复成功_记一次解决docker下oracle数据库故障事例
一.问题背景: 某个项目的线上环境oracle数据库挂了,同事急匆匆来找我救火.我简单咨询了一些基本情况:线上环境,docker部署,已正常运行半年.由于宿主机的根目录硬盘空间不够,运维的同事想把or ...
- .net千万级数据导出_记一次解决docker下oracle数据库故障事例
一.问题背景: 某个项目的线上环境oracle数据库挂了,同事急匆匆来找我救火.我简单咨询了一些基本情况:线上环境,docker部署,已正常运行半年.由于宿主机的根目录硬盘空间不够,运维的同事想把or ...
- android 记一次解决键盘遮挡问题
文章链接:https://mp.weixin.qq.com/s/1gkMtLu0BTXOUOj6isDjUw 日常android开发过程中,会遇到编辑框输入内容弹出软键盘,往往会出现键盘遮挡内容,或者 ...
最新文章
- 广州企业“掘金”物联网蓝海
- linux系统运维面试题
- 【Linux】17.Ubuntu16.04 系统添加网关和DNS的两种方式
- 计算机组成原理--主存储器
- 搜索算法(二)--DFS/BFS求解炸弹人问题(JAVA )
- Python爬虫连载16-OCR工具Tesseract、Scrapt初步
- tif 高程_Global Mapper中80坐标系高程DEM与kml文件叠加实例
- JS中的立即执行函数
- 心有所鼠,鼠年快乐~
- 触感啥意思_苹果手机系统触感反馈是什么意思
- 二维离散沃尔什变换及matlab实现
- CodeForces - 1526C2
- AWS GWLB集成FortiGate防火墙
- iOS逆向-微信自动添加好友
- 什么是显示器支架,显示器支架有啥优势
- 深度关注 | 元宇宙如何改写人类社会生活
- Imagine-快速的图片压缩工具
- 从区块链到DAG(五)--DAG项目介绍IOTA和Obyte
- English-全国英语翻译证书
- python gdal 重采样_Python遥感影像重采样