java—是否可以将.setmicrosecondposition()与line一起使用,还是只能与clip一起使用

nuypyhwy  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(417)

我目前正在用netbeans12.1制作mp3播放器,我找不到控制歌曲当前位置的方法。
我试过使用.setmicrosecondposition(),但它似乎只适用于剪辑,而不适用于行。我的播放机是否有可能改变赛道的当前位置,或者我是否应该改变我的代码?
这是玩家的密码。

  1. public void run() {
  2. final File file = new File(filePath);
  3. try (final AudioInputStream in = AudioSystem.getAudioInputStream(file)) {
  4. final AudioFormat outFormat = getOutFormat(in.getFormat());
  5. final Info info = new Info(SourceDataLine.class, outFormat);
  6. try (final SourceDataLine line
  7. = (SourceDataLine) AudioSystem.getLine(info)) {
  8. getLine(line);
  9. line.getMicrosecondPosition();
  10. if (line != null) {
  11. line.open(outFormat);
  12. line.start();
  13. long millis;
  14. AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(file);
  15. Map<?, ?> properties = ((TAudioFileFormat) fileFormat).properties();
  16. String key = "duration";
  17. String title = "title";
  18. Long microseconds = (Long) properties.get(key);
  19. maksimumSekunde = (int)TimeUnit.MICROSECONDS.toSeconds(microseconds);
  20. title1 = (String) properties.get(title);
  21. int mili = (int) (microseconds / 1000);
  22. sec = (mili / 1000) % 60;
  23. min = (mili / 1000) / 60;
  24. setVolumeDown(sliderGlasnoca.getValue());
  25. //STREAM
  26. int n = 0;
  27. final byte[] buffer = new byte[4096];
  28. AudioInputStream inp = getAudioInputStream(outFormat, in);
  29. while (n != -1) {
  30. if (pauza == true) {
  31. break;
  32. }
  33. if (stop == true) {
  34. synchronized (LOCK) {
  35. LOCK.wait();
  36. }
  37. }
  38. n = inp.read(buffer, 0, buffer.length);
  39. if (n != -1) {
  40. line.write(buffer, 0, n);
  41. }
  42. millis = TimeUnit.MICROSECONDS.toMillis(line.getMicrosecondPosition());
  43. trajanjeSekunde = (int)TimeUnit.MICROSECONDS.toSeconds(line.getMicrosecondPosition());
  44. minutes = (millis / 1000) / 60;
  45. seconds = ((millis / 1000) % 60);
  46. //System.out.println(minutes + ":" + seconds + " " + "time = " + min + ":" + sec + " " + title1);
  47. }
  48. //STREAM
  49. line.drain();
  50. line.stop();
  51. Finished();
  52. }
  53. } catch (InterruptedException ex) {
  54. }
  55. } catch (UnsupportedAudioFileException
  56. | LineUnavailableException
  57. | IOException e) {
  58. throw new IllegalStateException(e);
  59. }
  60. }

这是我第一次在这里发帖。提前感谢:)

toiithl6

toiithl61#

我总是从通过 AudioInputStream ,但重新审视api,我发现可以使用 AudioInputStream.skip(...) 方法向前跳转给定的字节数。计算与给定时间量对应的字节数涉及知道每帧字节数,例如,16位编码、立体声是每帧4字节以及采样率。
如果一个人能可靠地向后跳。这将取决于是否可以“标记”和“重置”用户正在读取的文件 AudioInputStream . 如果这些能力得到支持,人们似乎可以想象 mark(...) 世界的开始 AudioInputStream . 那么,先退一步 reset() 回到开头,然后通过 skip(...) . 我没试过这个。很大程度上取决于文件中允许的字节数 mark(...) 方法。
如果在播放音频的过程中启动或停止,则输入到 SourceDataLine 由于信号的不连续性,可能会出现“咔哒声”。为了解决这个问题,可能需要将启动和停止转换为pcm,并在启动时增大音量,或在停止时减小音量。所需的帧数可能需要通过实验来确定。我猜64帧44100fps可能是一个很好的第一次尝试。

相关问题