您如何确定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