Java:如何实现侦听器来提供实时音频流位置?

Java:如何实现侦听器来提供实时音频流位置?,java,events,audio,synchronize,Java,Events,Audio,Synchronize,我正在开发一个与实时音频播放同步的应用程序。我想定义一个具有特定时间步长的侦听器,并使用该侦听器在每次播放的音频提前一个时间步长时获取更新。实现此功能必须是可能的(存在证明是音频播放器应用程序的时间计数器),但我心目中的架构可能不可能 理想情况下,我会在扬声器或声卡的耳机目标端口上收听音频流。现有的LineListener/LineEvent功能仅支持启动/停止/打开/关闭事件,并且我无法对目标端口实现(或SourceDataLine或TargetDataLine)进行子类化和扩充 我该怎么做?

我正在开发一个与实时音频播放同步的应用程序。我想定义一个具有特定时间步长的侦听器,并使用该侦听器在每次播放的音频提前一个时间步长时获取更新。实现此功能必须是可能的(存在证明是音频播放器应用程序的时间计数器),但我心目中的架构可能不可能

理想情况下,我会在扬声器或声卡的耳机目标端口上收听音频流。现有的LineListener/LineEvent功能仅支持启动/停止/打开/关闭事件,并且我无法对目标端口实现(或SourceDataLine或TargetDataLine)进行子类化和扩充

我该怎么做?我是否需要一个线程不断轮询getMicrosecondPosition()或getLongFramePosition()方法,并在适当的时间触发我自己的事件?听起来效率很低。如果我使用计时器在固定时间段触发轮询,那么我比在端口/数据线上支持的可用开始和停止事件之间使用系统计时器更好。我会调用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播放器的源代码,看看他们是如何做到的,但到目前为止还没有找到解决方法。任何帮助/提示都将不胜感激。

必须为此提供java库。我在Qt中使用了一个。在重新发明轮子之前,先看看网页“我是否需要一个线程不断轮询getMicrosecondPosition()或getLongFramePosition()方法,并在适当的时间触发我自己的事件?这听起来非常低效。”对我来说不是这样。@UmNyobe-是的,javazoom播放器有这个功能并提供源代码。我在那里寻找灵感。为什么你需要微秒的分辨率??通常这些库以微秒为单位给出位置,但不要期望每100微秒有一个事件。@UmNyobe-我需要的分辨率不超过1毫秒。我的示例是使用系统计时器每100毫秒轮询一次getMicrosecondPosition()方法。如果该值已滚动到下一个完整毫秒,则只有到那时我才会为侦听器触发事件。我选择100毫秒作为轮询时间步,以确保我的事件触发(1毫秒)精确到.1毫秒。我不会每0.1毫秒触发一次事件。仍然不确定计时器分辨率在大多数常见操作系统中是否可靠。希望这更清楚。必须有一个java库用于此。我在Qt中使用了一个。在重新发明轮子之前,先看看网页“我是否需要一个线程不断轮询getMicrosecondPosition()或getLongFramePosition()方法,并在适当的时间触发我自己的事件?这听起来非常低效。”对我来说不是这样。@UmNyobe-是的,javazoom播放器有这个功能并提供源代码。我在那里寻找灵感。为什么你需要微秒的分辨率??通常这些库以微秒为单位给出位置,但不要期望每100微秒有一个事件。@UmNyobe-我需要的分辨率不超过1毫秒。我的示例是使用系统计时器每100毫秒轮询一次getMicrosecondPosition()方法。如果该值已滚动到下一个完整毫秒,则只有到那时我才会为侦听器触发事件。我选择100毫秒作为轮询时间步,以确保我的事件触发(1毫秒)精确到.1毫秒。我不会每0.1毫秒触发一次事件。仍然不确定计时器分辨率在大多数常见操作系统中是否可靠。希望这更清楚。