取りあえず、.wavファイルのヘッダを読み込んで表示してみます。
#include <stdio.h>
#include <string.h>
#define FileName "test.wav"
#pragma pack(push,1)
struct WaveFileHeader{
char Riff[4]; //
RIFFヘッダ
unsigned int FileSize; //
ファイルサイズ - 8
char Wave[4]; //
WAVEヘッダ
};
struct tagChank{
unsigned char Fmt[4]; // fmt
チャンク
unsigned int FmtSize; // fmt
チャンクのバイト数
};
struct WaveFormat{
unsigned short FormatTag; //
フォーマットID
unsigned short Channels; //
チャンネル数
unsigned int SamplingRate; //
サンプリングレート
unsigned int BytesPerSec; //
データ速度 (Byte/sec)
unsigned short BlockAlign; //
ブロックサイズ
unsigned short BitsPerSample; //
サンプルあたりのビット数
};
#pragma pack(pop)
bool readfmtChunk(FILE *fp, WaveFormat*
waveFmtPcm){
if(fread(waveFmtPcm,
sizeof(WaveFormat), 1, fp) != 1)return false;
printf( "データ形式: %u (1 = PCM)\n",
waveFmtPcm->FormatTag);
printf( "チャンネル数: %u\n",
waveFmtPcm->Channels);
printf( "サンプリング周波数: %lu [Hz]\n",
waveFmtPcm->SamplingRate);
printf( "バイト数 / 秒: %lu [bytes/sec]\n",
waveFmtPcm->BytesPerSec);
printf( "バイト数×チャンネル数: %u [bytes]\n",
waveFmtPcm->BlockAlign);
printf( "ビット数 / サンプル: %u
[bits/sample]\n", waveFmtPcm->BitsPerSample);
return true;
}
bool WaveHeaderRead(char
*wavefile){
WaveFileHeader
waveFileHeader;
WaveFormat waveFmtPcm;
tagChank chank;
long fPos, len;
FILE *fp;
errno_t err;
if (err=fopen_s(&fp,wavefile,
"rb") !=0){
printf(" %sをオープンできません\n",
wavefile);
return false;
}
printf( "\n%s :\n",
wavefile);
// ヘッダ情報
if (fread(&waveFileHeader, sizeof
waveFileHeader, 1, fp) != 1){
printf(" %ld で読み込み失敗\n",
ftell(fp));
fclose(fp);
return false;
}
if(strncmp( waveFileHeader.Riff, "RIFF",
4) != 0){
printf("'RIFF'
フォーマットでない\n");
fclose(fp);
return false;
}
// WAVE ヘッダ情報
if (memcmp(waveFileHeader.Wave, "WAVE", 4)
!= 0){
printf("'WAVE'
が無い\n");
fclose(fp);
return false;
}
// 4Byte これ以降のバイト数 = (ファイルサイズ -
8)(Byte)
len =
waveFileHeader.FileSize;
// チャンク情報
while (fread(&chank, sizeof chank,
1, fp) == 1){
if(memcmp( chank.Fmt, "fmt ", sizeof
chank.Fmt) == 0){
len=chank.FmtSize;
printf("\"fmt \"の長さ: %ld
[bytes]\n\n", len);
fPos = ftell(fp);
if(! readfmtChunk( fp,
&waveFmtPcm))return false;
fseek(fp, fPos + len,
SEEK_SET);
}else if(memcmp(chank.Fmt, "data",
4) == 0){
len =
chank.FmtSize;
printf("\n\"data\" の長さ: %ld
[bytes]\n", len);
fPos = ftell(fp);
fseek(fp, len + fPos - 4,
SEEK_SET);
break;
}else{
len=chank.FmtSize;
printf( "\"%c%c%c%c\"の長さ: %ld
[bytes]\n\n",
chank.Fmt[0],chank.Fmt[1],
chank.Fmt[2],chank.Fmt[3],
len);
fPos = ftell(fp);
fseek(fp, fPos + len,
SEEK_SET);
}
}
fclose(fp);
return true;
}
void main(int argc, char
*argv[]){
WaveHeaderRead(FileName);
getchar();
}
|