【问题标题】:Java using mp3, ogg and wav files with javax.sound.sampled.Clip (or getting the bitrate of the sound file)Java 使用带有 javax.sound.sampled.Clip 的 mp3、ogg 和 wav 文件(或获取声音文件的比特率)
【发布时间】:2021-05-29 03:23:45
【问题描述】:

我的目标是同时播放多个 mp3、ogg 或 wav 音乐文件,以便在视频游戏中创建自适应音乐。

我没有使用 java 声音 API 中的 Clip 类,而是设法创建了一个名为 Track 的类,感谢 mp3spi 和 vorbisspi,它可以通过将音频数据写入 SourceDataLine 来读取 mp3、ogg 和 wav 文件。 由于这篇文章,我找到了这个解决方案:

https://stackoverflow.com/a/17737483/13326269

通过线程进入流函数一切正常,因此我可以创建许多 Track 对象来同时播放多个声音。但我想从 Clip 类中创建一个类似 void setMicrosecondPosition(long microseconds); 的函数。

我尝试了很多东西,我找到了一种方法:

in = getAudioInputStream(new File(file).getAbsoluteFile());
int seconds = 410;
int bitrate = 320; //in kbit/s
in.skip(seconds*bitrate*1000/8); // divided by 8 because the skip method use bytes.

但我需要文件的比特率。那么,我怎样才能获得任何声音文件的比特率?或者更好的是,如何将 mp3 和 ogg 文件与 javax.sound.sampled.Clip 类一起使用。

【问题讨论】:

    标签: java audio javasound tritonus


    【解决方案1】:

    我相信如果你真的有工作 AudioInputStreamsskip 函数引用的字节数应该是每帧的固定数量,由音频格式决定。例如立体声,16 位将是每帧 4 个字节,无论如何。因此,您应该能够使用帧速率(例如 44100 帧/秒)跳到所需的起点。

    另一种方法是读取但忽略从AudioInputStream 传入的字节,方法类似于链接解决方案示例中的stream 方法。这可以很快让您到达所需的点,因为您不会被 sdl write() 阻止。但如果这样可行,skip 方法也应该可行并且更可取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-10
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      相关资源
      最近更新 更多