2009-06-02 6 views
14

私は、オーディオファイルを処理する必要があるアプリケーションで作業しています。 mp3ファイルを使用すると、データの扱い方がわかりません(興味のあるデータは、オーディオバイト、私たちが聞いているものを表すものです)。MP3からオーディオデータを取得する方法は?

私はwavファイルを使用している場合、私は44バイトのヘッダーを持っていることを知っています。 mp3については、ヘッダとオーディオデータを含む各フレームで構成されていることを読んだことがあります。 mp3ファイルからすべてのオーディオデータを取得することは可能ですか?

私はJavaを使用しています(MP3SPI、Jlayer、Tritonusを追加しました)、ファイルからバイトを取得できますが、これらのバイトが表すものや処理方法についてはわかりません。 documentation for MP3SPIから

答えて

26

File file = new File(filename); 
AudioInputStream in= AudioSystem.getAudioInputStream(file); 
AudioInputStream din = null; 
AudioFormat baseFormat = in.getFormat(); 
AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
              baseFormat.getSampleRate(), 
              16, 
              baseFormat.getChannels(), 
              baseFormat.getChannels() * 2, 
              baseFormat.getSampleRate(), 
              false); 
din = AudioSystem.getAudioInputStream(decodedFormat, in); 

それからちょうどdinからデータを読み取る - それはdecodedFormatあたりとして "生" のデータとなります。 (詳細については、docs for AudioFormatを参照してください)

(このサンプルコードでは、そのようにストリームまたは何かを閉じないことに注意してください - 。通常のように、適切なのtry/finallyブロックを使用)

+0

こんにちは、ジョン お返事ありがとうございます! あなたの提案で;他の形式でデコードされたmp3データの表現を 'decodedFormat'していますか?私が "din.read()"と書くと、デコードされた形式のデータバイトが得られますか? ありがとうございました – dedalo

+0

はい。その復号化された形式は、「署名したPCMデータとして解読してほしい」と言っています。 –

+0

こんにちは。 私はあなたのアドバイスに従って、それは働いた。データを視覚化するには、 while((numBytesRead = din.read(audioBytes))!= -1){} これは 'din'のバイトを読み取り、配列audioBytesに格納します。私はデータをビジュアル化しようとしました: while((numBytesRead = din.read(audioBytes))!= -1){ System.out.println( "Bytes Decoded value" + audioBytes [0]);} 私はこのデータに関する質問を持っています: すべてのサンプルは16ビットを使用しています、それは配列audioBytes、rigthの2つの位置ですか?どのようにすべてのサンプルの価値を得ることができますか?デコードされたフォーマット(wav)に44のヘッダーバイトがありますか? ご協力いただきありがとうございます! – dedalo

0

したいデータがあります実際のサンプルであり、一方、MP3はデータを別々に表している。だから、他の誰もが言っているように - 目的のためにMP3データを実際のサンプルにデコードするライブラリが必要です。

0

他の回答で述べたように、MP3を通常のオーディオサンプルにデコードするデコーダが必要です。

人気のあるオプションの1つはJavaLayer(LGPL)です。

関連する問題