直播疑难杂症排查(8)— 播放杂音、噪音、回声问题

简介:

1.  问题现象


常见的音频问题现象描述如下:


- 电流音,爆音,滋滋声或者嘟嘟声

- 声音断断续续,听不清楚

- 回声,能听到自己说话的声音


2. 问题排查


2.1 参数配置问题


上面也有提到,音频是一个特别敏感的东西,涉及到许多参数配置,一旦配置不太匹配,就会导致声音听起来非常诡异(比如:采样率是 32000Hz 的音频,给播放器配置为 8000Hz 或者 44100Hz,就明显会出现音频慢放或者快放的效果)。


常见的音频参数和基本原理,可以参考我的这篇文章,这里就不再赘述了:《Android音频开发(1):基础知识》


我们只需要注意的是,无论是采集和播放,都要给系统的 API 以及第三方的库配置正确的参数,如:采样率、位宽、声道数等等。


2.2 代码层面的原因


常见的代码层面的问题有如下几种:


- 音频 buffer 大小不匹配,一段 1024 bytes 的音频,放到了 2048 bytes 的数组,导致尾部有随机数

- 音频 resample 重采样的算法问题,导致采样出来的数据出了问题

- Android 的 ByteBuffer 取出数组,是不能直接用 .array() 方法的,而需要用 .get() 方法

- iOS 系统,其他 app 通过系统 API 更改了 AudioSession 采样率的配置


2.3 网络波动


视频是一帧一帧连续的图像构成的,在播放过程中,如果无法按时渲染,则会出现卡顿的效果;如果丢失几帧画面,则会出现快进效果。


而音频是流式的,虽然也被切分为了一个个音频帧,但如果无法按时播放或者连续丢失较多的音频帧,则会明显听到断断续续的声音出现。特别是在弱网、丢包率高等不稳定网络环境下,很容易出现这种情况。


2.4 回声消除


回声一般出现在同时有音频的采集和播放的场景,比如:连麦互动、混音返听等等,采集到的音频通过扬声器又播放出来了,同时又被采集了进去,从而产生了回声或者啸叫声。


这样的场景下,一般需要通过系统的回声消除 API,或者第三方回声消除库(如:speexdsp,webrtc 等)进行处理。


注意:很多 Android 机型硬件自带的回声消除效果并不是很好。


2.5 混音越界


音频的 PCM 数据,通常用 short 数组来存放,当我们做一些多路音频的混音功能的时候,如果不注意处理 short 类型的大小越界,则往往带来爆音的问题。下面是一段参考 webrtc 的混音代码,专门针对混音越界做了简单处理。



本文转自 Jhuster 51CTO博客,原文链接:http://blog.51cto.com/ticktick/1933255,如需转载请自行联系原作者

相关文章
|
Java 数据安全/隐私保护
康复中心管理系统 毕业设计 JAVA+Vue+SpringBoot+MySQL
康复中心管理系统 毕业设计 JAVA+Vue+SpringBoot+MySQL
423 1
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
智能自动化全方位解读:定义、技术、市场、应用,一文解答所有
智能自动化融合AI与RPA技术,重塑企业效率。它可处理非结构化数据、跨系统协同、自主决策,广泛应用于财务、人力、制造等领域,助力降本增效、合规创新。2025年全球市场规模将达4200亿美元,中国超9500亿元,成为最大单一市场。实在Agent等标杆产品实现“一句话完成工作”,5000+企业已落地应用,部署快、回报高、无需改造系统,正推动人机协同的数字革命。
781 154
|
3月前
|
人工智能 自然语言处理 监控
阿里云百炼千问Qwen3.7-Max全面解析:核心能力、技术特性与订阅使用全指南
在智能应用与AI智能体飞速发展的2026年,大模型的推理能力、长文本处理、多模态理解以及工具调用能力,已经成为企业开发、科研创作、自动化办公的核心刚需。阿里云百炼正式推出**Qwen3.7-Max**旗舰大模型,作为通义千问系列综合实力最强的版本,直接对标国际主流高端闭源大模型,专为复杂逻辑推理、长周期自主任务、多模态分析、企业级业务场景打造。
2053 3
|
9月前
|
存储 缓存 算法
哈希表核心原理 哈希表等于Map吗?
哈希表不等于Map。Map是键值映射的接口,哈希表(如HashMap)是其一种实现。增删查改O(1)的前提是哈希函数高效且冲突处理得当。本文详解哈希表原理、哈希冲突解决、负载因子与key不可变性,助你深入理解底层机制。
|
测试技术 Python
分支覆盖 (Branch Coverage)
分支覆盖 (Branch Coverage) 是一种软件测试覆盖率评估方法,能够测量代码中每个分支的执行情况,即代码中每个条件语句 (if-else 语句) 的所有可能分支是否都被执行过。
5108 1
|
Ubuntu 安全 Linux
Canonical:将坚持 Ubuntu LTS 版本 10 年支持周期
除了 Canonical 外,类似于 Red Hat Enterprise Linux 和其他主要企业级 Linux 发行版,预计也不会因为上游内核 LTS 政策的转变而缩减其支持窗口。
317 0
|
人工智能 大数据 开发者
阿里云技术解决方案开放免费试用,热门AI场景免费体验!
阿里云推出免费试用计划,2025年7月起,新老用户均可领取100点试用点,用于部署体验技术解决方案。完成部署还可再获最高100点,相当于一年200元云资源免费用。支持AI、大数据、安全等多个领域,涵盖DeepSeek部署、模型微调等热门场景。点击链接即可领取,快速上手云上方案。
|
缓存 监控 安全
基于Django的电商项目的设计与实现
基于Django的电商项目的设计与实现
1495 0
|
算法 API C#
Winform控件优化之圆角按钮【各种实现中的推荐做法】(下)
最终优化实现ButtonPro按钮(继承自Button),既提供Button原生功能,又提供扩展功能,除了圆角以外,还实现了圆形、圆角矩形的脚尖效果、边框大小和颜色、背景渐变颜色...
4148 0
Winform控件优化之圆角按钮【各种实现中的推荐做法】(下)
|
Ubuntu JavaScript 开发工具
Ubuntu上编译多个版本的frida
【7月更文挑战第16天】在Ubuntu上编译多个版本的Frida(如15.1.28和16.1.4),首先确保系统为Ubuntu 20(WSL)或其他版本,并安装`build-essential`, `git`, `lib32stdc++-9-dev`, `libc6-dev-i386`等依赖。还需安装Node.js(例如20.15.1版)。通过`git clone`获取Frida源码,并根据所需版本进入对应分支。设置环境变量以指向正确的NDK和Node.js路径,可通过脚本如`env15.sh`来避免污染全局环境。
872 2