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

}

上記のコードに何か問題がある場合は、提案してください。また、mp3 ファイルの処理に他の純粋な Java API が利用できる場合。mp3 オーディオ ストリームからの float の配列が必要です。

可能な場合は、LAME のピュア Java 実装についても教えてください。

ありがとう!!

4

1 に答える 1

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

&

org.tritonus.share.sampled.FloatSampleTools

見つかりません。それらの関数に使用したライブラリを指定します。

于 2012-07-10T16:25:36.813 に答える