我正在开发一个与实时音频播放同步的应用程序。我想定义一个具有特定时间步长的侦听器,并使用侦听器在每次播放的音频提前一个时间步长时获取更新。实现此功能必须是可能的(存在证明是音频播放器应用程序的时间计数器),但我想到的架构可能是不可能的。
理想情况下,我会在声卡的 SPEAKER 或 HEADPHONE 目标端口上收听音频流。现有的 LineListener/LineEvent 功能仅支持 START/STOP/OPEN/CLOSE 事件,我无法继承和扩充目标端口实现(或 SourceDataLine 或 TargetDataLine)。
我怎样才能做到这一点?我是否需要让线程不断轮询 getMicrosecondPosition() 或 getLongFramePosition() 方法并在适当的时间触发我自己的事件?这听起来非常低效。如果我使用 Timer 在固定时间段触发轮询,那么我会比仅在 Port/DataLines 支持的可用 START 和 STOP 事件之间使用系统计时器更好。我会调用 getMicrosecondPosition() 方法进行同步,但我认为这可能会由于系统计时器和实时音频之间的漂移而导致偶尔的错误。我希望看到计数器重复或跳过(即 1:23:003、1:23:004、1:23:006、1:23:007... 或 1:23:003、1:23 :004、1:23:004、1:23:005..)。
我正在查看 javazoom mp3 播放器源以了解他们是如何做到的,但到目前为止还没有运气。任何帮助/提示将不胜感激。