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

我有一个应用程序,在其中使用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上的音频延迟(AudioTrack)? 的全部内容, 来源链接: utcz.com/qa/428678.html

回到顶部