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();
相关实现
本代码已用在了H5录音开源库 Recorder 的裸(RAW、WAV)PCM转WAV播放测试和转码
在线工具中,点此可以在线转换PCM文件。
【完】.
分类:
H5
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述