保存音頻的byte []一直有一個有點麻煩,在過去的幾天裏試圖得到這個工作。但我想要的是我們有一個通過網絡發送原始數據的應用程序。然後我讀入這個二進制數據並且想把它保存到一個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。運行代碼後,您可以簡單比較兩個波形文件。如果不一樣,那麼代碼不好,或者你需要了解波形格式。 –
AudioInputStream構造函數中的'length'參數應該是幀長度值而不是數據長度。 '幀長度=數據長度/信道/樣本大小的功能於byte' –