PCM文件添加WAV头


在asr平台实现pcm格式录制的文件增加wav头,发现根据网上给的方法添加wav头的wav文件播放异常,播放没有声音!


后来发现问题出现在下面几个地方的问题:

1、samplerate和bitrate转换不正确;

    int bit_rate = sample_rate * channels * bits;//(sample_rate * channels * bits)/8;

2、文件总大小填的不正确;

pcm数据大小+44 - 8 = PCM数据大小+36

    int file_size =   len + 44; 

    //04~07 
    header[4] = (char) ((file_size -8) & 0xff);
    header[5] = (char) (((file_size -8) >> 8) & 0xff);
    header[6] = (char) (((file_size -8) >> 16) &0xff);
    header[7] = (char) (((file_size -8) >> 24) &0xff);

3、每秒字节数:

    header[34] = (char) (sample_bit<<3) & 0xff;

    header[35] = (sample_bit<<3)>> 8;


呱牛笔记

static int pcmAddWavHeader(FILE_ID fp, int channels, int bits, int sample_rate, int len) {
    if (NULL == fp) {
        printf("Input file ptr is null.\n");
        return -1;
    }  
    int file_size =   len + 44;      // 
    int channel = channels;         // 
    int bit_rate = sample_rate * channels * bits;//(sample_rate * channels * bits)/8;      // 
    int sample_bit = bits ;    // 
    int data_size = len;     //pcm 
    char header[44] = "\0"; //wav

    memset(header, 0x00, 44);

    //00~03 
    header[0] ='R';
    header[1] ='I';
    header[2] ='F';
    header[3] ='F';

    //04~07 
    header[4] = (char) ((file_size -8) & 0xff);
    header[5] = (char) (((file_size -8) >> 8) & 0xff);
    header[6] = (char) (((file_size -8) >> 16) &0xff);
    header[7] = (char) (((file_size -8) >> 24) &0xff);

    //3:08~11 
    header[8]  ='W';
    header[9]  ='A';
    header[10] ='V';
    header[11] ='E';

    //4:12~15 
    header[12] ='f';
    header[13] ='m';
    header[14] ='t';
    header[15] =' ';

    //5:16~19 
    header[16] =16;
    header[17] =0;
    header[18] =0;
    header[19] =0;

    //6:20~21 
    header[20] =1;
    header[21] =0;

    //7:22~23 
    header[22] = (char) channel;
    header[23] =0;

    //8:24~27 
    header[24] = (char) (sample_rate &0xff);
    header[25] = (char) ((sample_rate >>8) & 0xff);
    header[26] = (char) ((sample_rate >>16) & 0xff);
    header[27] = (char) ((sample_rate >>24) & 0xff);

    //9:28~31  
    header[28] = (char) (bit_rate &0xff);
    header[29] = (char) ((bit_rate >>8) & 0xff);
    header[30] = (char) ((bit_rate >>16) & 0xff);
    header[31] = (char) ((bit_rate >>24) & 0xff);

    //10:32~33  
    header[32] = (char) (channel* sample_bit / 8);
    header[33] =0;

    //11:34~35  
    header[34] = (char) sample_bit;
    header[35] =0;

    //12:36~39 
    header[36] ='d';
    header[37] ='a';
    header[38] ='t';
    header[39] ='a';

    //13:40~43 
    header[40] = (char) (data_size &0xff);
    header[41] = (char) ((data_size >>8) & 0xff);
    header[42] = (char) ((data_size >>16) & 0xff);
    header[43] = (char) ((data_size >>24) & 0xff);
    FDI_fseek(fp, 0, SEEK_SET);
    FDI_fwrite(header, 44, 1, fp);

}


static void checkPCMHeader(int file_number){
    FILE_ID fd_old = FDI_fopen(record_name , "rb");
    FDI_fseek(fd_old, 0L, SEEK_END);           ¨
    int file_size = FDI_ftell(fd_old);          
    FDI_fseek(fd_old, 0L, SEEK_SET);      
    char *mempcm = (char *)malloc(file_size);
    if (mempcm == NULL){
        DAL_AUDIO_DBG(checkPCMHeader,"mempcm malloc failed, fd:%d\r\n",file_size);
        FDI_fclose(fd_old);
        return;
    }
    memset(mempcm, 0x00, file_size);
    int ret = FDI_fread(mempcm, file_size, 1, fd_old);
    if (ret < 0){     
         DAL_AUDIO_DBG(checkPCMHeader,"FDI_fread failed, ret:%d\r\n",ret);
         FDI_fclose(fd_old);
         free(mempcm);
         return;
    }
    DAL_AUDIO_DBG(checkPCMHeader,"FDI_fread ok, ret:%d,  file_size:%d",ret, file_size);
    FDI_fclose(fd_old);
    
    FILE_ID fd = FDI_fopen(record_name, "wb"); 
    if (fd  <= 0){
      DAL_AUDIO_DBG(checkPCMHeader,"FDI_fopen failed, fd:%d\r\n",fd);
      FDI_fclose(fd);
      free(mempcm);
      return;
    }

    //write wav header
    pcmAddWavHeader(fd, 1, 2, 8000, file_size);
    
    FDI_fseek(fd, 44, SEEK_SET);
    FDI_fwrite(mempcm, file_size, 1, fd);
    
    FDI_fclose(fd);
    free(mempcm);
 }




请先登录后发表评论
  • 最新评论
  • 总共0条评论