zoukankan      html  css  js  c++  java
  • WebRTC录音(2)-录音文件转换成WAV格式

    以下是源码,大路货,从网上找的.

    但是,这个东西在MacOS上是有问题的,原因在最后,都是泪啊.

      1 #include <stdio.h>
      2 #include <string.h>
      3 
      4 //wav头的结构如下所示:  
      5 typedef   struct   {  
      6     char         fccID[4];        
      7     unsigned   long       dwSize;            
      8     char         fccType[4];    
      9 }HEADER;  
     10 
     11 typedef   struct   {  
     12     char         fccID[4];        
     13     unsigned   long       dwSize;            
     14     unsigned   short     wFormatTag;    
     15     unsigned   short     wChannels;  
     16     unsigned   long       dwSamplesPerSec;  
     17     unsigned   long       dwAvgBytesPerSec;  
     18     unsigned   short     wBlockAlign;  
     19     unsigned   short     uiBitsPerSample;  
     20 }FMT;  
     21 
     22 typedef   struct   {  
     23     char         fccID[4];          
     24     unsigned   long       dwSize;              
     25 }DATA;  
     26 
     27 void show_usage()
     28 {
     29     printf("PCM 2 WAV usage
     eg:pcm2wav pcm_file wav_file channels sample_rate bits
    ");
     30 }
     31 
     32 int main(int argc, char **argv)
     33 {
     34     char src_file[128] = {0};
     35     char dst_file[128] = {0};
     36     int channels = 1;
     37     int bits = 16;
     38     int sample_rate = 22050;
     39 
     40     //以下是为了建立.wav头而准备的变量  
     41     HEADER   pcmHEADER;  
     42     FMT   pcmFMT;  
     43     DATA   pcmDATA;  
     44  
     45     unsigned   short   m_pcmData;
     46     FILE   *fp,*fpCpy;  
     47 
     48     if (argc < 5)
     49     {
     50         show_usage();
     51         return -1;
     52     }
     53     sscanf(argv[1], "%s", src_file);
     54     sscanf(argv[2], "%s", dst_file);
     55     sscanf(argv[3], "%d", &channels);
     56     sscanf(argv[4], "%d", &sample_rate);
     57     if (argc>6)
     58     {
     59         sscanf(argv[5], "%d", &bits);
     60     }
     61 
     62     printf("parameter analyse succeess
    ");
     63 
     64     if((fp=fopen(src_file,   "rb"))   ==   NULL) //读取文件  
     65     {  
     66         printf("open pcm file %s error
    ", argv[1]);
     67         return -1;  
     68     }
     69 
     70     if((fpCpy=fopen(dst_file,   "wb+"))   ==   NULL) //为转换建立一个新文件  
     71     {    
     72         printf("create wav file error
    ");  
     73         return -1;
     74     }        
     75 
     76     //以下是创建wav头的HEADER;但.dwsize未定,因为不知道Data的长度。  
     77     strcpy(pcmHEADER.fccID,"RIFF");                    
     78     strcpy(pcmHEADER.fccType,"WAVE");  
     79     fseek(fpCpy,sizeof(HEADER),1); //跳过HEADER的长度,以便下面继续写入wav文件的数据;
     80 
     81     //以上是创建wav头的HEADER;  
     82     if(ferror(fpCpy))  
     83     {    
     84         printf("error
    ");  
     85     }  
     86     //以下是创建wav头的FMT;  
     87     pcmFMT.dwSamplesPerSec=sample_rate;  
     88     pcmFMT.dwAvgBytesPerSec=pcmFMT.dwSamplesPerSec*sizeof(m_pcmData);  
     89     pcmFMT.uiBitsPerSample=bits;  
     90 
     91     strcpy(pcmFMT.fccID,"fmt   ");  
     92     pcmFMT.dwSize=16;  
     93     pcmFMT.wBlockAlign=2;  
     94     pcmFMT.wChannels=channels;  
     95     pcmFMT.wFormatTag=1;  
     96     //以上是创建wav头的FMT;    
     97 
     98     fwrite(&pcmFMT,sizeof(FMT),1,fpCpy); //将FMT写入.wav文件;  
     99     //以下是创建wav头的DATA;   但由于DATA.dwsize未知所以不能写入.wav文件  
    100     strcpy(pcmDATA.fccID,"data");  
    101 
    102     pcmDATA.dwSize=0; //给pcmDATA.dwsize   0以便于下面给它赋值  
    103     fseek(fpCpy,sizeof(DATA),1); //跳过DATA的长度,以便以后再写入wav头的DATA;  
    104     fread(&m_pcmData,sizeof(unsigned   short),1,fp); //从.pcm中读入数据  
    105 
    106     while(!feof(fp)) //在.pcm文件结束前将他的数据转化并赋给.wav;  
    107     {  
    108 
    109         pcmDATA.dwSize+=2; //计算数据的长度;每读入一个数据,长度就加一;  
    110 
    111         fwrite(&m_pcmData,sizeof(unsigned   short),1,fpCpy); //将数据写入.wav文件;  
    112         fread(&m_pcmData,sizeof(unsigned   short),1,fp); //从.pcm中读入数据  
    113     }  
    114 
    115     fclose(fp); //关闭文件  
    116     pcmHEADER.dwSize=44+pcmDATA.dwSize;   //根据pcmDATA.dwsize得出pcmHEADER.dwsize的值  
    117 
    118     rewind(fpCpy); //将fpCpy变为.wav的头,以便于写入HEADER和DATA;  
    119     fwrite(&pcmHEADER,sizeof(HEADER),1,fpCpy); //写入HEADER  
    120     fseek(fpCpy,sizeof(FMT),1); //跳过FMT,因为FMT已经写入  
    121     fwrite(&pcmDATA,sizeof(DATA),1,fpCpy);   //写入DATA;  
    122 
    123     fclose(fpCpy);   //关闭文件  
    124 
    125     return 0;
    126 }

    说下被卡了几天的原因:64位.MacOS是64位的,结果我的Win7是64位的,另外找的一个CentOS也是64位的,就没往这上边想,看来真老了.

    记住把操作函数里的strcpy改掉都.

    下一篇---->WebRTC录音(3)-录音音质优化及编码设置

     
     
    转载请注明出处. 写博客的目的:记录,升华,量变到质变
  • 相关阅读:
    IBM Personal Communications 软件:精简绿色版TN3270终端模拟器:经测试可以在 (winxp、win2003、win764)上运行
    virtualbox谨记:续....
    Eclipse连接MySQL数据库
    shell几种字符串加密解密的方法
    表达式语言引擎:Apache Commons JEXL 2.1 发布
    一种表达式语言的解析引擎JEXL简单使用
    Java 实现String语句的执行(Jexl)
    JUnit4
    EL表达式
    Looping through the content of a file in Bash
  • 原文地址:https://www.cnblogs.com/decwang/p/3914007.html
Copyright © 2011-2022 走看看