音频文件,文件的基础知识与文件格式

By admin in 美高梅手机版4858 on 2019年2月16日

音频文件

音频文件

旋律处理 (一) 音频文件,音频处理音频文件

音频文件

 
 音频文件是对声音进行数字转换之后存放的数据文件,驾驭音频数据必须先清楚多少个主要概念。

1.
采样:对声新闻息录入时,行进的小不点儿操作单位,一般三遍采样具有左右3个声道,每一种声道用1或3个字节来存储;

如此采样的量化位数是八人,或1三位(样本位宽),量化位数越高声音音质越好;就像是拾四位电话号码表示的编号比陆人要多得多;

2.
采样频率:每秒采样次数,单位Hz,一般的音频文件有11.025kHz、22.05kHz、44.10kHz等;鲜明,那种模-数音讯的转移,每秒采样次数越多,声音就越精确;

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

4.
声道数,固定值为1-单声道,恐怕2-双声道,双声道时,各种采样样本中隐含左声道、右声道的旋律数据,由此双方的多少是纵横排列的;

 

 (一)Wave 格式

   
WAVE是微软成本的声音文件格式,用于保存Windows平台的旋律消息能源,文件后缀名*.wav;协助各类压缩算法、多样节奏位数、采样频率和声道;

   
标准的wav文件拔取44.1kHz采样频率,拾叁个人量化位数,声音文件质量几与CD优秀;Wave格式不对源数据做其余处理,如若源数据是无害的,编码后的Wav文件也是无害的;若是源数据是有损的,编码后的Wav文件也是有损的;

  1. Wave文件的重组:
RIFF 标 志 4B "RIFF"
数据大小 4B
格式 4B "WAVE"
fmt 标志 4B "fmt "
结构体大小 4B 16/18
结构体 16B/18B  
data 标志 4B "data"
声音数据大小 4B
data

 

 

 

 

 

 

 

 

 

 

音频文件,文件的基础知识与文件格式。 

 

 

美高梅手机版4858 1

  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
    

    // WOLX570D 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 ...
    

    };

 说明:

  1. 本田UR-VIFF块里面的 dwRiffSize 表示的是总体文件除初步九个字节之外的尺寸,0x24
    0xCD 0x01 0x00,即 118,052 Byte,通过文件属性查得文件大小是118,060Byte;

  2. dwFmtSize 为 0x10 0x00 0x00
    0x00,即为16;fmt块的多余部分是1个波形音讯结构,是微软概念的:

美高梅手机版4858 2

/*
 *  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;

WAVEFORMATEX

  1. Data块:dwDataSize表示音频数据的高低,0x00 0x01 0xCD
    0x00,即118,016,略低于118,052,表明文件末有一对低效数据;

 

 (二) MP3格式

     MP3格式(待续 …)

 

 

 

 

 

(一) 音频文件,音频处理音频文件 音频文件
音频文件是对声音进行数字转换之后存放的数据文件,掌握音频数据必须先通晓多少个…

近年来准备上学 DirectSound、DirectMusic、DirectShow,
但刚一接触就遇上了有关 Wave 文件的浩大题材, 只可以先回头学学 Wave 文件.

 
 音频文件是对声音进行数字转换之后存放的数据文件,明白音频数据必须先精晓多少个主要概念。

 
 音频文件是对声音举办数字转换之后存放的数据文件,明白音频数据必须先知道多少个根本概念。


1.
采样:对声新闻息录入时,行进的很小操作单位,一般两次采样具有左右3个声道,每种声道用1或3个字节来存储;

1.
采样:对声信息息录入时,行进的小不点儿操作单位,一般一遍采样具有左右二个声道,每种声道用1或二个字节来存储;

Wave 文件的基础知识

如此那般采样的量化位数是5人,或十几人(样本位宽),量化位数越高声音音质越好;如同11人电话号码表示的号子比六人要多得多;

这么采样的量化位数是八个人,或13位(样本位宽),量化位数越高声音音质越好;就像拾1人电话号码表示的数码比八人要多得多;

原稿地址()

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

2.
采样频率:每秒采样次数,单位Hz,一般的音频文件有11.025kHz、22.05kHz、44.10kHz等;明显,那种模-数新闻的转移,每秒采样次数越来越多,声音就越精确;

每每来看这么的讲述: 44100HZ 16bit stereo 依然 22050HZ 8bit mono 等等.

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

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

44100HZ 16bit stereo : 每分钟有 44100 次采样, 采样数据用 十三个人(2字节)记录, 双声道(立体声);
22050HZ 8bit mono : 每分钟有 22050 次采样, 采样数据用 8 位(1字节)记录,
单声道;

4.
声道数,固定值为1-单声道,大概2-双声道,双声道时,逐个采样样本中带有左声道、右声道的旋律数据,由此双方的数据是纵横排列的;

4.
声道数,固定值为1-单声道,或然2-双声道,双声道时,逐个采样样本中涵盖左声道、右声道的音频数据,因而双方的多寡是纵横排列的;

当然也足以有 16bit 的单声道或 8bit 的立体声, 等等.

 

 


 (一)Wave
格式

 (一)Wave
格式

人对功效的分辨范围是 20HZ – 两千0HZ, 如若每分钟能对声音做 三千0 个采样,
回放时就足可以知足人耳的须求. 所以 22050 的采样频率是常用的, 44100 已是
CD 音质, 当先 49000 的采样对人耳已经远非意义. 这和摄像的每秒 24
帧图片的道理大约.

    WAVE是微软支付的声音文件格式,用于保存Windows平台的点子消息财富,文件后缀名*.wav;援救种种压缩算法、多种节奏位数、采样频率和声道;

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

各样采样数据记录的是振幅, 采样精度取决于储存空间的高低:
1 字节(相当于8bit) 只好记录 256 个数, 也等于只可以对振幅做 256 种识别;
2 字节(也等于16bit) 可以细到 65536 个数, 那已是 CD 标准了;
4 字节(相当于32bit) 能把振幅细化到 4294967296 种或然性,
实在是没要求了.

    标准的wav文件拔取44.1kHz采样频率,拾陆位量化位数,声音文件质量几与CD极度;Wave格式不对源数据做任何处理,即使源数据是无害的,编码后的Wav文件也是无害的;倘诺源数据是有损的,编码后的Wav文件也是有损的;

    标准的wav文件采取44.1kHz采样频率,十三位量化位数,声音文件质量几与CD十分;Wave格式不对源数据做其他处理,尽管源数据是无害的,编码后的Wav文件也是无害的;固然源数据是有损的,编码后的Wav文件也是有损的;

假诺是双声道(stereo), 采样就是双份的, 文件也大约要大一倍.

1.
Wave文件的三结合:

1.
Wave文件的组合:


RIFF

RIFF

如此那般大家就足以依照1个 wav 文件的高低、采样频率和采样大小推测出多少个 wav
文件的长短; 譬如 “Windows XP 运营.wav” 的文本长度是 424,644 字节, 它是
“22050HZ / 16bit / 立体声” 格式(那可以从其 “属性->摘要” 里看到).
它的每秒的传输速率是 22050*16*2 = 705600(bit), 换算成字节是 705600/8 =
88200(字节);
424644(总字节数) / 88200(每秒字节数) ≈ 4.8145578(秒).

标 志 4B

标 志 4B

那还不够准确, 在规范的 PCM 格式的 WAVE 文件中还有 四十二个字节是采样数据之外的始末, 应该去掉:
(424644-44) / (22050*16*2/8) ≈ 4.8140589(秒). 那正如准确了.

“RIFF”

“RIFF”


数量大小 4B

多少大小 4B

有关声音文件还有3个定义: “位速”, 也有号称比特率、取样率,
譬如上边文件的位速是 705.6kbps 或 705600bps, 其中的 b 是 bit, ps
是每秒的情趣; 压缩的音频文件平日用位速来表示, 譬如达到 CD 音质的 mp4 是:
128kbps / 44100HZ.


格式 4B

格式 4B

Wave 文件的文件格式

“WAVE”

“WAVE”

微软的多媒体文件(wav、avi、tif 等)都有贰个 大切诺基IFF 头, Wave
文件宗旨是其一样子:

fmt

fmt

RIFF 头

标志 4B

标志 4B

fmt 子块

“fmt

“fmt

data 子块

结构体大小 4B

结构体大小 4B

Wave 文件的编码情势有成千成万, 最常用最简易的就是 PCM 编码.

16/18

16/18

其余编码会含有更加多的”块”, 但至少会蕴藏下边的块, PCM
编码只含有下面的块.

结构体 16B/18B

结构体 16B/18B

上边是 PCM 编码的祥表:

 

 

RIFF 头

data

data

ckid

标志
4B

标志
4B

4

“data”

“data”

“RIFF” 标识

响声数据大小 4B

声音数据大小 4B

cksize

4

data

data

文件大小; 那么些尺寸不包罗 ckid 和 cksize 本人,
上面的子块大小也是那般

fccType

 

 

4

 

 

类型, 这里是 “WAVE” 标识

 

 

 

 

 

24

 

 

fmt 子块

 

 

ckid

 

 

4

 

 

“fmt ” 标识

 

 

cksize

 

 

4

 

 

块大小; 对 PCM
编码那里是 16, 其他编码也不小于 16

 

 

wFormatTag

 

 

2

美高梅手机版4858 3

美高梅手机版4858 4

编码格式; 1 表示是 PCM 编码 

  1. Wave文件的事无巨细结构:

    // PRADOIFF 标准媒体流文件头
    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
    

    // WOLANDD 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 ...
    

    };

  1. Wave文件的详尽结构:

    // 福睿斯IFF 标准媒体流文件头
    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
    

    // WOOdysseyD 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 ...
    

    };

nChannels

 说明:

 说明:

2

(1)
 安德拉IFF块里面的 dwRiffSize
表示的是一体文件除初叶几个字节之外的轻重,0x24 0xCD 0x01
0x00,即 118,052
Byte,通过文件属性查得文件大小是118,060Byte;

(1)
 奥迪Q5IFF块里面的 dwRiffSize
表示的是全部文件除开端七个字节之外的深浅,0x24 0xCD 0x01
0x00,即 118,052
Byte,通过文件属性查得文件大小是118,060Byte;

声道数; 1 是单声道、2 是立体声

(2)
 dwFmtSize 为 0x10 0x00 0x00
0x00,即为16;fmt块的剩下部分是2个波形新闻结构,是微软概念的:

(2)
 dwFmtSize 为 0x10 0x00 0x00
0x00,即为16;fmt块的盈余部分是二个波形新闻结构,是微软概念的:

nSamplesPerSec

美高梅手机版4858 5美高梅手机版4858 6

美高梅手机版4858 7美高梅手机版4858 8

4

/*
 *  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;
/*
 *  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;

采样频率(每秒的样本数); 譬如 44100

WAVEFORMATEX

WAVEFORMATEX

nAvgBytesPerSec

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

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

4

 二个示范:

 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;
}
//
// 读取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;
}

nBlockAlign

美高梅手机版4858 ,申明:1. 那里没有设想fact结构存在的情事;2.
调用ReadHeader()之后wfx结构同时也填充已毕,可以用于打开音频设备,举办wav音频播放;

证实:1. 那里没有设想fact结构存在的场地;2.
调用ReadHeader()之后wfx结构同时也填充已毕,可以用于打开音频设备,举办wav音频播放;

2

其调用如下:

其调用如下:

每便采样的轻重 = 采样精度 * 声道数 /
8(因单位是字节所以要/8);
那也是字节对齐的小不点儿单位, 譬如 16bit 立体声在此地的值是 4 字节

#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;
}
#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;
}

wBitsPerSample

结果:

结果:

2

美高梅手机版4858 9

美高梅手机版4858 10

采样精度; 譬如 16bit 在这里的值就是 16

 

 

?

 (二) MP3格式

 (二) MP3格式

data 子块

     MP3格式(待续 …)

     MP3格式(待续 …)

ckid

 

 

4

 

 

“data” 标识

 

 

cksize

 

 

4

 

 

块大小

采样数据

?

双声道数据排列: 左右左右…; 8bit: 0-255, 16bit: -32768-32767

任何编码可能会含有的块有:
事实块(Fact)、提醒块(Cue)、标签块(Label)、注释块(Note)、标签文本块(Labeled
Text)、采样器块(Sampler)、乐器块(Instrument)、列表块(List)等等, 假若有
List 块, 它还会蕴藏更多子块.

接下去要存取、播放、摄像, 说来简单, 操作起来都挺麻烦.


发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有