Чтение двоичных данных mp3 для визуализации

В моем предыдущем посте у меня были небольшие проблемы с попыткой прочитать файл mp3. Теперь я могу это сделать, и я хочу иметь возможность отображать данные из mp3 с помощью Java Swing. И было бы неплохо проигрывать мп3 и визуализировать одновременно.

У меня есть двоичные данные (которые я передал в выходной поток), но я не знаю, как их интерпретировать.

По сути, примерно в LINE57, что мне нужно сделать с массивом байтов, чтобы я мог интерпретировать данные как значения db?

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;

public class MainSound {

    public static void main(final String [] args) throws Exception {
        System.out.println("Running");        
        System.out.println(System.getProperty("java.version"));        
        final AudioFileFormat.Type [] types = AudioSystem.getAudioFileTypes();
        for (final AudioFileFormat.Type t : types) {
            System.out.println("Returning Type : " + t);
        } // End of the for //                
        final String PATH = "C:\\Users\\bbrown\\Downloads\\swing-hacks-examples-20060109\\Ch10-Audio\\75\\soundcloud2.mp3";             
        final File file = new File(PATH);
        final AudioInputStream in = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream(file)));

        AudioInputStream din = null;
        final AudioFormat baseFormat = in.getFormat();
        final AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
                baseFormat.getSampleRate(),
                16,
                baseFormat.getChannels(),
                baseFormat.getChannels() * 2,
                baseFormat.getSampleRate(),
                false);

        System.out.println("Channels : " + baseFormat.getChannels());                
        din = AudioSystem.getAudioInputStream(decodedFormat, in);        
        rawplay(decodedFormat, din);
        in.close();       
        System.out.println("Done");
    }    

    private static synchronized void rawplay(final AudioFormat targetFormat, final AudioInputStream din) throws IOException, LineUnavailableException {              
        final byte[] data = new byte[4096];
        final SourceDataLine line = getLine(targetFormat);               
        if (line != null) {
            System.out.println("Entering ...");
            // Start
            line.start();
            int nBytesRead = 0, nBytesWritten = 0;
            while (nBytesRead != -1) {
                nBytesRead = din.read(data, 0, data.length);
                if (nBytesRead != -1) {
                    // LINE57, HOW CAN INTERPRET this data for VISUALIZATION.
                    nBytesWritten = line.write(data, 0, nBytesRead);
                    System.out.println("... -->" + data[0] + " bytesWritten:" + nBytesWritten);
                }                                           
            } // End of while //            
            System.out.println("Done ...");
            // Stop
            line.drain();
            line.stop();
            line.close();
            din.close();
        } // End of the if //
    }

    private static synchronized SourceDataLine getLine(AudioFormat audioFormat) throws LineUnavailableException {
        SourceDataLine res = null;
        final DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
        res = (SourceDataLine) AudioSystem.getLine(info);
        res.open(audioFormat);
        return res;
    }

} // End of the class //

person Berlin Brown    schedule 21.10.2012    source источник


Ответы (1)


Взгляните на исходный код Extreme Media Player, который представляет собой кроссплатформенный медиаплеер с поддержкой визуализации, и, конечно же, написано на Яве.

Изучение кода должно помочь вам понять, как читать децибелы воспроизводимых байтовых данных. (Мне понравился вопрос, поскольку я не видел, чтобы его задавали раньше).

Как видно здесь:

введите здесь описание изображения

ОБНОВЛЕНИЕ:

Жаль, что Java изначально не поддерживает формат MP3, но взгляните на эту ссылку, показывающую нам JMF (Java Media Framework) — плагин для j2SE, который включает поддержку MP3 с помощью дополнительных Плагин MP3 для JMF.

person David Kroukamp    schedule 21.10.2012
comment
@MadProgrammer +1, спасибо, я давно хотел закодировать свой собственный MediaPlayer, поэтому у меня был краткий обзор конкурентов;) - person David Kroukamp; 21.10.2012
comment
Хороший пример, читаемый код и именно то, что мне нужно. Еще были небольшие проблемы с мп3 плеером. Мне пришлось включить плагин mp3 (внешний). - person Berlin Brown; 22.10.2012
comment
@BerlinBrown +1 спасибо, да, жаль, что Java изначально не поддерживает формат MP3, но взгляните на эту ссылку, показывающую нам JMF (Java Media Framework), который является плагином для j2SE, который включает поддержку MP3: mkyong.com/applet/how-to-play-mp3- файл-в-апплете-jmf - person David Kroukamp; 22.10.2012
comment
Может я туплю, но не вижу ссылки с мп3 флягой. Меня просто постоянно перенаправляют. Ошибка сайта Oracle? Например. у вас есть полный путь к mp3plugin.jar - person Berlin Brown; 23.10.2012