получение mp3 аудио сигнала в виде массива в Java - PullRequest
1 голос
/ 15 ноября 2011

Я пытался получить аудиопоток mp3 в виде массива чисел с плавающей запятой.У меня есть массив с приведенным ниже примером кода.Я не уверен, могу ли я использовать этот массив для применения БПФ.Потому что этот массив не совпадает [или похож] с тем, который я получил из кода C ++, который использует LAME.

import java.io.File;
import java.io.IOException;
import java.io.PrintStream;

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;
import javax.sound.sampled.UnsupportedAudioFileException;

import javazoom.spi.mpeg.sampled.file.MpegAudioFileReader;

import org.tritonus.share.sampled.FloatSampleTools;



public class onjava {



    public static void main(String[] args) {
        try {

        File file = new File("mymp3file.mp3");
        MpegAudioFileReader mpegAudioFileReader = new MpegAudioFileReader();
        int fl = mpegAudioFileReader.getAudioFileFormat(file).getFrameLength();
        System.out.println(fl);
        AudioInputStream in= AudioSystem.getAudioInputStream(file);
        AudioInputStream din = null;
        AudioFormat baseFormat = in.getFormat();
        onjava oj = new onjava();
        AudioFormat decodedFormat =
            new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
                            baseFormat.getSampleRate(),
                            16,
                            baseFormat.getChannels(),
                            baseFormat.getChannels() * 2,
                            baseFormat.getSampleRate(),
                            false);
        int len = (int)file.length();
        din = AudioSystem.getAudioInputStream(decodedFormat, in);

        oj.rawplay(decodedFormat, din, len, fl);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (LineUnavailableException e) {
            e.printStackTrace();
        } catch (UnsupportedAudioFileException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    private void rawplay(AudioFormat targetFormat, AudioInputStream din , int len, int frameLength)
            throws IOException, LineUnavailableException {
        byte[] data = new byte[len-1];
        float[] floatArray = new float[len-1];
        SourceDataLine line = getLine(targetFormat);
        File textFile = new File("outputfile.txt");
        PrintStream printStream = new PrintStream(textFile);
        System.setOut(printStream);

        if (line != null) {
            // Start
            line.start();
            int nBytesRead = 0, nBytesWritten = 0;
            while (nBytesRead != -1) {
                nBytesRead = din.read(data, 0, 8000);
                if (nBytesRead != -1) {
                //Please tell me if something is wrong with the arguments passed below
                    FloatSampleTools.byte2floatGeneric(data, 0, targetFormat.getFrameSize(), floatArray, 0, 1000, targetFormat);

                    for (int i = 0; i < nBytesRead; i++) {
                        if(floatArray[i] != 0.0)
                        System.out.println(floatArray[i]);
                    }

                }
            }
            // Stop
            line.drain();
            line.stop();
            line.close();
            din.close();
        }


    }


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

}

Пожалуйста, предложите, если что-то не так в приведенном выше коде.Также, если любой другой чистый API Java доступен для обработки mp3 файла.Мне нужен массив с плавающей точкой из аудиопотока mp3.

Также дайте мне знать о реализации Java в LAME, если она доступна.

Спасибо !!

1 Ответ

0 голосов
/ 10 июля 2012
javazoom.spi.mpeg.sampled.file.MpegAudioFileReader

&

org.tritonus.share.sampled.FloatSampleTools

не найдено. Укажите библиотеку, которую вы использовали для этих функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...