织梦CMS - 轻松建站从此开始!

罗索

读取 wav文件 头信息, Read wav file information

jackyhwei 发布于 2011-07-07 16:31 点击:次 
读取wav文件头信息的实现代码
TAG:

#include <stdio.h>

typedef signed char         INT8;
typedef signed short        INT16;
typedef signed int          INT32;
typedef unsigned char       UINT8;
typedef unsigned short      UINT16;
typedef unsigned int        UINT32;

#define SWAP32(val) (UINT32)((((UINT32)(val)) & 0x000000FF)<<24|    \
    (((UINT32)(val)) & 0x0000FF00)<<8 |    \
    (((UINT32)(val)) & 0x00FF0000)>>8 |    \
    (((UINT32)(val)) & 0xFF000000)>>24)    
        
typedef struct tagRIFFCHUNK
{
    UINT32 fcc;
    UINT32  cb;
} RIFFCHUNK, *LPRIFFCHUNK;
 
typedef struct tagRIFFLIST  
{
    UINT32 fcc;
    UINT32  cb;
    UINT32 fccListType;
}RIFFLIST, *LPRIFFLIST;

typedef struct  
{
    UINT32    fcc;
    UINT32    cb;
    UINT16  wFormatTag;  
    UINT16  nChannels;  
    UINT32    nSamplesPerSec;  
    UINT32    nAvgBytesPerSec;  
    UINT16  nBlockAlign;  
    UINT16  wBitsPerSample;  
}WAVEFORM;
 
static void ReadWaveForm(FILE *fp, WAVEFORM *pWave)
{
    fread(&(pWave->fcc), 1, 4, fp);
    fread(&(pWave->cb), 1, 4, fp);
    fread(&(pWave->wFormatTag), 1, 2, fp);
    fread(&(pWave->nChannels), 1, 2, fp);
    fread(&(pWave->nSamplesPerSec), 1, 4, fp);
    fread(&(pWave->nAvgBytesPerSec), 1, 4, fp);
    fread(&(pWave->nBlockAlign), 1, 2, fp);
    fread(&(pWave->wBitsPerSample), 1, 2, fp);
}
 
UINT32 GetWaveChunk(FILE* hFile,WAVEFORM *pWave)
{
    RIFFCHUNK ch;
    RIFFLIST  riff;
    WAVEFORM wave;
    int cb=0;
 
    if(pWave==NULL)
        pWave=&wave;
 
    if(fseek(hFile,0,SEEK_SET)==-1)
        return 0;
 
    fread(&riff, 1, sizeof(RIFFLIST), hFile);
    if( riff.fcc!=SWAP32(0x52494646)|| riff.fccListType!=SWAP32(0x57415645))//RIFF, WAVE
        return 0;
 
    ReadWaveForm(hFile, pWave);
    if(pWave->fcc!=SWAP32(0x666d7420))//fmt
        return 0;
    cb=pWave->cb + sizeof(RIFFCHUNK)-sizeof(WAVEFORM);
    if((cb>0) && (fseek(hFile,cb,SEEK_CUR)==-1) )
    {
        return 0;
    }          
    fread(&ch, 1, sizeof(RIFFCHUNK), hFile);
    while(ch.fcc!=SWAP32(0x64617461))//data
    {
        if(fseek(hFile,ch.cb,SEEK_CUR)!=-1)
            fread(&ch, 1, sizeof(RIFFCHUNK), hFile);
        else
            return 0;
    }
    return ch.cb;
}

int main(int argc,char *argv[])
{
    FILE *fp = NULL;
    WAVEFORM wavChunk = {0};
    if(argc<1)
        return 0;
    fp = fopen(argv[1], "rb");
    if(fp == NULL)
        return 0;
    GetWaveChunk(fp, &wavChunk);
    printf("fcc = %d\n", wavChunk.fcc);
    printf("cb = %d\n", wavChunk.cb);
    printf("nChannels = %d\n", wavChunk.nChannels);
    printf("nSamplesPerSec = %d\n", wavChunk.nSamplesPerSec);
    printf("nAvgBytesPerSec = %d\n", wavChunk.nAvgBytesPerSec);
    printf("nBlockAlign = %d\n", wavChunk.nBlockAlign);
    printf("wBitsPerSample = %d\n", wavChunk.wBitsPerSample);
    fclose(fp);
    return 1;
}

(carlsonlee_freec)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201107/14682.html]
本文出处:hi.baidu.com/carlsonlee_freec 作者:carlsonlee_freec
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容