对讲机偶现无声问题分析

简介: 笔记

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


一、分析现象


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

做出如下猜测:

  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大小解决了此问题,对方不愿透露详细信息


目录
相关文章
|
JSON 安全 Linux
安全工具-curl学习
安全工具-curl学习
228 0
|
物联网
低功耗蓝牙(BLE)设备常用的4种角色
对于主从设备的其它说法,大家需要了解一下。对于Central和Peripheral有多种说法,上面我们说的是主从,还有客户端/服务端,中心设备/外围设备,我们这里简单介绍一下,客户端(Client)对应上面的Central,接收数据;服务端(Server)对应上面的额Peripheral,提供数据,这个需要和网站的服务器/客户端区别一下;中心设备(Central)和外围设备(Peripheral),其实上面叫中心设备和外围设备。上面主设备(Master)和从设备(Slave)应该对应主/从。这个根据个人习惯,主/从用的比较多,如果在蓝牙中提到这些知道就行了。
1430 0
|
API 索引 数据处理
【鸿蒙软件开发】ArkTS基础组件之Select(下拉菜单)、Slider(滑动条)
【鸿蒙软件开发】ArkTS基础组件之Select(下拉菜单)、Slider(滑动条)
3125 0
【鸿蒙软件开发】ArkTS基础组件之Select(下拉菜单)、Slider(滑动条)
|
10月前
|
人工智能 自然语言处理 API
百聆:集成Deepseek API及语音技术的开源AI语音对话助手,实时交互延迟低至800ms
百聆是一款开源的AI语音对话助手,结合ASR、VAD、LLM和TTS技术,提供低延迟、高质量的语音对话体验,适用于边缘设备和低资源环境。
3124 5
百聆:集成Deepseek API及语音技术的开源AI语音对话助手,实时交互延迟低至800ms
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
GLM-Edge:智谱开源的端侧大语言和多模态系列模型
GLM-Edge是智谱开源的一系列端侧部署优化的大语言对话模型和多模态理解模型,旨在实现模型性能、实机推理效果和落地便利性之间的最佳平衡。该系列模型支持在手机、车机和PC等端侧设备上高效运行,适用于智能助手、聊天机器人、图像标注等多种应用场景。
379 7
GLM-Edge:智谱开源的端侧大语言和多模态系列模型
|
数据采集 传感器 数据管理
读数据质量管理:数据可靠性与数据质量问题解决之道04收集与清洗
【11月更文挑战第8天】本文介绍了数据收集的重要性和挑战,以及数据收集的方法和工具。数据收集是数据质量管理的基础,能够确保数据的完整性和准确性。然而,数据来源的多样性和数据丢失等问题也带来了挑战。文中还详细描述了内部系统、外部数据和传感器数据的收集方法,以及数据清洗的目标和流程,包括数据审查、问题数据处理和数据验证等步骤。
284 2
|
SQL 关系型数据库 数据库
Windows server 2016——SQL server 简介与安装
Windows server 2016——SQL server 简介与安装
557 0
|
调度 Python
Python 中如何实现多线程?
【8月更文挑战第29天】
543 6
|
算法 安全 搜索推荐
AES(Advanced Encryption Standard)是一种广泛使用的对称密钥加密算法,由美国国家标准技术研究所(NIST)制定。
AES(Advanced Encryption Standard)是一种广泛使用的对称密钥加密算法,由美国国家标准技术研究所(NIST)制定。
|
消息中间件 存储 安全
对象存储OSS产品常见问题之使用中上传图片慢如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
3322 0