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 (*. ...
随机推荐
- CF 103E Buying Sets 最大权闭合子图,匹配 难度:4
http://codeforces.com/problemset/problem/103/E 这道题首先一看就很像是最大权闭合子图,但是我们可以认为现在有两种点,数字和集合点,我们需要消除数字点的影响 ...
- Python中通过多个字符分割(split)字符串的方法
python中字符串自带的split方法一次只能使用一个字符对字符串进行分割,但是python的正则模块则可以实现多个字符分割 import re re.split('-|_','sharejs_ha ...
- Android 获取网络状态
1.检测网络是否可用 public boolean isNetWorkConnected() { ConnectivityManager cm = (ConnectivityManager)getSy ...
- Javascript之clipBoard操作
1.clipBoard 是网页上剪贴板,可以获取剪切板上值,可能类似物键-值对这种模式取值\赋值,如果在copy网上的某篇博客时,往往会带有“转载自xxxx地方 http://www.xxx.com/ ...
- 关于$.getJson
这是一个Ajax函数的缩写,这相当于: 1 2 3 4 5 6 $.ajax({ dataType: "json", url: url, data: data, success: ...
- POJ 1185 炮兵阵地(经典的状态压缩DP)
题意:中文题. 思路,经典的状态压缩题目. 由于列长比较小,我们可以以行为阶段用状态压缩来做. 由于攻击只占两个格,这样从行的角度看,第i行的炮兵只与前i-1和前i-2行有关系.这样如果用j,k,l分 ...
- (转)javascript中event对象详解
原文:http://jiajiale.iteye.com/blog/195906 javascript中event对象详解 博客分类: javaScript JavaScriptCS ...
- Ubuntu安装Osmocom-BB一只猿多频点WEB脚本
LAMP(Linux- Apache-MySQL-PHP)网站架构是目前国际流行的Web框架,该框架包括:Linux操作系统,Apache网络服务器,MySQL数据 库,Perl.PHP或者Pytho ...
- 详解定位—>"position"
position是css中一个重要的属性,他规定元素的定位类型,默认值为static,他的值有5种,absolute,fixed,relative,static,inherit.接下来将详细具体对每一 ...
- N的阶乘的长度
阶乘是乘法 , 乘法的话 , 几位数*几位数的位数 就是 哪两个几位数相加 . 这个可以用log10来解决 , 所以有如下代码 . #include<stdio.h> #include& ...