これを動作させようと数日間問題が発生しました。しかし私が望むのは、ネットワーク上で生データを送信するアプリケーションがあるということです。私はこのバイナリデータを読み込んで、それをwav(任意のオーディオ)ファイルに保存します。後で圧縮を見るかもしれない。オーディオバイト[]をwavファイルに保存
だから、問題のあるコード:
byte[] allBytes = ...
InputStream b_in = new ByteArrayInputStream(allBytes);
try
{
AudioFormat format = new AudioFormat(8000f, 16, 1, true, true);
AudioInputStream stream = new AudioInputStream(b_in, format, allBytes.length);
//AudioInputStream stream = AudioSystem.getAudioInputStream(b_in);
は、同様に上記のステートメントを使用しようとしましたが、私は例外を取得:javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from stream
を。だから私の考えは、私のストリームは生のオーディオデータであり、これは例外をスローしているウェーブヘッダを持たないからです。
File newPath = new File(SystemConfiguration.getLatest().voiceNetworkPathDirectory + currentPhoneCall.fileName);
if (!AudioSystem.isFileTypeSupported(Type.WAVE, stream))
{
Logger.error("Audio System file type not supported");
}
AudioSystem.write(stream, Type.WAVE, newPath);
ファイルが正常に書くんが、それはすべて静的ですが、私はthisのようなものを使用して、出力の波ヘッダーを作成する必要があります。メモ帳で出力されたwavファイルを見ると、「RIFF」で始まるヘッダーがあるようです。
入力ストリームに偽のヘッダーを追加する必要がありますか?私は自分の出力ヘッダーを作成してバイナリライターで保存するだけですか?
あなたの投稿に何か問題があります。データ/書式が欠落しています。 – user845279
他の有効なWAVEファイルと比較するとどうですか?それらのいずれかを選択すると、ヘッダーの後にデータをコピーし、生データを配列allBytesにコードに置きます。コードを実行したら、2つのwaveファイルを単純に比較できます。それが同じでない場合、いずれかのコードが悪いか、波のフォーマットのベライターを理解する必要があります。 –
'AudioInputStream'のコンストラクタの' length'引数は、データ長ではなくフレーム長の値でなければなりません。 'frame-length = data-length/channel/sample-size-in-byte' –