Изменить громкость java с помощью jlayer?

Я искал и читал другие темы, но я все еще не могу решить свои проблемы. У меня был один основной класс java и один java jframe. Я хочу добавить jslider для изменения громкости в моем mp3-плеере. Что я должен делать?

my_player2_func

class my_player2_func{статический Player player;

static void play() {
    try {
        FileInputStream fe = new FileInputStream(my_player2_main.str);
        player = new Player(fe);
    } catch (Exception ex) {
        System.out.println(ex);
    }

    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                player.play();
            } catch (Exception ex) {
                System.out.println(ex);
            }
        }
    }).start();
}     

static void stop() {
    if (player != null)
        player.close();
}    }

мой_player2_main

public my_player2_main() {
    initComponents();     
}
static String str;                              

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    my_player2_func.play();
}                                        

private void jSlider1StateChanged(javax.swing.event.ChangeEvent evt) {//what should i do here?}

person user1621647    schedule 24.08.2012    source источник
comment
JLayer не поддерживает это. Почему бы не использовать другую библиотеку?   -  person obataku    schedule 24.08.2012
comment
@veer JLayer не поддерживает его, потому что это не работа декодера по управлению громкостью. Это работа аудиосистемы, которая воспроизводит декодированный звук. Предложение другой библиотеки (кстати, какой?) на самом деле ничего не изменит.   -  person Durandal    schedule 24.08.2012
comment
@Durandal Я очень хорошо знаю, что JLayer - это декодер, но у него также есть очень простой интерфейс player, который он явно использует. Я бы предпочел, чтобы он использовал другую библиотеку, чем сказал ему собрать регулятор громкости в исходном коде JLayer. JMF поддерживает MP3, а также позволяет изменить громкость через GainControl. В качестве альтернативы он мог бы найти декодер MP3 для использования с javax.sound API и использовать FloatControl.Type.VOLUME :-)   -  person obataku    schedule 24.08.2012
comment
@veer Угадайте, что JLayer использует под капотом? Он просто не предоставляет регулировку громкости через свой AudioDevice. AFAIK Поддерживаемые форматы JMF зависят от платформы, но я никогда не беспокоился об этом, так что, возможно, JMF - это то, что нужно для TC, почему бы не поместить свой комментарий в ответ?   -  person Durandal    schedule 26.08.2012
comment
см. мой ответ на stackoverflow.com/questions/3134167/   -  person pstanton    schedule 11.07.2013


Ответы (1)


JLayer — это декодер. По своему определению он ничего не знает о громкости, это работа звукового оборудования, которое воспроизводит звук.

Ваша проблема связана с тем, что вы используете классы Player и JavaSoundAudioDevice по умолчанию, которые были предназначены как короткие, простые примеры воспроизведения MP3, а не как строительные блоки для полноценного аудиоплеера.

Вам придется скопировать или изменить исходный код JavaSoundAudioDevice (часть исходного кода JLayer) и взломать его для поддержки управления громкостью. И вуаля, вы можете регулировать громкость.

person Durandal    schedule 24.08.2012