分享

pcm转wav的方法及代码示例

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

  1.    
  1.    
  1.    
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.   
  5. using namespace std;  
  6. //读文件,返回内存指针,记得free  
  7. void* ReadFile(const char *path, unsigned int *len)  
  8. {  
  9.     FILE *f = fopen(path, "rb");  
  10.     if (f == NULL)  
  11.         return NULL;  
  12.     fseek(f, 0, SEEK_END);  
  13.     *len = ftell(f);  
  14.     fseek(f, 0, SEEK_SET);  
  15.     void *buffer = malloc(*len);  
  16.     *len = fread(buffer, 1, *len, f);  
  17.     fclose(f);  
  18.     return buffer;  
  19. }  
  20.   
  21. //pcm转wav,返回wav内存指针和wav长度  
  22. void* pcmToWav(const void *pcm, unsigned int pcmlen, unsigned int *wavlen)  
  23. {  
  24.     //44字节wav头  
  25.     void *wav = malloc(pcmlen + 44);  
  26.     //wav文件多了44个字节  
  27.     *wavlen = pcmlen + 44;  
  28.     //添加wav文件头  
  29.     memcpy(wav, "RIFF", 4);  
  30.     *(int *)((char*)wav + 4) = pcmlen + 36;  
  31.     memcpy(((char*)wav + 8), "WAVEfmt ", 8);  
  32.     *(int *)((char*)wav + 16) = 16;  
  33.     *(short *)((char*)wav + 20) = 1;  
  34.     *(short *)((char*)wav + 22) = 1;  
  35.     *(int *)((char*)wav + 24) = 8000;  
  36.     *(int *)((char*)wav + 28) = 16000;  
  37.     *(short *)((char*)wav + 32) = 16 / 8;  
  38.     *(short *)((char*)wav + 34) = 16;  
  39.     strcpy((char*)((char*)wav + 36), "data");  
  40.     *(int *)((char*)wav + 40) = pcmlen;  
  41.   
  42.     //拷贝pcm数据到wav中  
  43.     memcpy((char*)wav + 44, pcm, pcmlen);  
  44.     return wav;  
  45. }  
  46.   
  47. //pcm文件转wav文件,pcmfilePath:pcm文件路劲,wavfilePath:生成的wav路劲  
  48. int pcmfileToWavfile(const char *pcmfilePath, const char *wavfilePath)  
  49. {  
  50.     unsigned int pcmlen;  
  51.     //读取文件获得pcm流,也可以从其他方式获得  
  52.     void *pcm = ReadFile(pcmfilePath, &pcmlen);  
  53.     if (pcm == NULL)  
  54.     {  
  55.         printf("not found file\n");  
  56.         return 1;  
  57.     }  
  58.   
  59.     //pcm转wav  
  60.     unsigned int wavLen;  
  61.     void *wav = pcmToWav(pcm, pcmlen, &wavLen);  
  62.   
  63.     FILE *fwav = fopen(wavfilePath, "wb");  
  64.     fwrite(wav, 1, wavLen, fwav);  
  65.     fclose(fwav);  
  66.     free(pcm);  
  67.     free(wav);  
  68.     return 0;  
  69. }  
  70.   
  71. int main(int argc,char *argv[])  
  72. {  
  73.     if(argc<3) return 1;   
  74.     if(strstr(argv[1],".pcm")==NULL) return 1;  
  75.     if(strstr(argv[2],".wav")==NULL) return 1;  
  76.     int ret = pcmfileToWavfile(argv[1],argv[2]);  
  77.     if (ret != 0)  
  78.     {  
  79.         printf("error pcm to wav\n");  
  80.     }  
  81.     else  
  82.     {  
  83.         printf("succ");  
  84.     }  
  85. }  


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

g++ pcm2wav.cpp -o pcm2wav

./pcm2wav /home/20160630102824.pcm  /20160630102824.wav


 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多