gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:12:10 24 4
gpt4 key购买 nike

我有一个应用程序,我在其中以流模式使用 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 延迟?

最佳答案

API 级别 19 在 AudioTrack 中添加了一个名为 getTimeStamp() 的方法.来自文档:

Poll for a timestamp on demand.

If you need to track timestamps during initial warmup or after a routing or mode change, you should request a new timestamp periodically until the reported timestamps show that the frame position is advancing, or until it becomes clear that timestamps are unavailable for this route.

您指定一个 AudioTimestamp对象作为函数的参数,它将填充最近“呈现”的帧位置及其以纳秒为单位的“估计”时间戳。纳秒值对应于 SystemClock.uptimeMillis() 返回的毫秒值.

然后,您可以通过确定将特定帧写入 AudioTrack 的时间与 getTimestamp() 认为它实际呈现的时间来确定延迟。我发现这种方法比上面提到的其他方法更准确。

但你必须要小心。文档说 getTimeStamp() 并非在所有平台或所有路由上都受支持。您可以通过检查 boolean 返回值来确定调用是否成功。我发现在我测试过的设备中,该函数返回 false,直到音频开始呈现,然后后续调用返回 true。我只在 STREAM_MUSIC 模式下使用 AudioTrack 进行了测试。您的里程可能会有所不同。

关于java - 您如何确定 Android 上的音频延迟 (AudioTrack)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15802659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com