24位PCM采樣數據轉成16位算法,已實現PCM轉WAV在線工具源碼支持24bits、16bits、8bits


最近收到幾個24位的PCM錄音源文件,Recoder庫原有的PCM轉WAV工具只支持8位和16位,於是就升級一下支持了24位的PCM源文件。

可能是搜索方法不對,搜索了半天沒有找到24位轉成16位的算法,但好在運氣還不錯看到一篇標題不太想關的文章里面有成套的轉換算法。

算法來源

24位PCM轉成32位浮點數參考文章:https://www.codeproject.com/articles/501521/how-to-convert-between-most-audio-formats-in-net 里面的Convert24BitToFloat函數,轉成了32位浮點數就很容易轉成16位或8位了。

js版24位PCM轉8位、16位代碼

var pcm24=... Uint8Array二進制數組 ...;
var pcm16=new Int16Array(pcm24.length/3);
var pcm8=new Uint8Array(pcm24.length/3);

for(var i=0,j=0;j<pcm24.length;i++){
	//24bit pcm轉成浮點數
	var n=((pcm24[j++] | (pcm24[j++]<<8) | (pcm24[j++]<<16))<<8)>>8;
	n=n/16777216;
	
	//浮點數轉成16位
	pcm16[i]=n*0x7FFF;
	
	//浮點數轉成8位
	pcm8[i]=((n*0x7FFF) >> 8) + 128;
};

代碼里面已經實現了24位PCM轉成16位和8位,代碼非常簡單,移植到其他語言也很容易。

js版8位、16位PCM轉成24位

根據上面代碼,做一次逆運算就可以了:

var pcm16=... Int16Array ...;
var pcm24=new Uint8Array(pcm16.length*3);

for(var i=0,j=0;i<pcm16.length;i++){
	var n=pcm16[i] / 0x7FFF * 16777216;
	//var n=((pcm8[i]-128) << 8) / 0x7FFF * 16777216; //8位的多一步先轉成16位

	pcm24[j++]=n & 0xff;
	pcm24[j++]=(n & 0xff00) >> 8;
	pcm24[j++]=(n & 0xff0000) >> 16;
}

附:瀏覽器控制台下載數據文件代碼

var b=new Blob([pcm16]);
var a=document.createElement("a");
a.href=URL.createObjectURL(b)
a.download="test.pcm";
a.click();

相關實現

裸(RAW、WAV)PCM轉WAV播放測試和轉碼.jpg

本代碼已用在了H5錄音開源庫 Recorder裸(RAW、WAV)PCM轉WAV播放測試和轉碼在線工具中,點此可以在線轉換PCM文件。

【完】.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM