使用Java声音API跳转到音频文件中的位置
我正在使用a向a提供字节以播放PCM文件。我想让用户能够移动滑块跳到文件中的某个点 我遇到的问题:使用Java声音API跳转到音频文件中的位置,java,memory-mapped-files,audio,javasound,Java,Memory Mapped Files,Audio,Javasound,我正在使用a向a提供字节以播放PCM文件。我想让用户能够移动滑块跳到文件中的某个点 我遇到的问题: 在my上返回false。所以我 无法使用我的初始方法调用reset(),然后调用skip()(其中 我已经觉得有点难看了……) 我真的不想拆掉InputStream,创建一个新的,只是为了跳转到我当前标记之前的位置 似乎不太可靠。。。我知道它有一个缓冲区,但即使考虑到缓冲区中剩余的字节,我也不理解其行为 我曾经考虑过使用a将字节输入到行中,这样我就可以跳到任何我想跳的地方,但是如果不需要的话,
- 在my上返回
。所以我 无法使用我的初始方法调用false
,然后调用reset()
(其中 我已经觉得有点难看了……)skip()
- 我真的不想拆掉
m,创建一个新的,只是为了跳转到我当前标记之前的位置InputStrea
- 似乎不太可靠。。。我知道它有一个缓冲区,但即使考虑到缓冲区中剩余的
字节,我也不理解其行为
我曾经考虑过使用a将字节输入到行中,这样我就可以跳到任何我想跳的地方,但是如果不需要的话,我不想增加函数的复杂性。有没有一个好的方法可以做到这一点,我错过了?还有谁能解释一下返回的帧号实际上是什么意思?是否是通过扬声器的帧数(似乎不是)?BigClip对您有用吗 如果没有,这里有一个可行的方法。警告,这有点复杂。 有了这个小程序,你可以加载一个wav——我已经加载了超过5分钟的wav,效果很好,但是音频数据确实占用了很多RAM 加载WAV后,您可以将鼠标移到任意点,并通过按住鼠标并拖动播放。显然,这并不完全是您想要做的,因为您希望从一个点开始播放,而不必担心拖动或拖动速度。但我所采取的以可播放状态获取数据的方法仍然适用于您 如果您有一个工作的AudioInputStream和AudioFileFormat,您可以设置一个内部阵列并将数据直接读取到其中。音频文件格式提供了编码和帧长度,可用于计算阵列尺寸 然后,制作一条TargetDataLine,从您制作的阵列中获取其音频数据。TDL必须有一个标记下一次读取开始位置的变量。可以使用JSlider更改该变量的内容,使其指向所需的任何帧 如果您没有一个工作的AudioInputStream,有很多方法可以获得一个…但是它更复杂,涉及ByteArrayOutput和Input流对象。也许没必要去那里。(我使用它们读取上述小程序中的客户端数据。) 至于您关于当前帧位置的问题,关键问题是JVM以块的形式处理音频数据,并且它往往比突发的声音要快。我在这个问题上绞尽脑汁了很长一段时间,然后想到了这个:
我能想到的最干净的方法是使用
文件通道
将字节读入源数据行
,这种方法基于用户移动滑块,我可以确定字节在文件中的位置(确保调整或四舍五入以与帧对齐)然后在文件频道中设置该位置,然后继续播放。当这发生时,我刷新了行以阻止播放剩余的字节。因为我正在播放的文件可能具有未指定的长度。据我所知,剪辑用于非常短的声音。“未指定”或“大”?区别是非常重要的。例如,可以处理大夹子。(是的,你对Clip
的理解是正确的。)谢谢你的例子,我实际上已经想出了一个解决方案,我只是忘记发布了。