对讲机偶现无声问题分析

简介: 笔记

在新开发的对讲机项目中,遇到了对讲无声问题,该问题直接影响使用。


一、分析现象


测试时,会出现一方说话,另一方没有听到声音,但是对方可以听到信令的声音,说明网络链路是通的。

做出如下猜测:

  1. 音频数据没有发出去,定位对讲端问题
  2. 音频数据发出去了,接收端没有收到,定位服务器问题
  3. 音频数据发出去了,但是没有播放出来,定位接收端播放问题


二、初步定位问题位置


使用展讯的Logel_for_TD工具,抓取cap包

步骤:打开Logel_for_TD工具,点击Option->Device Configuration

3.png


确保CAP LOG勾选上,之后点击开始,复现问题后,保存Log文件。使用Wireshark工具打开cap包,可以看到数据包的详细信息。

经过对比发现,无声log的CAP包如下:

4.png

而有声的CAP如却是这样的:

5.png


容易得出结论,有声时会发送数据包大小为116字节的UDP包进行传送,无声时则没有,故定位问题为按下PTT键时,没有发送音频数据


三、进一步分析,为什么没有发送UDP数据包


没有发送UDP数据包可以有以下几种原因:

  1. 没有获取到音频数据,可能是没有启动录音或者录音器异常导致采集音频失败
  2. 获取到了音频数据,但是没有执行数据发送流程
  3. 有数据,且执行了发送,由于网络原因没有发送成功
    因为Logel_for_TD抓取的cap包为送到网卡的数据,所以基本可以排除网络问题,并且通过Logel_for_TD监测复现问题时的网络环境,-93dbm左右,良好。
    故只剩下1,2两种可能,没有音频数据或者没有执行发送流程。


四、确认音频数据是否获取成功


通过BND平台的debug版本进行测试,从log中看出在问题复现时,获取到的音频数据为0,故确认是录音的问题。


五、分析录音模块


5.1 测试用例测试录音器是否存在问题

对讲APK使用的原生的方案。调用opensl_es库采集和播放音频。参考frameworks/wilhelm/tests/examples/slesTestRecBuffQueue.cpp

该文件中详细叙述了如何使用:

/* Audio Record Test
First run the program from shell:
  # slesTest_recBuffQueue /sdcard/myrec.raw 4
These use adb on host to retrive the file:
  % adb pull /sdcard/myrec.raw myrec.raw
How to examine the output with Audacity:
 Project / Import raw data
 Select myrec.raw file, then click Open button
 Choose these options:
  Signed 16-bit PCM
  Little-endian
  1 Channel (Mono)
  Sample rate 22050 Hz
 Click Import button
*/
在编译该模块后,把生成的可执行文件push到system/bin目录下再按上述测试即可

通过数十次的测试,录音均正常。

5.2 dump音频数据

在复现问题时执行dump命令

adb root 
adb remount
adb shell 
setprop media.dump.path /data/local/media/
setprop media.dump.switch 0x3ff
/data/local/media/目录下生成dump_record_after_vbc.pcm和dump_record_after_express为录音时的数据

可以使用AudacityPortable(提取码:qo80)工具播放裸数据,对比发现,无声时的pcm数据为0,进一步确认了是录音问题

5.3 是否为硬件问题

通过向展讯提供PCB原理图,分析结论硬件电路没有问题

5.4 是否为音频参数问题

使用AudioTester

(提取码:y7rv )获取Music参数,交与展讯分析

正在分析中。。。

5.5 分析是否为录音流程问题

5.5.1 BSP分析

通过抓取对比log发现,有声和无声的log有所不同(PS:这种问题一定要抓对比log)

分析如下:

对比正常log,采集声音异常时,录音流程没有发起,因此无法录到声音。
按键提示音结束后,上层下发sprd_voip_start=false,准备结束voip流程,紧接着录音应用要下发in_read命令,从而进入do_input_standby,结束voip流程的同时开启录音流程。但异常时一直没有下发in_read,导致audio_hw中录音流程没有发起。
异常log中没有这个log:in_read sco stop  and do standby
正常流程如下:
07-22 15:29:11.176   146   330 D AudioPolicyManagerSPRD: stopOutput() outputDesc->mRefCount[AudioSystem::VOICE_CALL] 1
07-22 15:29:11.176   146   329 D AudioPolicyService: AudioCommandThread() processing set parameters string sprd_voip_start=false, io 0
07-22 15:29:11.176   146   329 V AudioFlinger: setParameters(): io 0, keyvalue sprd_voip_start=false, calling pid 146
07-22 15:29:11.176   146   329 W audio_hw_primary: adev_set_parameters, kvpairs : sprd_voip_start=false
07-22 15:29:11.176   146   329 I audio_hw_primary: adev_set_parameters, voip turn off by output
07-22 15:29:11.176   146   364 D audio_hw_primary: sco:out_write stop and do standby
07-22 15:29:11.176   146   364 V audio_hw_primary: do_output_standby in
07-22 15:29:11.176   146   364 W audio_hw_primary: do_output_standby.mode:0 
07-22 15:29:11.176   146   364 V audio_hw_primary: do_output_standby in out
07-22 15:29:11.176   146   364 E audio_hw_primary: out_write: drop data and sleep,out->is_voip is 0, adev->voip_state is 1,adev->voip_start is 0
07-22 15:29:11.196   146  1504 D audio_hw_primary: : in_read sco stop  and do standby
07-22 15:29:11.196   146  1504 V audio_hw_primary: do_input_standby, standby=0, in_devices=0x80000004
07-22 15:29:11.196   146  1504 I audio_hw_primary: do_input_standby, fmUlDlHandle=0x00000000, fm_uldl=0x00000000, pcm = 0xb887b328
07-22 15:29:11.226   146  1504 W audio_hw_primary: start_input_stream in mode:0 devices:80000004 call_start:0, is_voip:0, is_bt_sco:0
07-22 15:29:11.226   146  1504 E audio_hw_primary: select_devices_signal starting... adev->out_devices 0x1 adev->in_devices 0x80000004
07-22 15:29:11.226   146   359 V audio_hw_primary: do_select_devices E
07-22 15:29:11.226   146  1504 I audio_hw_primary: select_devices_signal finished.
07-22 15:29:11.226   146  1504 E audio_hw_primary: start_input_stream pcm_open_0
07-22 15:29:11.236   146  1504 W audio_hw_primary: rec_mode(3), sample_rate(8000)
07-22 15:29:11.236   146  1504 W audio_hw_primary: extendArraySize=118, eq_size=52, dp_size=38
07-22 15:29:11.236   146  1504 I audio_hw_primary: record process module created is successful.
**请上层同事协助客户排查,是否客户自身应用流程有问题。**

5.5.2 流程分析

//这里在1秒钟之内start和stop了output这次output对应的stream 是0 
STREAM_VOICE_CALL = 0;
07-22 15:34:30.126   146   146 D AudioPolicyManagerSPRD: startOutput() output 2, stream 0, session 13
07-22 15:34:30.766   146   308 D AudioPolicyManagerSPRD: stopOutput() output 2, stream 0, session 13
07-22 15:34:30.766   146   307 W audio_hw_primary: adev_set_parameters, kvpairs : sprd_voip_start=false
这次声音导致voip关闭了,正常的对讲最好是将voip打开
打开voip的方法就是在audiorecord和和播录音的那个player的流类型要设置成STREAM_VOICE_CALL 而且这个player要跟record一起stop。

根据展讯建议,播放Tone音不使用STREAM_VOICE_CALL,我测试去掉了TONE音,但是问题依然存在。

5.5.3 加入log,修改log_level等级分析

最终BND通过修改初始化的buffer大小解决了此问题,对方不愿透露详细信息


目录
相关文章
|
16天前
|
SQL 存储 监控
实用技巧:排查数据异常/数据波动问题,该如何下手?
在我做开发的这些年,让我很头痛的一类问题,不是线上故障,而是数据异常,不知道有没有程序员跟我感同身受。大多数的服务故障都有较为直观的异常日志,再结合产品表象,相对排查起来还有迹可循,但数据异常的原因就太多了,很多时候连报错日志都没有,排查起来简直无从下手。
实用技巧:排查数据异常/数据波动问题,该如何下手?
|
7月前
|
Dubbo Java 应用服务中间件
浅谈踩坑记之一个Java线程池参数,差点引起线上事故(下)
浅谈踩坑记之一个Java线程池参数,差点引起线上事故
180 0
|
算法 数据挖掘 C++
怎样解决坐席进线慢的问题?
怎样解决坐席进线慢的问题?
|
Arthas Web App开发 运维
线上 RTT 过长,我用这一招解决了!
线上 RTT 过长,我用这一招解决了!
|
Web App开发 运维 安全
印象最深的一个bug——排查修复问题事件BEX引发的谷歌浏览器闪退崩溃异常
本文记录了目前修复的千千万万个项目的BUG中印象最深的一次BUG,由于问题事件BEX引发的谷歌浏览器闪退崩溃的异常问题.这个BUG因为其不可复现性导致特别难以发现和解决,正是由于这一次的BUG解决过程,让我了解到了一位攻城狮在项目开发维护过程中实际经验的重要性,多思考,多实践,多多积累经验,才是一位攻城狮的成长之路.
30547 2
印象最深的一个bug——排查修复问题事件BEX引发的谷歌浏览器闪退崩溃异常
刷屏电流过大问题分析
一、问题描述 我们的某款产品在正常工作模式下,开启刷屏功能,刷屏电流最大值为75.33mA,远大于屏正常工作时的功耗要求。 二、测试分析 分析原理图设计,发现刷屏功能开启的时候,GDR开关信号如下,在开关信号的作用下,升压电路开始工作,升压电路原理图如下所示。 测试发现,U3的drain极峰...
刷屏电流过大问题分析
线上出bug了?别怕,这么定位!
工作中,生产环境代码是编译后代码,搜集到报错信息的行和列无法在源码中对应,很多时候只能靠“经验”去猜,本文针对这种情况,开发了一个npm命令行小工具,帮助快速定位报错的源码位置,提升效率。 由于现在构建工具盛行,前端部署的代码都是经过编译,压缩后的,于是乎,SoueceMap就扮演了一个十分重要的角色,用来作为源代码和编译代码之间的映射,方便定位问题。
1313 0
|
前端开发 程序员 开发工具
Bug 看你往哪里逃?我会让你无所遁形
编程中的 Bug ,Error 等各种报错是不可避免的,如果有一个好的 logcat 工具绝对可以帮助大家快速的定位到错误,并高效的找到解决办法。
4372 0
|
前端开发 测试技术 应用服务中间件
记一次诡异的故障排查经历
每一次故障排查都是一笔财富,各种狗血经过不表,解决问题之后的那种满足是不可替代的。 背景 发布系统架构图简化如下: 管理员通过Jenkins调用“发布程序(代号varian,以下简称varian)”,发布程序会进行一系列的初始化操作,完成后生成Docker镜像上传到Docker仓库,容器集群更新镜像,用户通过负载均衡访问我们的容器集群。
2137 0
|
SQL JavaScript 关系型数据库
避坑:一次离奇性能故障的排查与反思
某客户反馈生产库ETL及报表类SQL全部运行不出来,监控告警近期大量SQL语句执行计划发生变更。客户DBA通过对比新旧执行计划发现执行计划变更的SQL大部分都变成了走索引加上NL的方式,而且不止一个SQL出现这种问题,该生产库上几乎所有的AP类型SQL都出现了该问题。
3370 0