2013-03-05 59 views
0

我音頻小白擡起波文件體積與n音訊

我期待通過將數據作爲一個字符串,如 <音頻SRC =「數據嵌入在HTML頁中的音頻:音頻/ WAV; BASE64 ,AA .....「/> 這樣做的工作,但我需要提高音量。我嘗試過使用NAudio,但它似乎會進行一些轉換,並且不再播放。這是我用來提高音量的代碼:

public string ConvertToString(Stream audioStream) 
{ 
audioStream.Seek(0,SeekOrigin.Begin); 
byte[] bytes = new byte[audioStream.Length]; 
audioStream.Read(bytes,0,(int)audioStream.Length); 
audioStream.Seek(0,SeekOrigin.Begin); 
return Convert.ToBase64String(bytes); 
} 

var fReader = new WaveFileReader(strm); 
var chan32 = new WaveChannel32(fReader,50.0F,0F); 
var ouputString = "data:audio/wav;base64," + ConvertToString(chan32); 

但是當我把outputString放入一個音頻標籤時,它無法播放。 NAudio做了哪些類型的轉換,以及如何讓它獲得音頻流,以便我可以序列化它並讓瀏覽器能夠播放它? 還是其他建議:如果n音訊權重股如調高音量什麼的對我來說是更好的選擇,因爲簡單的東西嗎?

回答

1

我在網頁中嵌入WAV文件沒有專家(和說實話這似乎不是一個好主意 - WAV是將聲音導入網頁的最沒有效率的途徑之一),但我預計包含頭文件的實體WAV文件需要編碼。你只是寫出樣本數據。因此,與n音訊你需要使用WaveFileWriter寫入到MemoryStream或臨時文件,創建一個可以寫入到您的網頁調整體積WAV文件。

有你的代碼的兩個額外的問題。一個是你已經達到32位浮點數,使得WAV文件格式變得更加不合法(原始文件的大小加倍)。在創建WAV文件之前,您需要使用Wave32To16Stream返回到16位。第二是你將每個樣本乘以50.這幾乎肯定會嚴重扭曲信號。放大WAV文件時很容易出現剪切,這取決於原始記錄中有多少空間。通常dynamic range compression比單純增加音量更好。

+0

這不是頭,但你我指出了正確的方向。我看到waveChannel32將編碼更改爲ieeefloat(chrome只支持pcm)。提高音量(或將其轉換回pcm)最簡單的方法是什麼?在這一點上,我不關心表現(儘管我把音量降低到了10)。正如我所說的, – Fragilerus 2013-03-06 00:45:05

+0

,調整音量後使用Wave32To16Stream找回16位PCM。 10仍然會剪輯。 1.0意味着根本不改變樣品的值。 2.0會使它們翻一番。 16位樣本的最大值是32767,所以如果將它們全部乘以10,那麼3277以上的任何值都將被剪切。 – 2013-03-06 08:21:29

+0

這並沒有解決我的問題,但我將其標記爲接受的,因爲有一些很好的意見,並沒有其他人給了一個更好的解決方案。看起來我試圖用一把大錘打破堅果來完成像我這樣的簡單任務。 NAudio是一個功能全面的庫,對於我的需求來說太複雜了。我會找到一個不同的解決方案。 – Fragilerus 2013-03-10 02:10:41