草庐IT

Android:声音 API(确定性、低延迟)

coder 2023-06-05 原文

我正在审查各种 Android 声音 API,我想知道我应该使用哪一个。 我的目标是获得低延迟的音频,或者至少是关于播放延迟的确定性行为。

我们遇到了很多问题,Android 声音 API 似乎很垃圾,所以我正在探索可能性。

我们遇到的问题是 sound_out.write(sound_samples); 和扬声器播放的实际声音之间存在明显延迟。通常为 300 毫秒左右。问题是在所有设备上都是不同的。有些人没有这个问题,但大多数人都瘫痪了(但是,CS 调用的延迟为零)。这种荒谬延迟的最大问题是,在某些设备上,这种延迟似乎是某个随机值(即并不总是 300 毫秒)。

我正在阅读有关 OpenSL ES 的信息,我想知道是否有人对此有经验,或者它是相同的狗屎但包装在不同的包装中?

我更喜欢本地访问,但我不介意 Java 层间接,只要我可以获得确定性行为:要么延迟必须是恒定的(对于给定的设备),要么我想获得访问到当前播放位置,而不是猜测它,误差范围为±300 ms...

编辑:
1.5 年后,我尝试了多部 Android 手机,看看如何获​​得最佳的实时语音通信延迟。我使用专门的工具测量了波形输出路径的延迟。最佳结果超过 100 毫秒,大多数手机都在 180 毫秒范围内。有人有想法吗?

最佳答案

SoundPool 是大多数设备上延迟最低的接口(interface),因为池存储在音频进程中。所有其他音频路径都需要进程间通信。如果 SoundPool 不能满足您的需求,OpenSL 是最佳选择。

为什么选择 OpenSL? AudioTrack 和 OpenSL 具有相似的延迟,但有一个重要区别:AudioTrack 缓冲区回调在 Dalvik 中提供服务,而 OpenSL 回调在 native 线程中提供服务。 Dalvik 的当前实现无法以极低的延迟为回调提供服务,因为在音频回调期间无法暂停垃圾收集。这意味着 AudioTrack 缓冲区的最小大小必须大于 OpenSL 缓冲区的最小大小才能维持无故障播放。

在大多数 Android 版本中,AudioTrack 和 OpenSL 之间的这种差异根本没有任何区别。但是有了 Jellybean,Android 现在有了一个低延迟的音频路径。实际延迟仍然取决于设备,但它可能比以前低得多。例如,http://code.google.com/p/music-synthesizer-for-android/在 Galaxy Nexus 上使用 384 帧缓冲区,总输出延迟低于 30 毫秒。这要求音频线程大约每 8 毫秒为缓冲区提供一次服务,这在以前的 Android 版本中是不可行的。在 Dalvik 线程中仍然不可行。

这种解释假设了两件事:首先,您从 OpenSL 请求尽可能小的缓冲区,并在缓冲区回调中进行处理,而不是使用缓冲区队列。其次,您的设备支持低延迟路径。在大多数当前设备上,您不会看到 AudioTrack 和 OpenSL ES 之间有太大区别。但在支持 Jellybean+ 和低延迟音频的设备上,OpenSL ES 将为您提供最低延迟路径。

关于Android:声音 API(确定性、低延迟),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7266298/

有关Android:声音 API(确定性、低延迟)的更多相关文章

  1. ruby - 即时确定方法的可见性 - 2

    我正在编写一个方法,它将在一个类中定义一个实例方法;类似于attr_accessor:classFoocustom_method(:foo)end我通过将custom_method函数添加到Module模块并使用define_method定义方法来实现它,效果很好。但我无法弄清楚如何考虑类(class)的可见性属性。例如,在下面的类中classFoocustom_method(:foo)privatecustom_method(:bar)end第一个生成的方法(foo)必须是公共(public)的,第二个(bar)必须是私有(private)的。我怎么做?或者,如何找到调用我的cust

  2. ruby-on-rails - ActionController::RoutingError: 未初始化常量 Api::V1::ApiController - 2

    我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc

  3. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  4. 屏幕录制为什么没声音?检查这2项,轻松解决 - 2

    相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声

  5. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  6. ruby-on-rails - Mandrill API 模板 - 2

    我正在使用Mandrill的RubyAPIGem并使用以下简单的测试模板:testastic按照Heroku指南中的示例,我有以下Ruby代码:require'mandrill'm=Mandrill::API.newrendered=m.templates.render'test-template',[{:header=>'someheadertext',:main_section=>'Themaincontentblock',:footer=>'asdf'}]mail(:to=>"JaysonLane",:subject=>"TestEmail")do|format|format.h

  7. ruby-on-rails - 在 Ruby (on Rails) 中使用 imgur API 获取图像 - 2

    我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path

  8. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  9. ruby-on-rails - 使用 HTTParty 的非常基本的 Rails 4.1 API 调用 - 2

    Rails相对较新。我正在尝试调用一个API,它应该向我返回一个唯一的URL。我的应用程序中捆绑了HTTParty。我已经创建了一个UniqueNumberController,并且我已经阅读了几个HTTParty指南,直到我想要什么,但也许我只是有点迷路,真的不知道该怎么做。基本上,我需要做的就是调用API,获取它返回的URL,然后将该URL插入到用户的数据库中。谁能给我指出正确的方向或与我分享一些代码? 最佳答案 假设API为JSON格式并返回如下数据:{"url":"http://example.com/unique-url"

  10. ruby - 确定 ruby​​ 脚本是否已经在运行 - 2

    有没有一种简单的方法可以判断ruby​​脚本是否已经在运行,然后适本地处理它?例如:我有一个名为really_long_script.rb的脚本。我让它每5分钟运行一次。当它运行时,我想看看之前运行的是否还在运行,然后停止第二个脚本的执行。有什么想法吗? 最佳答案 ps是一种非常糟糕的方法,并且可能会出现竞争条件。传统的Unix/Linux方法是将PID写入文件(通常在/var/run中)并在启动时检查该文件是否存在。例如pid文件位于/var/run/myscript.pid然后你会在运行程序之前检查它是否存在。有一些技巧可以避免

随机推荐