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

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

我目前正在用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);
        }
    }

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

toiithl6

toiithl61#

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

相关问题