1

我一直在尝试将 mp3 的音频流作为浮点数组。我得到了带有以下示例代码的数组。我不确定我是否可以使用这个数组来应用 FFT。因为这个数组与我从使用 LAME 的 C++ 代码中得到的数组不匹配[或相似]。

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;
    }

}

请提出上述代码中是否有任何问题。此外,如果任何其他纯 java API 可用于处理 mp3 文件。我需要来自 mp3 音频流的浮点数组。

如果有的话,也让我知道 LAME 的纯 java 实现。

谢谢!!

4

1 回答 1

0
javazoom.spi.mpeg.sampled.file.MpegAudioFileReader

&

org.tritonus.share.sampled.FloatSampleTools

没有找到。指定用于这些功能的库。

于 2012-07-10T16:25:36.813 回答