2012-03-19 25 views
0

.wavファイルをソケット配列を介して送信されるバイト配列に読み込み、反対側で再生しようとしています。ファイルのヘッダーデータが読み込まれると問題が発生します。ファイルの残りの部分は単にバイト配列を0で埋めています。サンプルコードは次のとおりです。私は他のアプローチのいくつかを試してみましたが、すべて同じ結果をもたらします。.wavファイルをJavaのバイト配列に読み込む

File audioIn = new File("assets/file.wav"); 
byte [] byteArray = new byte[filesize]; 
FileInputStream fileInStream = new FileInputStream(audioIn); 
fileInStream.read(byteArray); 

個々のバイトから取得したデバッグデータです。ヘッダー情報は、Javaメソッドが以前に抽出したものに対応しています。私が読んだことから、サウンドデータはバイト[44]で始まるはずですが、私は以下の結果を得ています。残りの配列は0で埋められます。

Byte 0: 82 
Byte 1: 73 
Byte 2: 70 
Byte 3: 70 
... 
Byte 41: 97 
Byte 42: 0 
Byte 43: -68 
Byte 44: -1 
Byte 45: 1 
Byte 46: 0 
Byte 47: 0 
... 

WAVE情報があらかじめ送信されるため、ヘッダーデータはここで破棄されます。あなたの助けを前にありがとう。

+0

上記のバイトは 'file.wave'の内容と一致しますか?確認するには、16進法ビューア(Unix/Linux/OSXでは 'od -h')を使用します。 –

+0

1)ファイル全体を送信します(先頭の余分な44バイトはほとんど違いがありません)2多くのサウンドサンプルは、通常の音量まで構築する前に「0音量」で始まることを認識しています。 –

答えて

3

FileInputStream.readは、データでバイト配列を埋めません。一度に読むことができるものだけが読み込まれます。あなたはすべてを読むためにそれをループで呼び出さなければなりません。

また、DataInputStream.readFullyメソッドを使用することもできます。 Java 7を使用している場合は、Files.readAllBytesを使用できます。

1

また、Apache/Commons IOライブラリをチェックアウトすることもできます。ファイル全体をバイト配列に読み込んだり、入力/出力定型文を閉じるなどの一般的なI/Oタスクを処理するのに便利です。

関連する問題