Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java声音API跳转到音频文件中的位置_Java_Memory Mapped Files_Audio_Javasound - Fatal编程技术网

使用Java声音API跳转到音频文件中的位置

使用Java声音API跳转到音频文件中的位置,java,memory-mapped-files,audio,javasound,Java,Memory Mapped Files,Audio,Javasound,我正在使用a向a提供字节以播放PCM文件。我想让用户能够移动滑块跳到文件中的某个点 我遇到的问题: 在my上返回false。所以我 无法使用我的初始方法调用reset(),然后调用skip()(其中 我已经觉得有点难看了……) 我真的不想拆掉InputStream,创建一个新的,只是为了跳转到我当前标记之前的位置 似乎不太可靠。。。我知道它有一个缓冲区,但即使考虑到缓冲区中剩余的字节,我也不理解其行为 我曾经考虑过使用a将字节输入到行中,这样我就可以跳到任何我想跳的地方,但是如果不需要的话,

我正在使用a向a提供字节以播放PCM文件。我想让用户能够移动滑块跳到文件中的某个点

我遇到的问题:

  • 在my上返回
    false
    。所以我 无法使用我的初始方法调用
    reset()
    ,然后调用
    skip()
    (其中 我已经觉得有点难看了……)
  • 我真的不想拆掉
    InputStrea
    m,创建一个新的,只是为了跳转到我当前标记之前的位置
  • 似乎不太可靠。。。我知道它有一个缓冲区,但即使考虑到缓冲区中剩余的
    字节,我也不理解其行为

我曾经考虑过使用a将字节输入到行中,这样我就可以跳到任何我想跳的地方,但是如果不需要的话,我不想增加函数的复杂性。有没有一个好的方法可以做到这一点,我错过了?还有谁能解释一下返回的帧号实际上是什么意思?是否是通过扬声器的帧数(似乎不是)?

BigClip对您有用吗

如果没有,这里有一个可行的方法。警告,这有点复杂。

有了这个小程序,你可以加载一个wav——我已经加载了超过5分钟的wav,效果很好,但是音频数据确实占用了很多RAM

加载WAV后,您可以将鼠标移到任意点,并通过按住鼠标并拖动播放。显然,这并不完全是您想要做的,因为您希望从一个点开始播放,而不必担心拖动或拖动速度。但我所采取的以可播放状态获取数据的方法仍然适用于您

如果您有一个工作的AudioInputStream和AudioFileFormat,您可以设置一个内部阵列并将数据直接读取到其中。音频文件格式提供了编码和帧长度,可用于计算阵列尺寸

然后,制作一条TargetDataLine,从您制作的阵列中获取其音频数据。TDL必须有一个标记下一次读取开始位置的变量。可以使用JSlider更改该变量的内容,使其指向所需的任何帧

如果您没有一个工作的AudioInputStream,有很多方法可以获得一个…但是它更复杂,涉及ByteArrayOutput和Input流对象。也许没必要去那里。(我使用它们读取上述小程序中的客户端数据。)

至于您关于当前帧位置的问题,关键问题是JVM以块的形式处理音频数据,并且它往往比突发的声音要快。我在这个问题上绞尽脑汁了很长一段时间,然后想到了这个:

我能想到的最干净的方法是使用
文件通道
将字节读入
源数据行
,这种方法基于用户移动滑块,我可以确定字节在文件中的位置(确保调整或四舍五入以与帧对齐)然后在
文件频道中设置该位置,然后继续播放。当这发生时,我刷新了行以阻止播放剩余的字节。

因为我正在播放的文件可能具有未指定的长度。据我所知,剪辑用于非常短的声音。“未指定”或“大”?区别是非常重要的。例如,可以处理大夹子。(是的,你对
Clip
的理解是正确的。)谢谢你的例子,我实际上已经想出了一个解决方案,我只是忘记发布了。