gpt4 book ai didi

android - 如何在Android上使用AudioTrack.getTimestamp()计算延迟?

转载 作者:行者123 更新时间:2023-12-03 00:30:29 25 4
gpt4 key购买 nike

我看到许多资源建议在现代Android版本上使用AudioTrack.getTimestamp()来计算音频/视频同步的音频延迟。

例如:

https://stackoverflow.com/a/37625791/332798

https://developer.amazon.com/docs/fire-tv/audio-video-synchronization.html#section1-1

https://groups.google.com/forum/#!topic/android-platform/PoHfyNK54ps

但是,这些方法都不能解释,如何使用时间戳来计算延迟?我正在努力弄清楚如何使用时间戳的framePosition / nanoTime来提供延迟数字。

最佳答案

因此,在使用此API之前,您将使用AudioTrack.getPlaybackHeadPosition(),这只是一个近似值。因此,要考虑延迟,您必须使用两个隐藏方法之一中的延迟值来抵消该值:AudioManager.getOutputLatency()AudioTrack.getLatency()

使用新的AudioTrack.getTimestamp() API,您可以在给定的时间获取播放头位置的快照,并直接在输出中拍摄。这样,它是完全准确的,并且已经解决了设备延迟问题。因此,现在无需调用任何其他API来添加/删除延迟。

需要注意的是,此时间戳仅是快照,文档建议您不要经常调用此新方法。因此,获得“当前”位置的技巧是使用上一个快照并线性插值当前值:

playheadPos = timestamp.framePosition + 
(System.nanoTime() - timestamp.nanoTime) * samplerate / 1e9;

然后,可以通过维护另一个计数器来比较此位置,您将其写入 AudioTrack中多少帧,每次 AudioTrack.write()完成时,该计数器都会递增:
int bytesWritten = track.write(...);
writtenPos += bytesWritten / pcmFrameSize;

如果您使用的是 ENCODING_AC3,则 AudioTrack报告的播放头位置仍以样本为单位。您将需要将其转换为字节,或者将已写入的字节数转换回样本。无论哪种方式,您都需要知道AC3流的比特率(即 384000bps)
int bytesWritten = track.write(...);
writtenPos += bytesWritten * samplerate / (bitrate / 8);

关于android - 如何在Android上使用AudioTrack.getTimestamp()计算延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49581054/

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