写.wav文件的三个关键函数

来源:互联网 发布:大富豪5.2全套源码 编辑:程序博客网 时间:2024/06/06 14:15

int WriteBackupFileAudio(char *pData)

{

    int len = 0;

    if(g_waveFile)

    {

        len = fwrite(pData, 1, 320, g_waveFile);

        if(len != 320)

        {

            printf("WriteBackupFileAudio fail! len = %d\n",len);

            return -1;

        }

    }

    return 0;

}


int ConstruncWavHead(void)

{

    int len = 0;

    unsigned char wavHeadData[] =

    {

        // RIFF WAVE Chunk

        0x52, 0x49,0x46,0x46,// "RIFF"

        0x30,0x00,0x00,0x00,//总长度整个wav文件大小减去IDSize所占用的字节数

        0x57, 0x41,0x56,0x45,// "WAVE"

        

        // Format Chunk

        0x66, 0x6D,0x74,0x20,// "fmt "

        0x10, 0x00,0x00,0x00,//块长度

        0x01, 0x00,//编码方式

        0x01, 0x00,//声道数目

        0x40,0x1f,0x00,0x00,//采样频率 16000=3e80; [8k= 0x40 0x1f 0 0 ]

        0x80,0x3e,0x00,0x00,//每秒所需字节数=采样频率*块对齐字节

        0x02,0x00,//数据对齐字节=每个样本字节数*声道数目

        0x10, 0x00,//样本宽度

        

        // Fact Chunk

        0x66, 0x61,0x63,0x74,// "fact"

        0x04, 0x00,0x00,0x00,//块长度

        0x00, 0xBE,0x00,0x00,

        

        // Data Chunk

        0x64, 0x61,0x74,0x61,// "data"

        0x00, 0x00,0x00,0x00,//块长度

    };

    if(g_waveFile)

    {

        len = fwrite(wavHeadData,1,56,g_waveFile);

        if(len != 56)

        {

            return -1;

        }

    }

    return 0;

}


int ChangeWavHeadInfo()

{

    if(NULL == g_waveFile)

        return 0;

    int len;

    char buf[4];

    memset(buf,0,sizeof(buf));

    fseek(g_fpPcm,0,SEEK_END);
    len = ftell(g_fpPcm);

    ((unsigned int *)buf)[0] = len;// toltal size

    fseek(g_waveFile,4,SEEK_SET);

    fwrite(buf,1,4,g_waveFile);//5~8字节,保存文件总长度

    

    fseek(g_waveFile,52,SEEK_SET);

    ((unsigned int *)buf)[0] = len-56;// 53~56字节,保存数据长度

    fwrite(buf,1,4,g_waveFile);

    fflush(g_waveFile);

    

    return 0;

}


此代码纯属自己备份,里面一些变量都写死了,不同的情况可能需要变通


amr文件的6字节文件头

BYTE buffer[6] = {0x23, 0x21, 0x41, 0x4D, 0x52, 0x0A};

0 0