java - Java 使用带有 javax.sound.sampled.Clip 的 mp3、ogg 和 wav 文件(或获取声音文件的比特率)
问题描述
我的目标是同时播放多个 mp3、ogg 或 wav 音乐文件,以便在视频游戏中创建自适应音乐。
我没有使用 java 声音 API 中的 Clip 类,而是设法创建了一个名为 Track 的类,多亏了 mp3spi 和 vorbisspi,它可以通过将音频数据写入 SourceDataLine 来读取 mp3、ogg 和 wav 文件。由于这篇文章,我找到了这个解决方案:
https://stackoverflow.com/a/17737483/13326269
使用线程进入流函数一切正常,因此我可以创建许多 Track 对象来同时播放多个声音。但我想void setMicrosecondPosition(long microseconds);
从 Clip 类中创建一个函数。
我尝试了很多事情,并找到了一种方法:
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类一起使用。
解决方案
我相信如果你真的有工作AudioInputStreams
,该skip
函数会引用一些字节数,这些字节数应该是每帧固定的数量,由音频格式决定。例如立体声,16 位将是每帧 4 个字节,无论如何。因此,您应该能够使用帧速率(例如,44100 帧/秒)跳到所需的起点。
另一个躲闪方法是读取但忽略从 传入的字节AudioInputStream
,方法类似于stream
链接解决方案示例中的方法。你这可以很快让你到达所需的点,因为你不会被 sdl 阻止write()
。但如果这有效,该skip
方法也应该有效,并且会更可取。
推荐阅读
- php - 删除一个已经存在的文件夹php
- c++ - 代码不输出泰文符号,但中文有效
- powerbi - Dax - Power Bi 中桑基图的分组数据
- c# - 如何比较数据库表名和文本框?
- php - 获取表格行的总数?
- javascript - Vuejs Option. Get an ID from a selected item
- android - 应用未运行时如何发送 fcm 通知
- c++ - Fstream 在写入尝试后关闭且没有错误
- android - RecyclerView:没有附加适配器跳过布局(TabbedActivity + Firestore)
- spring-cloud-sleuth - spring sleuth bag - 支持 sleuth 版本 #2