使用 OpenSL 为所有 Android 设备提供 8KHz 采样率的语音通信

2023-12-02

我需要创建一个 VOIP 应用程序,并且我正在使用 OpenSL ES。我需要为所有 Android 设备以 8KHz 采样率捕获和播放 pcm 音频数据。但是,当我以 8KHz 采样率捕获音频并同时播放(语音通信)时,它会产生噪音,并且对于某些设备(如三星 Galaxy S3、S4 等),音频会失真。我知道,有一个特定的首选采样率对于每个设备,我想知道是否有任何解决方法或任何方法可以仅使用 8KHz 采样率而不会出现任何失真?

我尝试增加缓冲区大小和许多其他事情,但未能找到最佳且通用的解决方案。我的编码器和解码器需要以 8KHz 采样的音频数据。作为我的第二个想法,我在将音频数据传递到编码器或解码器之前对其进行了重新采样,但这不是我正在寻找的解决方案。

我发现 CSipSimple 使用了 OpenSL,我也浏览了他们的一些代码。但是,我仍然找不到解决方案,可能是我不明白该集中精力在哪里。 我被困在这里了!


这是我解决问题的方法:

我正在使用 OpenSL ES 开发 Android 音频流,this教程对我帮助很大。我按照这里的说明进行操作并让事情正常工作。然后我发现使用这种方法的音频流对于某些设备(主要是三星设备)来说效果不佳。我尝试了很多事情,例如增加缓冲区大小、禁用环境混响等。我发现this答案对于提高流媒体性能非常有用。

最后,我发现音频失真,因为我必须使用锁来同步缓冲区开关。建议使用无锁结构以获得更好的音频性能。然后我采用了 Victor Lazzarini 的另一种方法,即无锁音频 IO。这篇文章的Android 上使用 OpenSL ES 的无锁音频 IO对实现无锁结构以及更好的音频性能有很大帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 OpenSL 为所有 Android 设备提供 8KHz 采样率的语音通信 的相关文章

随机推荐

  • 如何使用 ASP.NET MVC 维护用户会话

    大家好 我想知道有什么方法可以在不使用 ASP NET MVC 中的成员身份的情况下维护登录 注销 用户会话等内容 Faraaz 您所指的领域涉及三种提供商模型 The 会员提供者涉及身份验证 验证用户并存储与用户相关的数据 例如上次登录日
  • 如何在Python中搜索和替换?

    如何在 ABC D1234 等字符串中添加字符 使其变为 ABC D 1234 另外 如何在前 2 个数字后添加字符 即从 ABC D1234 到 ABC D12 34 非常感谢 这取决于您用来决定在何处插入额外字符的规则 如果你想要它在第
  • 如何强制 C# .net 应用程序在 Windows 中仅运行一个实例? [复制]

    这个问题在这里已经有答案了 可能的重复 创建单实例应用程序的正确方法是什么 如何强制 C net 应用程序在 Windows 中仅运行一个实例 我更喜欢类似于以下的互斥解决方案 这样 如果应用程序已加载 它会重新关注该应用程序 using
  • 使用 vertx Web 客户端版本 4.0.0 时出现 java.lang.IllegalAccessError

    将 vertx 4 0 0 与 jdk 14 结合使用 尝试使用 vertx Web 客户端发出 REST 请求时 出现以下异常 15 56 48 294 vert x eventloop thread 0 ERROR io vertx c
  • Android如何在其他类中runOnUiThread?

    在我的应用程序中 在 MainActivity 中 有一个工作正常的线程 但是当我调用另一个类从服务器获取数据时 我无法在线程上运行 请参阅下面的代码示例 class MainActivity extends Activity implem
  • 从类库读取 web.config

    我有两个项目 1 没有接口的类库 只有一个api 2 网络应用程序 从网络应用程序中我将调用类库 api 所以我在Web应用程序中拥有所有的web config设置 但是当我调试时它总是返回空值 这里是代码片段 public static
  • 如何向我的 vega-lite 图表添加辅助 Y 轴?

    这个问题展示了一种将多个时间序列添加到 vega lite 图表的方法 如何使用 Vega Lite 在轴上绘制多个变量 有没有办法将第二个系列放在辅助 Y 轴上 我说的是在右侧放置另一个 Y 轴 以便时间序列可以具有不同的尺度 但仍然可以
  • VSCode 安装失败 - 无法提取安装程序

    VSCodeSetup exe Installation has failed Failed to extract installer 我无法安装或打开安装日志 尝试在 Windows 8 1 Enterprise 上安装 我刚刚下载了 V
  • 如何获取多个页面的数据?

    我的项目基于 React redux redux saga es6 我尝试从此 API 获取数据 如您所见 此特定 API 调用显示的数据限制为每页 100 条数据 分布在 40 个页面上 根据这个答案 它说您可以将限制扩展到每页最多 30
  • Perl 的 Capture::Tiny::capture() 是否避免了使用 system() 时所需的磁盘 io?

    当从 Perl 脚本调用外部程序时 Capture Tiny 是否避免了使用 system 时所需的磁盘 io 使用两者时我得到的性能基本相同 一位同事正在使用我的代码 并告诉我它正在攻击他的磁盘 我 也许 在本地计算机上运行并写入本地磁盘
  • C#:继承布尔值?

    如何 我可以从布尔值继承吗 或者使我的类与带有 运算符的布尔值相当 class MyClass Boolean public MyClass this true class Program public Program MyClass my
  • 如何处理Azure Python Function异常处理?

    我是 Python 异常处理新手 我该如何正确try下列 except if get entity失败 但通过如果Status 200 这是我所在的位置 但它不正确 希望您能举例说明 from azure cosmosdb table ta
  • 如何使用 FileReader javascript 读取 XML 文件?

    我需要从 ODF 文件获取 XML 我尝试使用 FileReader readAsText 和 readAsBinaryString 但它不起作用 文件读取器读取文本返回 odf 文件的一些特殊字符 with 读取为二进制字符串 var r
  • JavaScript 中的函数组合

    在下划线 低破折号等库中实现函数组合有什么好处 类似于 var compose function var funcs arguments return function var args arguments for var i funcs
  • 获取404页面的原始url

    所以我发现了这两个问题 在 IIS7 404 重定向页面中访问原始 URL 获取导致 404 的请求页面的 URL 但它们都是不同的语言 有没有办法获取导致 404 消息之类的地址在自定义消息中使用 例如 如果我要求example com
  • 在C#中将SID转换为用户名

    在 net中 我可以创建一个NTAccount使用域和用户名 并获取其 SID 但我无法使用翻译功能将 SID 转换回 NTAccount new SecurityIdentifier stringSid Translate typeof
  • 如何向 tcp 服务器发出 http 请求?

    我想要建立一个侦听端口 443 的 TCP 服务器 以便它可以接收 HTTP 请求并回发 现在我正在使用 Apache 和 PHP 以正常方式执行此操作 但是是否可以在没有 Web 服务器的情况下执行此操作 例如 我用 C NET 构建了一
  • 使用 Linq to Entities 将 UTC 转换为本地时间

    我需要在 LINQ to Entities 查询中将字段从 UTC 转换为本地时间 但它无法识别我打算使用的方法 System DateTime ToLocalTime 我的查询是这样的 选择本地当天不存在任何其他请求尚未解决的请求 考虑到
  • 在 Delphi 中使用 XPath 查找元素

    我试图在 Delphi 中的 XML 文档中查找元素 我有这段代码 但它总是在日志中显示 0 个元素 function TForm1 KannaSidu Boolean var Doc IXMLDOMDocument List IXMLDo
  • 使用 OpenSL 为所有 Android 设备提供 8KHz 采样率的语音通信

    我需要创建一个 VOIP 应用程序 并且我正在使用 OpenSL ES 我需要为所有 Android 设备以 8KHz 采样率捕获和播放 pcm 音频数据 但是 当我以 8KHz 采样率捕获音频并同时播放 语音通信 时 它会产生噪音 并且对