WebRTC录音(2)-录音文件转换成WAV格式
以下是源码,大路货,从网上找的.
但是,这个东西在MacOS上是有问题的,原因在最后,都是泪啊.
#include <stdio.h>
#include <string.h> //wav头的结构如下所示:
typedef struct {
char fccID[];
unsigned long dwSize;
char fccType[];
}HEADER; typedef struct {
char fccID[];
unsigned long dwSize;
unsigned short wFormatTag;
unsigned short wChannels;
unsigned long dwSamplesPerSec;
unsigned long dwAvgBytesPerSec;
unsigned short wBlockAlign;
unsigned short uiBitsPerSample;
}FMT; typedef struct {
char fccID[];
unsigned long dwSize;
}DATA; void show_usage()
{
printf("PCM 2 WAV usage\n eg:pcm2wav pcm_file wav_file channels sample_rate bits\n");
} int main(int argc, char **argv)
{
char src_file[] = {};
char dst_file[] = {};
int channels = ;
int bits = ;
int sample_rate = ; //以下是为了建立.wav头而准备的变量
HEADER pcmHEADER;
FMT pcmFMT;
DATA pcmDATA; unsigned short m_pcmData;
FILE *fp,*fpCpy; if (argc < )
{
show_usage();
return -;
}
sscanf(argv[], "%s", src_file);
sscanf(argv[], "%s", dst_file);
sscanf(argv[], "%d", &channels);
sscanf(argv[], "%d", &sample_rate);
if (argc>)
{
sscanf(argv[], "%d", &bits);
} printf("parameter analyse succeess\n"); if((fp=fopen(src_file, "rb")) == NULL) //读取文件
{
printf("open pcm file %s error\n", argv[]);
return -;
} if((fpCpy=fopen(dst_file, "wb+")) == NULL) //为转换建立一个新文件
{
printf("create wav file error\n");
return -;
} //以下是创建wav头的HEADER;但.dwsize未定,因为不知道Data的长度。
strcpy(pcmHEADER.fccID,"RIFF");
strcpy(pcmHEADER.fccType,"WAVE");
fseek(fpCpy,sizeof(HEADER),); //跳过HEADER的长度,以便下面继续写入wav文件的数据; //以上是创建wav头的HEADER;
if(ferror(fpCpy))
{
printf("error\n");
}
//以下是创建wav头的FMT;
pcmFMT.dwSamplesPerSec=sample_rate;
pcmFMT.dwAvgBytesPerSec=pcmFMT.dwSamplesPerSec*sizeof(m_pcmData);
pcmFMT.uiBitsPerSample=bits; strcpy(pcmFMT.fccID,"fmt ");
pcmFMT.dwSize=;
pcmFMT.wBlockAlign=;
pcmFMT.wChannels=channels;
pcmFMT.wFormatTag=;
//以上是创建wav头的FMT; fwrite(&pcmFMT,sizeof(FMT),,fpCpy); //将FMT写入.wav文件;
//以下是创建wav头的DATA; 但由于DATA.dwsize未知所以不能写入.wav文件
strcpy(pcmDATA.fccID,"data"); pcmDATA.dwSize=; //给pcmDATA.dwsize 0以便于下面给它赋值
fseek(fpCpy,sizeof(DATA),); //跳过DATA的长度,以便以后再写入wav头的DATA;
fread(&m_pcmData,sizeof(unsigned short),,fp); //从.pcm中读入数据 while(!feof(fp)) //在.pcm文件结束前将他的数据转化并赋给.wav;
{ pcmDATA.dwSize+=; //计算数据的长度;每读入一个数据,长度就加一; fwrite(&m_pcmData,sizeof(unsigned short),,fpCpy); //将数据写入.wav文件;
fread(&m_pcmData,sizeof(unsigned short),,fp); //从.pcm中读入数据
} fclose(fp); //关闭文件
pcmHEADER.dwSize=+pcmDATA.dwSize; //根据pcmDATA.dwsize得出pcmHEADER.dwsize的值 rewind(fpCpy); //将fpCpy变为.wav的头,以便于写入HEADER和DATA;
fwrite(&pcmHEADER,sizeof(HEADER),,fpCpy); //写入HEADER
fseek(fpCpy,sizeof(FMT),); //跳过FMT,因为FMT已经写入
fwrite(&pcmDATA,sizeof(DATA),,fpCpy); //写入DATA; fclose(fpCpy); //关闭文件 return ;
}
说下被卡了几天的原因:64位.MacOS是64位的,结果我的Win7是64位的,另外找的一个CentOS也是64位的,就没往这上边想,看来真老了.
记住把操作函数里的strcpy改掉都.
下一篇---->WebRTC录音(3)-录音音质优化及编码设置
WebRTC录音(2)-录音文件转换成WAV格式的更多相关文章
- Python:将utf-8格式的文件转换成gbk格式的文件
需求:将utf-8格式的文件转换成gbk格式的文件 实现代码如下: def ReadFile(filePath,encoding="utf-8"): with codecs.ope ...
- dvi文件和将dvi文件转换成pdf格式
dvi文件和将dvi文件转换成pdf格式 Latex只能把tex文件编译成dvi文件, 在cmd 中: 使用xdvi查看dvi格式的文件 若用texstudio编辑tex文件,则可直接将已编译成功的. ...
- 将文本(lrc,txt)文件转换成UTF-8格式
UTF-8是UNICODE的一种变长字符编码又称万国码,由Ken Thompson于1992年创建.现在已经标准化为RFC 3629.UTF-8用1到6个字节编码UNICODE字符.用在网页上可以同一 ...
- 如何将.crt的ssl证书文件转换成.pem格式
如何将.crt的ssl证书文件转换成.pem格式 摘自:https://www.landui.com/help/show-8127 2018-07-04 14:55:41 2158次 准备:有一台安装 ...
- .net amr格式文件转换成mp3格式文件的方法
前言:winform端对于音频文件的格式多有限制,大多数不支持amr格式的文件的播放.但是,手机端传过来的音频文件大多数是amr格式的文件,所以,要想在winform客户端支持音频文件的播放,可以通过 ...
- C# Tips: 将 VS2012 / VS2013 的.sln文件、project文件转换成 VS2010格式
原来有一些VS2013的工程文件(.sln..csproj),使用.Net 4.0.现需要将它们转换成VS2010格式. 经实验,办法如下: (1) 在Solution文件(.sln)中: 把文件头部 ...
- C#:将.csv格式文件转换成.xlsx格式文件
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 【转】java将excel文件转换成txt格式文件
在实际应用中,我们难免会遇到解析excel文件入库事情,有时候为了方便,需要将excel文件转成txt格式文件.下面代码里面提供对xls.xlsx两种格式的excel文件解析,并写入到一个新的txt文 ...
- 实现同时将一批.bmp文件转换成.mat格式
%% 功能:实现同时对一批.bmp文件的转换成.mat格式PicFormat = {'*.bmp','Bitmap image (*.bmp)';... '*.jpg','JPEG image (*. ...
随机推荐
- Codeforces Round #257 (Div. 1) (Codeforces 449B)
题意:给力一张无向图,有一些边是正常道路,有一些边是铁路,问最多能删除几条铁路使得所有点到首都(编号为1)的最短路长度不变. 思路:求不能删除的铁路数,总数减掉就是答案.先求出首都到所有点的最短路,求 ...
- 使用WBI SAP Adapter 实现IDoc的同步处理(转)
1. 应用背景 某汽车制造企业(以下称为厂商A)与其仓储系统提供商(以下称为厂商B)需要进行数据交换.汽车厂商A使用SAP系统作ERP管理,所有数据都要进入SAP进行处理,仓储系统提供商使用的是自有的 ...
- 【STL】-迭代器的用法
初始化: list<char>::iterator pos; 算法: 1. 遍历 for(pos = col1.begin(); pos != col1.end(); ++pos){... ...
- C++-前缀和后缀
1,c++规定后缀形式的++操作符有一个int行的参数,被调用时,编译器自动加一个0作为参数给他 2,前缀返回一个reference,后缀返回一个const对象 /////////////////// ...
- OpenCV之响应鼠标(二):函数cvSetMouseCallback()和其副程式onMouse()的使用(OpenCV2.4.5)
每當滑鼠在視訊視窗介面點擊一下的時候,都會有固定三個動作 1.點擊(Click) 2.放開(Down)3.滑動(move) 因此,程式執行滑鼠在點擊的時候onMouse()都會連續跑三次,代表滑鼠在點 ...
- 一道面试题,简单模拟spring ioc
自己实现的,程序写的土了点,很多情况没去考虑,主要是复习理解怎么使用反射来实现spring 的依赖注入. package dom4jtest; import java.lang.reflect.Inv ...
- (五)CoreData 使用 (转)
第一次真正的使用CoreData,因此也会写下体会和心得...等有时间 Core Data数据持久化是对SQLite的一个升级,它是ios集成的,在说Core Data之前,我们先说说在CoreDat ...
- Javascript基础--成员函数(六)
成员函数:也叫方法 1.常用方法 比如:我们希望对象不但有属性,还希望他有行为.(行为在程序中要靠函数来体现)(1) 添加speak函数,输出我是一个好人 (2) 添加jisuan函数,可以计算从1+ ...
- iOS7中计算UILabel中字符串的高度
iOS7中计算UILabel中字符串的高度 iOS7中出现了新的方法计算UILabel中根据给定的Font以及str计算UILabel的frameSize的方法.本人提供category如下: UIL ...
- lightoj1082 线段树
//Accepted 5596 KB 396 ms //线段树求区间最小值 #include <cstdio> #include <cstring> #include < ...