繼前一篇 [JavaScript]如何在mp3檔案上傳到後端Server前,由前端獲取相關檔案資訊
現在我們聊到上傳Wave的問題,線上音樂現在有標榜上傳48KHz/24bit,
這樣是高品質音樂,高聆聽享受,
而現在唱片製作最少也都是這樣的格式以上,
至於說要用多高規的格式,是不是就是好事,這不再這篇文章的討論範圍,
如果我們有一個網站,要讓使用者上傳44.1kHz/16bit的Wave檔,
這異樣一首歌可通常都是50M左右,
等使用者傳到後端Server再來回報格式是否合乎需求,
或者有些程式設計師會說,反正就等使用者上傳後,
後台要轉檔時再來判斷上傳的格式,再來轉換成網站或是App需要的格式,
對於一個程式設計師,轉音檔有很多plug-in可以用,引用元件像是N-Audio,
要甚麼格式都可以轉出來,沒錯,轉換出來的格式是對了,
但是為什麼Protools聲音就是硬生生地比其他軟體好,
是演算法!!
還有不管是升降格式,Dithering..是轉換聲音檔規格的一個很重要的關鍵,
這個技術我想去上網下載個免費的plug-in來跟數萬元的錄音軟體
甚或是那種用硬體的來轉,這樣的差別有多少,
我想也應該不是有很多人知道wave轉mp3的過程,
必須要先把wave轉成44.1KHz/16bit才能進行轉mp3,
至於為什麼?那個轉換的演算法就是這樣,(這邊我研究有錯歡迎指正)
好,回到正題,
為了要節省頻寬,在上傳到Server前就先檢驗格式,
一樣我們得用到HTML5以及localstorage,
我查詢過很多技術網站都找不到相關的解答,
講難聽點,一大堆牛鬼蛇神的解法,有一大方面是這需求很冷門,
看過一大堆甚麼數學公式甚麼一大堆的,
最後我在維基百科找到答案,
所有的資訊都在檔頭,還需要計算甚麼嗎?也許mp3檔案也是這樣吧?
所以採用bytes陣列方式來處理!!
$("#file").change(function(e){ var myfile = e.currentTarget.files[0]; var fileurl = URL.createObjectURL(myfile); $("#filetype").text(myfile.type); //檔案型態 audio/wav $("#filesize").text(myfile.size); //檔案大小 $("#audio").prop("src", fileurl); var reader = new FileReader(); var blob = myfile.slice(0, 44); //讀取0到43位元組的資料,因為之後是音頻資料,我們只讀檔案資訊,不讀取檔案音頻內容 reader.readAsArrayBuffer(blob); reader.onloadend = function(evt) { if (evt.target.readyState == FileReader.DONE) { // DONE == 2 var chars = new Int16Array(evt.target.result);
// 這邊開始請使用 chars[xx] 依照規格表來確認檔案格式
});
最後還是一句話,音頻轉檔,請交由專業的程式來處理,
光是Dithering這件事情,我早就放棄了.