当前位置: 首页 > 面试题库 >

您如何确定Android上的音频延迟(AudioTrack)?

沙宣
2023-03-14
问题内容

我有一个应用程序,在其中使用AudioTrack流式播放模式来播放动态生成的音频。该应用程序不必即时响应输入,因此延迟问题不会困扰我程序的那一边。

问题是我有一个动画,需要与音频尽可能精确地“同步”,并且似乎从AudioTrack停止阻塞write()呼叫并请求更多数据到何时停止播放的时间,不同的设备具有不同的时间量。从扬声器播放音频。

我目前的解决方案可以帮助我解决大部分问题-
我计算AudioTrack到目前为止已传递的帧数,并将其与进行比较getPlaybackHeadPosition()。它基本上看起来像:

long currentTimeInFrames = 0;
while(playingAudio) {
  currentTimeInFrames += numberOfFramesToWrite;
  long delayInFrames = (currentTimeInFrames - audioTrack.getPlaybackHeadPosition());
  audioTrack.write(frameBuffer,0,sampleSize);
  doAnimationAfterDelay(delayInFrames);
}

但是,仍然存在一些getPlaybackHeadPosition()似乎无法解释的延迟,具体取决于设备。

有没有一种方法可以轮询系统以获取AudioTrack的延迟?


问题答案:

考虑驱动程序的延迟。有隐藏的函数AudioManager.getOutputLatency(int)来获得此功能。

这样称呼它:

AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
try{
   Method m = am.getClass().getMethod("getOutputLatency", int.class);
   latency = (Integer)m.invoke(am, AudioManager.STREAM_MUSIC);
}catch(Exception e){
}

在不同的设备上,我大约需要45-50 ms。在计算中使用结果。



 类似资料:
  • 原文链接 : Android’s 10 Millisecond Problem: The Android Audio Path Latency Explainer 作者 : Gabor (@szantog) and Patrick (@Pv), founders of Superpowered 译者 : objectlife 校对者: 状态 : 许多手机应用都是非常依赖低音频功能的,比如游戏类,合

  • 在网上研究了几天后,我来这里寻求帮助。我目前正在为朋友们开发一个简短的2D游戏(实际上只是为了好玩),几天前我了解了剪辑。在这个游戏中,玩家可以收集物体(几乎就像马里奥中的硬币一样)。我的问题是,我在收集硬币时会发出非常短的声音(50kB约1秒),如果玩家在1秒钟内收集3个硬币,那么剪辑会使游戏延迟。如果先例剪辑已经结束,那么就没有延迟。但是如果先例剪辑没有结束,那么尝试再次播放剪辑会使游戏延迟(

  • 我正在寻找一些关于如何使用标记以相对低的延迟(~2s)流直播视频流的建议。我也看到过一些其他类似的问题,比如这个和这个,但都没有真正充分地回答我的问题。第一种是在内容消费者不在现场的假设下工作的。第二个似乎也做出了这样的假设。 我正在寻找技术,库或任何建议真正实现这一点。我已经尝试使用nginx-RTMP从视频设备接收流,然后使用HLS将其发送到浏览器。然而,我所能达到的最低延迟是4s。我还没来得

  • 问题内容: 有一些方法可以在Android Wear上录制音频吗?我使用了AudioRecord API,它使应用程序崩溃。 难道我做错了什么? 问题答案: 支持AudioRecord,并且可以在Android Wear上使用。如果要在仿真器上进行测试,则可能是不支持您提供的采样率11025,请尝试另一种,例如8000。 构造AudioRecord之后,您应在尝试记录之前检查状态以确认初始化是否成

  • 我有一个导航抽屉的问题,它太慢了,我正在寻找的解决方案是关闭抽屉,然后显示活动,但它不工作,当然我错过了一些东西。

  • 问题内容: 我想在更改背景之间的命令之间设置延迟。我尝试使用线程计时器,并尝试使用运行和捕获。但这不起作用。我试过了 但这只是变成黑色。 问题答案: 试试这个代码: