音频处理 (一) 音频文件vnsc5858威尼斯城官网:

时间:2019-05-11 09:40来源:计算机教程
  WAVEFORMATEX data 标 志 4B   音频文件 1.采样:对声音信息录入时,行进的最小操作单位,一般一次采样具有左右2个声道,每个声道用1或2个字节来存储; data   音频文件是对声音进行数

 

WAVEFORMATEX

data

标 志 4B

 

音频文件

1. 采样:对声音信息录入时,行进的最小操作单位,一般一次采样具有左右2个声道,每个声道用1或2个字节来存储;

data

   音频文件是对声音进行数字转换之后存放的数据文件,了解音频数据必须先知道几个重要概念。

结构体 16B/18B

结构体大小 4B

 

 

 

这样采样的量化位数是8位,或16位(样本位宽),量化位数越高声音音质越好;就像11位电话号码表示的号码比7位要多得多;

    WAVE是微软开发的声音文件格式,用于保存Windows平台的音频信息资源,文件后缀名*.wav;支持多种压缩算法、多种音频位数、采样频率和声道;

说明:1. 这里没有考虑fact结构存在的情况;2. 调用ReadHeader()之后wfx结构同时也填充完毕,可以用于打开音频设备,进行wav音频播放;

 

     MP3格式(待续 ...)

-

 

(1)  RIFF块里面的 dwRiffSize 表示的是整个文件除开头8个字节之外的大小,0x24 0xCD 0x01 0x00,即 118,052 Byte,通过文件属性查得文件大小是118,060Byte;

"RIFF"

4. 声道数,固定值为1-单声道,或者2-双声道,双声道时,每个采样样本中包含左声道、右声道的音频数据,因此两者的数据是交错排列的;

 

数据大小 4B

3. 码率:每秒编码的bit数,单位是kb/s;计算方式:位宽×声道数×采样频率;(单位是bit不是字节)

 

 (一)Wave 格式

RIFF

16/18

 一个示例:

 

格式 4B

"WAVE"

(3)  Data块:dwDataSize表示音频数据的大小,0x00 0x01 0xCD 0x00,即118,016,略小于118,052,说明文件末有部分无效数据;

-

标志 4B

2. 采样频率:每秒采样次数,单位Hz,一般的音频文件有11.025kHz、22.05kHz、44.10kHz等;显然,这种模-数信息的转换,每秒采样次数越多,声音就越精确;

 

标志 4B

  1. Wave文件的详细结构:

    // RIFF 标准媒体流文件头 struct Riff_Header { char szRiffId[4]; // 'R','I','F','F'

     DWORD dwRiffSize;            // Size, 除了这 8 个字节之外,文件剩余大小,等于文件总字节数-8
     char szRiffFormat[4];          // 'W','A','V','E'
    

    };

    struct Fmt_Block { char szFmtId[4]; // 'f', 'm', 't',' '

      DWORD dwFmtSize;                 // Size 为 16 或 18
    
     WORD wFormatTag;       // 编码方式,一般为 0x0001
     WORD wChannels;                     // 声道数 1--单声道 2--双声道
     DWORD dwSamplesPerSec;      // 采样频率 /Hz
     DWORD dwAvgBytesPerSec;    // 每秒字节数
     WORD wBlockAlign;                 // 数据块对齐单位(每个采样需要的字节数)
     WORD wBitsPerSample;           // 每个采样需要的 bit
    

    // WORD wBits; // 可能有可能没有,由dwFmtSize字段决定 };

    //Fact_Block 块,有些 wav 文件中没有 struct Fact_Block {

    char szFactId[4];                 // 'f','a','c','t'
         DWORD dwFactSize;           //
    

    };

    //数据块 struct Data_Block {

    char szDataId[4];                //'d','a,','t','a'
        DWORD dwDataSize;          // 音频数据大小
    //data ...
    

    };

 

结果:

vnsc5858威尼斯城官网 1

 

 

声音数据大小 4B

    标准的wav文件采用44.1kHz采样频率,16位量化位数,声音文件质量几与CD相当;Wave格式不对源数据做任何处理,如果源数据是无损的,编码后的Wav文件也是无损的;如果源数据是有损的,编码后的Wav文件也是有损的;

 

1. Wave文件的构成:

"fmt "

(2)  dwFmtSize 为 0x10 0x00 0x00 0x00,即为16;fmt块的剩余部分是一个波形信息结构,是微软定义的:

 

/*
 *  extended waveform format structure used for all non-PCM formats. this
 *  structure is common to all non-PCM formats.
 */
typedef struct tWAVEFORMATEX
{
    WORD        wFormatTag;         /* format type */
    WORD        nChannels;          /* number of channels (i.e. mono, stereo...) */
    DWORD       nSamplesPerSec;     /* sample rate */
    DWORD       nAvgBytesPerSec;    /* for buffer estimation */
    WORD        nBlockAlign;        /* block size of data */
    WORD        wBitsPerSample;     /* number of bits per sample of mono data */
    WORD        cbSize;             /* the count in bytes of the size of */
                                                                                      /* extra information (after cbSize) */
} WAVEFORMATEX, *PWAVEFORMATEX, NEAR *NPWAVEFORMATEX, FAR *LPWAVEFORMATEX;

 

其调用如下:

 (二) MP3格式

"data"

-

vnsc5858威尼斯城官网 2vnsc5858威尼斯城官网 3

//
// 读取Wav文件头,并验证文件格式
// 成功返回文件句柄,并重定位文件指针到数据区
// 失败返回NULL
//
HANDLE ReadHeader(char* path)
{
    HANDLE hFile = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);

    if (hFile == INVALID_HANDLE_VALUE)
    {
        printf("Unable to Open File!");
        return NULL;
    }
    char buffer[512];
    DWORD readByte;
    if (ReadFile(hFile, buffer, sizeof(buffer), &readByte, NULL))
    {
        Riff_Header header;
        Fmt_Block fmt;
        Data_Block data;
        memcpy(&header, buffer, sizeof(Riff_Header));
        if (strncmp(header.szRiffId, "RIFF", 4) != 0) {CloseHandle(hFile); return NULL;}

        memcpy(&fmt, buffer   sizeof(Riff_Header), sizeof(Fmt_Block));
        if (strncmp(fmt.szFmtId, "fmt ", 4) != 0) {CloseHandle(hFile);return NULL;}

        memcpy(&data, buffer   sizeof(Riff_Header) fmt.dwFmtSize 8, sizeof(Data_Block));
        if (strncmp(data.szDataId, "data", 4) != 0) {CloseHandle(hFile);return NULL;}

        memcpy(&wfx, &fmt.wFormatTag, sizeof(WAVEFORMATEX) - 2);
        wfx.cbSize = 0;

        // 重定位文件指针,到数据起始位置
        int headSize = sizeof(Riff_Header)   fmt.dwFmtSize   8   sizeof(Data_Block);
        headSize = (headSize/8   (headSize%8?1:0))*8;
        SetFilePointer(hFile, headSize, 0, FILE_BEGIN);

        return hFile;
    }
    return NULL;
}

 

fmt

#include "stdafx.h"
#include <Windows.h>
#include <mmsystem.h>
#include "WavStruct.h"

#pragma comment(lib, "winmm.lib")

const char testWave = "C:/Windows/Media/Ring02.wav";
WAVEFORMATEX wfx;

int main(int argc, char* argv[])
{
    HANDLE hFile = ReadHeader((char*)testWave);
    if (hFile == NULL) return 0;

    CloseHandle(hFile);
    return 0;
}

 

vnsc5858威尼斯城官网 4

 

 

 说明:

编辑:计算机教程 本文来源:音频处理 (一) 音频文件vnsc5858威尼斯城官网:

关键词: