getting mp3 audio signal as array in java

冷暖自知 提交于 2019-12-11 12:12:21

问题


I have been trying to get audio stream of mp3 as array of floating points. I have got the array with the below sample code. I am not sure whether I can use this array for applying FFT. Because this array is not matching[or similar] to the one which I got from C++'s code which uses 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;
    }

}

Please suggest if anything is wrong in the above code. Also if any other pure java API is available for processing mp3 file. I need array of floats from mp3 audio stream.

Also let me know about pure java implementation of LAME if available.

Thanks!!


回答1:


javazoom.spi.mpeg.sampled.file.MpegAudioFileReader

&

org.tritonus.share.sampled.FloatSampleTools

are not found. Specify the library you have used for those functions.



来源:https://stackoverflow.com/questions/8138526/getting-mp3-audio-signal-as-array-in-java

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!