首页 > 其他分享 >前端如何将pcm转为wav音频?

前端如何将pcm转为wav音频?

时间:2025-01-07 10:14:43浏览次数:7  
标签:16 音频 pcm wavHeader let PCM wav WAV subChunk2Size

在前端开发中,将PCM数据转换为WAV音频文件,你可以使用JavaScript的库如waveheader.js或自己手动添加WAV头信息到PCM数据前面。WAV文件主要由两部分组成:一个44字节的文件头(WAV header)和原始的PCM数据。

以下是一个简单的步骤说明如何手动将PCM数据转换为WAV文件:

  1. 创建WAV头

WAV头是一个44字节的数据块,它包含了音频文件的元信息,如采样率、位深度、通道数等。以下是一个典型的WAV头结构:

let wavHeader = new Uint8Array([
    85, 84, 70, 32, // "RIFF" chunk descriptor
    0, 0, 0, 0,       // Chunk size (36 + SubChunk2Size), to be filled later
    85, 86, 65, 86,   // "WAVE" format
    // "fmt " sub-chunk (Audio Format)
    102, 109, 116, 32, // Sub-chunk1ID, Contains the letters "fmt " 
    16, 0, 0, 0,        // Sub-chunk1Size = 16 for PCM = 0x10 = 16
    1, 0,                 // AudioFormat = 1 for PCM
    0, 1,                 // NumChannels = 1 for Mono, 2 for Stereo, etc.
    0, 0, 0, 0,         // SampleRate, to be filled later
    0, 0, 0, 0,         // ByteRate = SampleRate * NumChannels * BitsPerSample/8, to be filled later
    0, 0,                 // BlockAlign = NumChannels * BitsPerSample/8
    16, 0,                // BitsPerSample = 16 for PCM
    // "data" sub-chunk (Audio Data)
    100, 97, 116, 97,   // Subchunk2ID, Contains the letters "data"
    0, 0, 0, 0,          // Subchunk2Size = NumSamples * NumChannels * BitsPerSample/8, to be filled later
]);

注意:上述代码中的SampleRate, ByteRate, Subchunk2Size等字段需要根据你的PCM数据来填充。
2. 将PCM数据与WAV头合并

创建了一个包含WAV头的Uint8Array后,你需要将这个头与你的PCM数据合并。这可以通过创建一个新的Uint8Array并将两者连接起来实现。
3. 下载转换后的WAV文件

使用BlobURL.createObjectURL()来创建一个可以下载的链接。例如:

let blob = new Blob([wavHeader, pcmData], { type: 'audio/wav' });
let audioUrl = URL.createObjectURL(blob);
let a = document.createElement('a');
a.href = audioUrl;
a.download = 'output.wav';
a.click();
  1. 注意事项
    • 确保你的PCM数据的采样率、位深度和通道数与WAV头中的信息匹配。
    • 如果你的PCM数据是浮点数,确保在合并之前将其转换为整数(通常是16位)。
    • 考虑到跨浏览器兼容性和文件大小,通常使用16位PCM数据是一个好选择。
  2. 使用库

如果你不想手动处理WAV头,可以使用像waveheader.js这样的库来简化过程。这些库通常提供了更简洁的方法来将PCM数据封装为WAV文件。
6. 示例

为了完整性,这里是一个简单的示例,说明如何将PCM数据与WAV头合并并下载:

// 假设 pcmData 是一个包含PCM数据的 Uint8Array
let sampleRate = 44100; // 例如
let numChannels = 1; // 单声道,立体声则为2
let bitsPerSample = 16; // 16位PCM

// 填充WAV头中的相关字段
wavHeader[28] = (sampleRate & 0xff00) >> 8;
wavHeader[29] = (sampleRate & 0x00ff);
wavHeader[30] = ((sampleRate & 0xff0000) >> 16);
wavHeader[31] = ((sampleRate & 0x00ff00) >> 8);

let byteRate = sampleRate * numChannels * (bitsPerSample / 8);
wavHeader[32] = (byteRate & 0xff00) >> 8;
wavHeader[33] = (byteRate & 0x00ff);
wavHeader[34] = ((byteRate & 0xff0000) >> 16);
wavHeader[35] = ((byteRate & 0x00ff00) >> 8);

let subChunk2Size = pcmData.length;
wavHeader[40] = (subChunk2Size & 0xff000000) >> 24;
wavHeader[41] = (subChunk2Size & 0x00ff0000) >> 16;
wavHeader[42] = (subChunk2Size & 0x0000ff00) >> 8;
wavHeader[43] = (subChunk2Size & 0x000000ff);

// RIFF chunk size (excluding the first 8 bytes of RIFF chunk descriptor)
let chunkSize = 36 + subChunk2Size;
wavHeader[4] = (chunkSize & 0xff000000) >> 24;
wavHeader[5] = (chunkSize & 0x00ff0000) >> 16;
wavHeader[6] = (chunkSize & 0x0000ff00) >> 8;
wavHeader[7] = (chunkSize & 0x000000ff);

// 合并WAV头和PCM数据
let wavBlob = new Blob([wavHeader, pcmData], { type: 'audio/wav' });
let wavUrl = URL.createObjectURL(wavBlob);
let downloadLink = document.createElement('a');
downloadLink.href = wavUrl;
downloadLink.download = 'output.wav';
downloadLink.click();

请根据你的具体需求调整上述代码。

标签:16,音频,pcm,wavHeader,let,PCM,wav,WAV,subChunk2Size
From: https://www.cnblogs.com/ai888/p/18656981

相关文章

  • WebAudioContext.createPeriodicWave
    PeriodicWaveNodeWebAudioContext.createPeriodicWave(Float32Arrayreal,Float32Arrayimag,objectconstraints)小程序插件:不支持功能描述创建一个PeriodicWaveNode参数Float32Arrayreal一系列余弦术语(传统上的A项)Float32Arrayimag一系列正弦项(传统上的B项)o......
  • 解决系统提示wavemsp.dll找不到丢失问题
    在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包文件不完整造成,原因可能是某些系统防护软件将重要的DLL文件识别为可疑,阻止并放入了隔离单里,还有一些常见的DLL文件缺少是因为系统没有安装齐全的微软运行库,还有部分情况是因为......
  • a16z:小模型 + 边缘 AI 将定义 2025;音效模型 TangoFlux:3 秒钟生成 30 秒音频丨RTE 开发
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑......
  • 应用于电视TV及音频领域中的模拟类音频功放IC
    iML6602是一款高性能、高效率的国产-双声道模拟类音频功放,支持BTL和PBTL两种模式输出;工作电压范围:4.5V至26V;在供电电压为24V负载8Ω的情况下,BTL模式可输出2X30W的连续功率;PBTL模式下,可输出60W(负载4Ω)的连续功率;芯片主从模式设置可以实现无限级联,从而实现系统的多路输出;无需散......
  • 又发现一个分析网站的工具:SEOWAVE
    SEOWAVE使用方法:访问网站seowave.org,输入要分析的网站的域名,比如:CheckNumber.AI,再点击按钮“REVIEW”,如下图所示:接下来会跳转到分析页面:https://www.seowave.org/domain/checknumber.ai/zklw67764ea90e277进度条开始显示网站的分析进度(不过我感觉他这个进度数字是假的,一......
  • ALC5651休眠唤醒音频失效问题
    问题描述:用的是ALC5651的codec,测试偶发主板休眠唤醒之后,录音和喇叭播放声音都失效了。再重启,发现就能恢复正常。 问题分析:涉及到休眠唤醒后之类出现的问题,一般都是往休眠过程供电掉电、寄存器复位等方面去排查。 问题原因:codec供电接的是vcc_1v8_s0和vcc_3v3_s0,深度睡眠会掉......
  • video-analyzer:开源视频分析工具,支持提取视频关键帧、音频转录,自动生成视频详细描述
    ❤️如果你也关注AI的发展现状,且对AI应用开发非常感兴趣,我会每日跟你分享最新的AI资讯和开源应用,也会不定期分享自己的想法和开源实例,欢迎关注我哦!......
  • SpringAI人工智能开发框架005---SpringAI文本转语音_语音转文本_音频翻译程序接口编写
    可以看到SpringAi中关于音频的API帮助文档可以去看一下.可以看到帮助文档.这部分功能就是把声音变成文本,以及把文本变成声音.去创建一个项目然后修改一下,仓库,引入sringai的仓库 然后指定一下版本,这里要用java17的版本.然后这里用的api-key这个key,这里配置......
  • 24-12-28-pytorch深度学习中音频I/O 中遇到的问题汇总
    文章目录pytorch深度学习中音频I/O中遇到的问题汇总问题1:音频文件格式的读取问题问题2:音频文件绘图问题小结pytorch深度学习中音频I/O中遇到的问题汇总问题1:音频文件格式的读取问题参考链接:torchaudio加载wav报错Couldn‘tfindappropriatebackendtohandle......
  • HTML5的音频录制和播放
    背景公司内部需要利用第三方接口实现tts和stt的功能,就涉及到了音频的录制和播放,所以就看了一下最新的音频api,实现了一个简单的。实现import{useEffect,useMemo,useState}from"react";exporttypeRecorderParam={onEnd:(chunks:Blob[])=>void;onSpeakCh......