tanyxkxw的个人博客分享 http://blog.sciencenet.cn/u/tanyxkxw

博文

读取WAV文件头信息

已有 3652 次阅读 2014-5-3 20:38 |系统分类:科研笔记

千辛万苦写了一整天。只能用“步步惊心”来形容C语言编程……T_T

---------------------------------------------以下是输出--------------------------------------------------


RIFF: RIFF

File size: 229440

WAVE: WAVE

fmt: fmt

Format tab: 1

Channels: 2

Samples per sec: 44100

Bytes per sec: 176400

Block align: 4

Bits per sample: 16

Audio size: 229396

Header size: 44


-------------------------------------以下是main.cpp内容----------------------------------------------


#include "header.h"

using namespace::std;

int main(){

  WAVHEADER whInfo;

  initWavHeader(&whInfo);                                                                              

  readHeaderInfo("../test.wav",&whInfo);

  printWavHeader(&whInfo);

}


----------------------------------------以下是header.h内容---------------------------------------------


#include <iostream>                                                                                    

#include <fstream>

#include <stdlib.h>

#include <string.h>

using namespace::std;

typedef unsigned short WORD;

typedef unsigned long DWORD;

typedef struct{

  unsigned char chRiff[5];

  DWORD dwFileSizeM8;

  unsigned char chWave[5];

  unsigned char chFmt[5];

  unsigned char chFlt[5];

  WORD wFormatTag;

  WORD wChannels;

  DWORD dwSamplesPerSec;

  DWORD dwAvgBytesPerSec;

  WORD wBlockAlign;

  WORD wBitsPerSample;

  DWORD dwAudioSize;

  int iHeaderSize;

}WAVHEADER;

void initWavHeader(WAVHEADER *);

void printWavHeader(WAVHEADER *);


void initWavHeader(WAVHEADER *wh){

  (*wh).chRiff[0] = '';

  (*wh).dwFileSizeM8 = 0;

  (*wh).chWave[0] = '';  

  (*wh).chFmt[0] = '';

  (*wh).chFlt[0] = '';

  (*wh).wFormatTag = 0;

  (*wh).wChannels = 0;

  (*wh).dwSamplesPerSec = 0;

  (*wh).dwAvgBytesPerSec = 0;

  (*wh).wBlockAlign = 0;

  (*wh).wBitsPerSample = 0;

  (*wh).dwAudioSize = 0;

  (*wh).iHeaderSize = 0;

}

void printWavHeader(WAVHEADER *wh){

  cout << "RIFF: " << (*wh).chRiff << endl;

  cout << "File size: " << (*wh).dwFileSizeM8 << endl;

  cout << "WAVE: " << (*wh).chWave << endl;

  cout << "fmt: " << (*wh).chFmt << endl;

  cout << "Format tab: " << (*wh).wFormatTag << endl;

  cout << "Channels: " << (*wh).wChannels << endl;

  cout << "Samples per sec: " << (*wh).dwSamplesPerSec << endl;

  cout << "Bytes per sec: " << (*wh).dwAvgBytesPerSec << endl;

  cout << "Block align: " << (*wh).wBlockAlign << endl;

  cout << "Bits per sample: " << (*wh).wBitsPerSample << endl;

  cout << "Audio size: " << (*wh).dwAudioSize << endl;

  cout << "Header size: " << (*wh).iHeaderSize << endl;

}

void readHeaderInfo(const char *fileName, WAVHEADER *wh){

  ifstream fin(fileName,ios::binary);

  if(!fin){

     cerr << "ERROR: Failed to open " << fileName << endl;

     exit(1);

  }

  unsigned char chTemp[100];

  char chSum[100] = "0x";

  char chByte[2];

  fin.read((char *)(&chTemp),sizeof(chTemp));

  for(int i=0;i<4;++i) (*wh).chRiff[i] = chTemp[i];

  (*wh).chRiff[4] = '';

  for(int i=7;i>=4;--i){

     sprintf(chByte,"%02x",chTemp[i]);

     strcat(chSum,chByte);

  }

  (*wh).dwFileSizeM8 = strtol(chSum,NULL,16)+8;

  for(int i=0;i<4;++i) (*wh).chWave[i] = chTemp[8+i];

  (*wh).chWave[4] = '';

  for(int i=0;i<4;++i) (*wh).chFmt[i] = chTemp[12+i];

  (*wh).chFmt[3] = '';

  for(int i=0;i<4;++i) (*wh).chFlt[i] = chTemp[16+i];

  (*wh).chFlt[4] = '';

  strcpy(chSum,"0x");

  for(int i=21;i>=20;--i){

     sprintf(chByte,"%02x",chTemp[i]);

     strcat(chSum,chByte);

  }

  (*wh).wFormatTag = strtol(chSum,NULL,16);

  strcpy(chSum,"0x");

  for(int i=23;i>=22;--i){

     sprintf(chByte,"%02x",chTemp[i]);

     strcat(chSum,chByte);

  }

  (*wh).wChannels = strtol(chSum,NULL,16);

  strcpy(chSum,"0x");

  for(int i=27;i>=24;--i){

     sprintf(chByte,"%02x",chTemp[i]);

     strcat(chSum,chByte);

  }

  (*wh).dwSamplesPerSec = strtol(chSum,NULL,16);

  strcpy(chSum,"0x");

  for(int i=31;i>=28;--i){

     sprintf(chByte,"%02x",chTemp[i]);

     strcat(chSum,chByte);

  }

  (*wh).dwAvgBytesPerSec = strtol(chSum,NULL,16);

  strcpy(chSum,"0x");

  for(int i=33;i>=32;--i){

     sprintf(chByte,"%02x",chTemp[i]);

     strcat(chSum,chByte);

  }

  (*wh).wBlockAlign = strtol(chSum,NULL,16);

  strcpy(chSum,"0x");

  for(int i=35;i>=34;--i){

     sprintf(chByte,"%02x",chTemp[i]);

     strcat(chSum,chByte);

  }

  (*wh).wBitsPerSample = strtol(chSum,NULL,16);

  // find 'data'

  int iData = 36;


  for(int i=iData;i<96;++i){

     char tmp[4];

     for(int j=0;j<4;++j) tmp[j] = chTemp[i+j];

     if(strcmp(tmp,"data")==0){

        iData = i;

        break;

     }

  }

  iData += 4;

  strcpy(chSum,"0x");

  for(int i=iData+3;i>=iData;--i){

     sprintf(chByte,"%02x",chTemp[i]);

     strcat(chSum,chByte);

  }

  (*wh).dwAudioSize = strtol(chSum,NULL,16);

  (*wh).iHeaderSize = iData + 4;

  fin.close();

}

                                 

--------------------------------------------相关链接-------------------------------------------------

各种WAV格式 < http://blog.csdn.net/xsjm206/article/details/6727023 >

 Wave File Format < http://www.sonicspot.com/guide/wavefiles.html >

 



https://blog.sciencenet.cn/blog-747197-790989.html

上一篇:[Linux] 解决:boot分区空间不够,扩展容量
下一篇:[R语言] 统计文件词频
收藏 IP: 166.111.156.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-19 17:15

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部