pcm转wav的方法及代码示例

简介: pcm转wav的方法及代码示例
<pre class="cpp" name="code">pcm文件转wav文件时,主要是在pcm文件加入wav的头。wav的文件头包含wav标示及解码标示。<p>下面的一段代码为将8k,16bit,PCM(Intel(LSB,MSB)未加压缩的转wav文件。</p>


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
//读文件,返回内存指针,记得free
void* ReadFile(const char *path, unsigned int *len)
{
  FILE *f = fopen(path, "rb");
  if (f == NULL)
    return NULL;
  fseek(f, 0, SEEK_END);
  *len = ftell(f);
  fseek(f, 0, SEEK_SET);
  void *buffer = malloc(*len);
  *len = fread(buffer, 1, *len, f);
  fclose(f);
  return buffer;
}
//pcm转wav,返回wav内存指针和wav长度
void* pcmToWav(const void *pcm, unsigned int pcmlen, unsigned int *wavlen)
{
  //44字节wav头
  void *wav = malloc(pcmlen + 44);
  //wav文件多了44个字节
  *wavlen = pcmlen + 44;
  //添加wav文件头
  memcpy(wav, "RIFF", 4);
  *(int *)((char*)wav + 4) = pcmlen + 36;
  memcpy(((char*)wav + 8), "WAVEfmt ", 8);
  *(int *)((char*)wav + 16) = 16;
  *(short *)((char*)wav + 20) = 1;
  *(short *)((char*)wav + 22) = 1;
  *(int *)((char*)wav + 24) = 8000;
  *(int *)((char*)wav + 28) = 16000;
  *(short *)((char*)wav + 32) = 16 / 8;
  *(short *)((char*)wav + 34) = 16;
  strcpy((char*)((char*)wav + 36), "data");
  *(int *)((char*)wav + 40) = pcmlen;
  //拷贝pcm数据到wav中
  memcpy((char*)wav + 44, pcm, pcmlen);
  return wav;
}
//pcm文件转wav文件,pcmfilePath:pcm文件路劲,wavfilePath:生成的wav路劲
int pcmfileToWavfile(const char *pcmfilePath, const char *wavfilePath)
{
  unsigned int pcmlen;
  //读取文件获得pcm流,也可以从其他方式获得
  void *pcm = ReadFile(pcmfilePath, &pcmlen);
  if (pcm == NULL)
  {
    printf("not found file\n");
    return 1;
  }
  //pcm转wav
  unsigned int wavLen;
  void *wav = pcmToWav(pcm, pcmlen, &wavLen);
  FILE *fwav = fopen(wavfilePath, "wb");
  fwrite(wav, 1, wavLen, fwav);
  fclose(fwav);
  free(pcm);
  free(wav);
  return 0;
}
int main(int argc,char *argv[])
{
  if(argc<3) return 1; 
  if(strstr(argv[1],".pcm")==NULL) return 1;
  if(strstr(argv[2],".wav")==NULL) return 1;
  int ret = pcmfileToWavfile(argv[1],argv[2]);
  if (ret != 0)
  {
    printf("error pcm to wav\n");
  }
  else
  {
    printf("succ");
  }
}


比如将这段代码复制到一个文件中,该文件名字为pcm2wav.cpp。将其编译。


g++ pcm2wav.cpp -o pcm2wav
./pcm2wav /home/20160630102824.pcm  /20160630102824.wav


相关文章
|
4月前
|
人工智能 自然语言处理 网络安全
云上玩转Qwen3系列之四:构建AI Search RAG全栈应用
本文介绍如何利用人工智能平台 PAI-LangStudio、Qwen3 大模型与 AI 搜索开放平台结合 Elasticsearch,构建高效、精准的 AI Search RAG 智能检索应用。通过混合检索技术及 Agentic Workflow 编排,实现自然语言驱动的精准查询,并支持灵活扩展与二次开发,满足多样化场景需求。
209 0
|
前端开发
CSS实现充电效果案例
CSS实现充电效果案例
348 1
|
JSON 前端开发 JavaScript
程序员必知:字符串转换成JSON的三种方式
程序员必知:字符串转换成JSON的三种方式
986 0
|
Python
Python pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
Python pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
1302 0
|
缓存 前端开发 数据安全/隐私保护
【Flutter 前端技术开发专栏】Flutter 中的键盘处理与输入框优化
【4月更文挑战第30天】本文探讨了Flutter中键盘处理与输入框优化的关键技术,包括监听键盘显示隐藏、焦点管理、键盘类型适配、输入框高度自适应、处理键盘遮挡问题及性能优化。通过使用WidgetsBindingObserver、FocusNode和TextInputType等工具,开发者能提升用户体验,确保输入框在各种场景下的良好表现。实例分析和实践建议有助于开发者将这些方法应用于实际项目。
686 0
【Flutter 前端技术开发专栏】Flutter 中的键盘处理与输入框优化
|
前端开发
视觉充电:CSS动画特效,为网站带来动力与活力!(一键复制)
视觉充电:CSS动画特效,为网站带来动力与活力!(一键复制)
|
人工智能 Java 语音技术
开源上新|FunASR离线文件转写GPU软件包1.0
开源上新|FunASR离线文件转写GPU软件包1.0
|
JSON 前端开发 Java
SpringBoot后端接口请求参数映射方式详解
SpringBoot后端接口请求参数映射方式详解
1242 0
|
Web App开发 人工智能 JavaScript
用 Javascript 代码构建语音助手
用 Javascript 代码构建语音助手
329 2
|
测试技术 Python 容器
09 Python之UnitTest【使用,生成HTML测试报告】
09 Python之UnitTest【使用,生成HTML测试报告】
279 0
09 Python之UnitTest【使用,生成HTML测试报告】