我目前正在用netbeans12.1制作mp3播放器,我找不到控制歌曲当前位置的方法。
我试过使用.setmicrosecondposition(),但它似乎只适用于剪辑,而不适用于行。我的播放机是否有可能改变赛道的当前位置,或者我是否应该改变我的代码?
这是玩家的密码。
public void run() {
final File file = new File(filePath);
try (final AudioInputStream in = AudioSystem.getAudioInputStream(file)) {
final AudioFormat outFormat = getOutFormat(in.getFormat());
final Info info = new Info(SourceDataLine.class, outFormat);
try (final SourceDataLine line
= (SourceDataLine) AudioSystem.getLine(info)) {
getLine(line);
line.getMicrosecondPosition();
if (line != null) {
line.open(outFormat);
line.start();
long millis;
AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(file);
Map<?, ?> properties = ((TAudioFileFormat) fileFormat).properties();
String key = "duration";
String title = "title";
Long microseconds = (Long) properties.get(key);
maksimumSekunde = (int)TimeUnit.MICROSECONDS.toSeconds(microseconds);
title1 = (String) properties.get(title);
int mili = (int) (microseconds / 1000);
sec = (mili / 1000) % 60;
min = (mili / 1000) / 60;
setVolumeDown(sliderGlasnoca.getValue());
//STREAM
int n = 0;
final byte[] buffer = new byte[4096];
AudioInputStream inp = getAudioInputStream(outFormat, in);
while (n != -1) {
if (pauza == true) {
break;
}
if (stop == true) {
synchronized (LOCK) {
LOCK.wait();
}
}
n = inp.read(buffer, 0, buffer.length);
if (n != -1) {
line.write(buffer, 0, n);
}
millis = TimeUnit.MICROSECONDS.toMillis(line.getMicrosecondPosition());
trajanjeSekunde = (int)TimeUnit.MICROSECONDS.toSeconds(line.getMicrosecondPosition());
minutes = (millis / 1000) / 60;
seconds = ((millis / 1000) % 60);
//System.out.println(minutes + ":" + seconds + " " + "time = " + min + ":" + sec + " " + title1);
}
//STREAM
line.drain();
line.stop();
Finished();
}
} catch (InterruptedException ex) {
}
} catch (UnsupportedAudioFileException
| LineUnavailableException
| IOException e) {
throw new IllegalStateException(e);
}
}
这是我第一次在这里发帖。提前感谢:)
1条答案
按热度按时间toiithl61#
我总是从通过
AudioInputStream
,但重新审视api,我发现可以使用AudioInputStream.skip(...)
方法向前跳转给定的字节数。计算与给定时间量对应的字节数涉及知道每帧字节数,例如,16位编码、立体声是每帧4字节以及采样率。如果一个人能可靠地向后跳。这将取决于是否可以“标记”和“重置”用户正在读取的文件
AudioInputStream
. 如果这些能力得到支持,人们似乎可以想象mark(...)
世界的开始AudioInputStream
. 那么,先退一步reset()
回到开头,然后通过skip(...)
. 我没试过这个。很大程度上取决于文件中允许的字节数mark(...)
方法。如果在播放音频的过程中启动或停止,则输入到
SourceDataLine
由于信号的不连续性,可能会出现“咔哒声”。为了解决这个问题,可能需要将启动和停止转换为pcm,并在启动时增大音量,或在停止时减小音量。所需的帧数可能需要通过实验来确定。我猜64帧44100fps可能是一个很好的第一次尝试。