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


相关文章
|
关系型数据库 MySQL 编译器
DEVC++的C语言连接数据库mysql
DEVC++的C语言连接数据库mysql
820 0
|
开发工具 git
git clone TimeOut 无法下载 git 设置代理
git clone TimeOut 无法下载 git 设置代理
462 0
|
5月前
|
编解码 缓存 Java
Java 高效实现 WAV 音频拼接彻底摆脱 FFmpeg 的轻量本地方案
本文介绍一种纯Java实现的高效WAV音频拼接方案,无需依赖FFmpeg。通过解析WAV文件结构,利用内存映射与流式写入,实现零转码、低CPU占用的高性能拼接,适用于TTS、播客、嵌入式等场景,具备跨平台、易部署、高稳定性的优势。
Java 高效实现 WAV 音频拼接彻底摆脱 FFmpeg 的轻量本地方案
linux实用技巧:cp时自动将软链接所指定的文件实体也一起copy(软链接将会变成目标文件实体)
linux实用技巧:cp时自动将软链接所指定的文件实体也一起copy(软链接将会变成目标文件实体)
linux实用技巧:cp时自动将软链接所指定的文件实体也一起copy(软链接将会变成目标文件实体)
|
机器学习/深度学习 存储 缓存
万物皆Contrastive Learning,从ICLR和NIPS上解读对比学习最新研究进展(二)
万物皆Contrastive Learning,从ICLR和NIPS上解读对比学习最新研究进展(二)
1387 0
万物皆Contrastive Learning,从ICLR和NIPS上解读对比学习最新研究进展(二)
|
网络协议 C# 开发工具
C#中简单Socket编程
1. 先运行服务器代码。服务器将开始监听指定的IP和端口,等待客户端连接。 1. 然后运行客户端代码。客户端将连接到服务器并发送消息。 1. 服务器接收到消息后,将回应客户端,并在控制台上显示接收到的消息。 1. 客户端接收到服务器的回应消息,并在控制台上显示。
826 15
|
Python
Python pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
Python pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
2120 0
|
Web App开发 人工智能 JavaScript
用 Javascript 代码构建语音助手
用 Javascript 代码构建语音助手
424 2
|
测试技术 Python 容器
09 Python之UnitTest【使用,生成HTML测试报告】
09 Python之UnitTest【使用,生成HTML测试报告】
355 0
09 Python之UnitTest【使用,生成HTML测试报告】

热门文章

最新文章

下一篇
开通oss服务