WAVファイルのヘッダを読み込んでみる

 取りあえず、.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();
}

 

 

 

 

 

 

最終更新:2012年12月13日 13:00
添付ファイル