PCM数据格式,音频管理
分类:pc28.am神测网

音频文件

1. 旋律简要介绍

   音频文件是对声音进行数字调换之后贮存的数据文件,明白音频数据必需先知道多少个至关心珍视要概念。

 

1. 采集样本:对声新闻息录入时,行进的细微操作单位,平常贰次采集样本具备左右2个声道,各种声道用1或2个字节来储存;

每每看看那样的汇报: 44100HZ 16bit stereo 照旧 22050HZ 8bit mono 等等.

那样采集样本的量化位数是8位,或十几人(样板位宽),量化位数越高声音音质越好;就疑似十二位电话号码表示的号码比7位要多得多;

44100HZ 16bit stereo: 每分钟有 44100 次采集样板, 采集样本数据用 13人(2字节)记录, 双声道(立体声);

2. 采集样本频率:每秒采集样本次数,单位Hz,日常的音频文件有11.025kHz、22.05kHz、44.10kHz等;显著,这种模-数新闻的转变,每秒采集样本次数越来越多,声音就越正确;

22050HZ 8bit  mono: 每秒钟有 22050 次采集样板, 采集样板数据用 8 位(1字节)记录, 单声道;

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

 

4. 声道数,固定值为1-单声道,或然2-双声道,双声道时,每种采集样本样板中饱含左声道、右声道的旋律数据,由此双方的数量是驰骋排列的;

本来也足以有 16bit 的单声道或 8bit 的立体声, 等等。

 

 

 (一)Wave 格式

采集样板率是指:声音讯号在“模→数”调换进程中单位时间内采集样本的次数。采集样本值是指每叁遍采集样本周期内声音模拟功率信号的积分值。

    WAVE是微软支付的声音文件格式,用于保存Windows平台的点子新闻财富,文件后缀名*.wav;支持各个压缩算法、两种节奏位数、采集样本频率和声道;

 

    规范的wav文件选取44.1kHz采集样板频率,16个人量化位数,声音文件品质几与CD拾贰分;Wave格式不对源数据做其余管理,要是源数据是无毒的,编码后的Wav文件也是无毒的;如若源数据是有损的,编码后的Wav文件也会有损的;

对于单声道声音文件,采集样本数据为陆人的短整数(short int 00H-FFH卡塔尔;

1. Wave文件的整合:

而对此双声道立体声声音文件,每便采集样本数据为二个十三位的整数(int卡塔 尔(英语:State of Qatar),高六位(左声道)和低八位(右声道)分别代表三个声道。

RIFF

 

标 志 4B

人对成效的辨识范围是 20HZ - 二〇〇二0HZ, 纵然每分钟能对声音做 二零零四0 个采集样板, 重播时就足能够满意人耳的要求. 所以 22050 的采集样板频率是常用的, 44100已然是CD音质, 超过48000的采集样本对人耳已经远非意思。那和影视的每秒 24 帧图片的道理大约。

"RIFF"

 

多少大小 4B

种种采样数据记录的是振幅, 采集样板精度决议于积存空间的深浅:

-

1 字节(也正是8bit) 只可以记录 256 个数, 也正是只可以将振幅划分成 256 个等第;

格式 4B

2 字节(也便是16bit) 能够细到 65536 个数, 那已然是 CD 标准了;

"WAVE"

4 字节(也正是32bit) 能把振幅细分到 4294967296 个品级, 实乃没需要了.

fmt

若果是双声道(stereo), 采集样板正是双份的, 文件也大略要大学一年级倍.

标志 4B

 

"fmt "

那样我们就足以依据多个 wav 文件的大大小小、采集样本频率和采集样本大小估计出叁个 wav 文件的播音长度。

结构体大小 4B

 

16/18

诸如 "Windows XP 运转.wav" 的公文长度是 424,644 字节, 它是 "22050HZ / 16bit / 立体声" 格式(那足以从其 "属性->摘要" 里看见),

结构体 16B/18B

那正是说它的每秒的传输速率(位速, 也叫比特率、取样率)是 22050*16*2 = 705600(bit/s), 换算成字节单位正是 705600/8 = 88200(字节/秒), 
播音时间:424644(总字节数) / 88200(每秒字节数) ≈ 4.8145578(秒)。

 

不过这还非常不够标准, 包装规范的 PCM 格式的 WAVE 文件(*.wav)中足足含有 四十二个字节的头新闻, 在计算播放时间时应该将其去掉, 
就此就有:(424644-42) / (22050*16*2/8) ≈ 4.8140816(秒). 那样就比较准确了.

data

 

标志 4B

至于声音文件还也许有二个定义: "位速", 也会有号称比特率、取样率, 举例上边文件的位速是 705.6kbps 或 705600bps, 个中的 b 是 bit, ps 是每秒的意思;

"data"

 

动静数据大小 4B

减去的音频文件平常用位速来代表, 比如达到 CD 音质的 MP4 是: 128kbps / 44100HZ.

-

 

data

2. wave文件格式

-

 

 

2.1 概述

 

 

 

WAVE文件是电脑世界最常用的数字化声音文件格式之大器晚成,它是微软特意为Windows系统定义的波形文件格式(Waveform 奥迪(Audi卡塔尔o卡塔尔国,由于其扩大名称叫"*.wav"。

 

 

 

WAVE是录音时用的科班的WINDOWS文件格式,文件的扩张名称为“WAV”,数据作者的格式为PCM或压缩型。

 

WAV文件格式是大器晚成种由微松软IBM联合开拓的用于音频数字存储的正统,它选取PAJEROIFF文件格式结构,特别近似于AIFF和IFF格式。相符PIFF Resource Interchange File Format规范。全部的WAV都有一个文件头,那么些文件头音频流的编码参数。

 

 

 

WAV对音频流的编码未有硬性规定,除了PCM之外,还大概有大致全数扶植ACM规范的编码都得以为WAV的音频流实行编码。

 

 

 

多媒体应用中央银行使了各种多少,包罗位图、音频数据、摄像数据以至外围设备调整音讯等。OdysseyIFF为存款和储蓄那些品种的数码提供了意气风发种方法,帕杰罗IFF文件所蕴藏的数据类型由该公文的扩充名来标记,能以LacrosseIFF文件存款和储蓄的多少包罗:

 

音频录制交错格式数据(.AVI) 、波形格式数据(.WAV) 、位图格式数据(.ENVISIONDI) 、MIDI格式数据(.RMI) 、调色板格式(.PAL) 、多媒体电影(.RMN) 、动漫光标(.ANI) 、别的哈弗IFF文件(.BND)。

 

 

 

wave文件有众多不等的压缩格式,所以,正确而详细地打听各个WAVE文件的内部结构是打响做到缩短和解压缩的底蕴,也是生成特有一些子压缩格式文件的前提。

图片 1

 

  1. Wave文件的详尽结构:

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

    // WOCR-VD 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 ...
    

    };

最大旨的WAVE文件是PCM(脉冲编码调制卡塔尔格式的,这种文件一贯存款和储蓄采集样品的声息数据未有通过别的的裁减,是声卡直接援助的多寡格式,要让声卡正确播放别的被压缩的动静数据,就活该先把减掉的数量解压缩成PCM格式,然后再让声卡来播音。

 说明:

 

(1)  奇骏IFF块里面包车型地铁 dwRiffSize 表示的是全方位文件除开首8个字节之外的朗朗上口,0x24 0xCD 0x01 0x00,即 118,052 Byte,通过文件属性查得文件大小是118,060Byte;

2.2 Wave文件的内部结构

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

 

图片 2图片 3

注:由于WAV格式源自Windows/英特尔景况,由此使用Little-Endian字节顺序举办仓库储存。

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

WAVE文件是以昂CoraIFF(Resource Interchange File Format, "财富彼此文件格式")格式来公司内部结构的。

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

 

 一个演示:

君越IFF文件结构能够看作是树状结构,其主干组成是名字为"块"(Chunk卡塔尔的单元,最最上端是三个“ENCOREIFF”块,下边包车型大巴各种块有“类型块标记(可选)”、“标识符”、“数据大小”及“数据”等项所结合。块的构造如表1所示:

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

名称

Size

备注

块标志符

4

4个小写字符(如 "fmt ", "fact", "data" 等)

数据大小

4

DWORD类型,表示后接数据的大小(N Bytes)

数据

N

本块中正式数据部分

证实:1. 这里未有捏造fact结构存在的图景;2. 调用ReadHeader()之后wfx结构相同的时间也填充完毕,能够用于张开音频设备,实行wav音频播放;

表1:基本chunk的内部结构

其调用如下:

 

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

上面谈起的“类型块标记”只在有个别chunk中用到,如 "WAVE" chunk中,这个时候表示上面嵌套有其余chunk。

结果:

 

图片 4

当使用了 "类型块标记" 时,该chunk就从不别的项(如块标记符,数据大小等卡塔尔国,它只充作文件读取时的一个标志。先找到那一个“类型块标志”,再以它为起源读取它上边嵌套的任何chunk。

 

 

 (二) MP3格式

每一个文件最前端写入的是SportageIFF块,每种文件独有一个巴博斯 SLK级IFF块。从 Wave文件格式详细表达 中能够看来那一点。

     MP3格式(待续 ...)

非PCM格式的文本会至少多投入八个 "fact" 块,它用来记录数据(注意是数量并非文件)解压缩后的尺寸。这几个 "fact" 块常常加在 "data" 块的前方。

 

 

 

WAVE文件是由若干个Chunk组成的。根据在文书中的现身岗位满含:途睿欧IFF WAVE Chunk, Format Chunk, Fact Chunk(可选), Data Chunk。具体见下图:

 

    -------------------------------------------

 

    |          RIFF WAVE Chunk                |

 

    |          ID   = "RIFF"                  |

    |          RiffType = "WAVE"              |

    -------------------------------------------

    |          Format Chunk                   |

    |          ID = "fmt "                    |

    -------------------------------------------

    |          Fact Chunk(optional)           |

    |          ID = "fact"                    |

    -------------------------------------------

    |          Data Chunk                     |

    |          ID = "data"                    |

    -------------------------------------------

          图 Wav格式包括Chunk示例

 

 

            Fact Chunk

    =======================================

    |      |所占字节数|      具体内容       |

    =======================================

    |  ID  | 4Bytes |      "fact"         |

    ---------------------------------------

    | Size | 4Bytes |        4            |

    ---------------------------------------

    | data | 4Bytes |解压后的韵律数据的深浅(B)|

    ---------------------------------------

         图   Fact Chunk

 

 

2.3 Wave文件格式详细表明

 

别名               字节数    类型       注释

ckid                4       char      "RIFF" 标志, 大写

cksize              4       int32     文件长度。这一个长度不包涵"RIFF"标志和

                                          文件长度 自身所占字节, 上边包车型地铁

                                          子块大小也是如此。

  fcc type          4       char      "WAVE" 类型块标志, 大写。

    ckid            4       char      表示"fmt" chunk的最初。此块中包涵文

                                          件内部格式音讯。小写, 最终叁个

                                          字符是空格。

    cksize          4       int32     文件之中格式音信数量的抑扬顿挫。

      FormatTag     2       int16     音频数据的编码情势。1 表示是 PCM 编码

      Channels      2       int16     声道数,单声道为1,双声道为2

      萨姆plesPerSec 4       int32     采集样板率(每秒样品数), 比如 44100 等

      BytesPerSec   4       int32     音频数据传送速率, 单位是字节。其值为

                                          采样率×每一回采集样板大小。播放软件

                                          利用此值能够猜想缓冲区的分寸。

      BlockAlign    2       int16     每趟采集样本的高低 = 采集样板精度*声道数/8(单

                                          位是字节); 那也是字节对齐的最

                                          小单位, 举个例子 16bit 立体声在此

                                          里的值是 4 字节。播放软件需求

                                          二次拍卖四个该值大小的字节数

                                          据,以便将其值用于缓冲区的调解。

      BitsPerSample 2       int16     每种声道的采集样本精度; 比如 16bit 在这里

                                          里的值正是16。假如有多少个声道,则

                                          各种声道的采集样板精度大小都同样的。

      [cbsize]      2       int16     [可选]叠合数据的轻重。

      [...]         x     

  [ckid]            4       char      "fact".

 

  [cksize]          4       int32     "fact" chunk data size.

  [fact data]       4       int32     解压后的点子数据的大大小小(Bytes).

 

  ckid              4       char      表示 "data" chunk的带头。此块中蕴含

                                          音频数据。小写。

  cksize            4       int32     音频数据的尺寸

    ......                            文件声音信息数据(真正声音存款和储蓄部分)

  [......]                            其它 chunk

 

 

2.4 Windows平台上WAVEFORMAT结构的认知

 

PCM和非PCM的重要不同是声音数据的团体差别,这个分化能够透过双边的WAVEFORMAT结构来差距。

上面以PCM和IMA-ADPCM来扩充对照。

 

WAVE的核心构造 WAVEFORMATEX 结构定义如下:

图片 5

 1 typedef struct
 2 {
 3     WORD  wFormatag; //编码格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等
 4     WORD  nChannls; //声道数,单声道为1,双声道为2;
 5  
 6     DWORD  nSamplesPerSec; //采样频率;
 7  
 8     DWORD  nAvgBytesperSec;  //每秒的数据量;
 9  
10     WORD  nBlockAlign; //块对齐;
11  
12     WORD  wBitsPerSample; //WAVE文件的采样大小;
13  
14     WORD  cbSize; // The count in bytes of the size of extra
15 // information(after cbSize). PCM中忽略此值
16  } WAVEFORMATEX;

图片 6

 

IMAADPCMWAVEFORMAT结构定义如下:

  

图片 7

1 Typedef struct
2 {
3     WAVEFORMATEX  wfmt;
4 
5     WORD  nSamplesPerBlock;
6    
7 } IMAADPCMWAVEFORMAT;

图片 8

 

IMA-ADPCM中的的wfmt->cbsize无法忽略,日常取值为2,表示此类型的WAVEFORMAT比相同的WAVEFORMAT多出2个字节。那五个字符也便是nSamplesPerBlock。

 

"fact" chunk的当中组织

在非PCM格式的文书中,常常会在WAVEFORMAT结构前面出席七个 "fact" chunk, 结构如下:

1
2
3
4
5
6
7
8
9
typedef struct{
 
    char[4]; //“fact”字符串
 
    DWORD chunksize;
 
    DWORD datafactsize; // 音频数据转换为PCM格式后的大小。
 
} factchunk;

 

datafactsize是以此chunk中最重视的数码,假诺这是某种压缩格式的声音文件,那么从那边就足以领略她解压缩后的朗朗上口。对于解压时的乘除会有超大的低价!

 

2.5 "data" chunk的里边组织

 

从 "data" chunk的第9个字节初始,存款和储蓄的正是声音讯息的数量了,(前四个字节存款和储蓄的是表明符 "data" 和后接数据大小size(DWOCR-VD)。那么些数据能够是减掉的,也能够是从未降低的。

 

3. PCM数据格式

 

PCM(Pulse Code Modulation)也被称得上脉码编码调制。PCM中的声音数据还未被核减,借使是单声道的公文,采集样本数据按期间的前后相继顺序依次存入。(它的着力协会单位是BYTE(8bit)或WOCR-VD(16bit))

 

貌似景色下,风流洒脱帧PCM是由20四十八遍采集样本组成的( 参考 http://discussion.forum.nokia.com/forum/showthread.php?129458-请问PCM格式的音频流,每便读入或输出的块的朗朗上口是必得牢固为4096B么&s=e79e9dd1707157281e3725a163844c49 )。

 

假诺是双声道的公文,采集样本数据按期间前后相继顺序交叉地存入。如图所示:

图片 9 

 

PCM的各样样品值包罗在一个整数i中,i的长短为容纳钦点样板长度所需的蝇头字节数。

首先存款和储蓄低有效字节,表示样板幅度的位放在i的高有效位上,剩下的岗位为0,那样8位和16人的PCM波形样板的多少格式如下所示。

 

    样板大小      数据格式            最小值    最大值

    8位PCM       unsigned int         0       225

    16位PCM      int                -32767    32767

 

 

参考资料:

[1]http://redsoft.ycool.com/post.2232742.html

[2]http://dev.firnow.com/course/3_program/hb/hbxl/20100803/518348.html

[3]http://hi.baidu.com/kindyb/blog/item/0a314f8859489c93a4c27297.html

[4]http://hi.baidu.com/kindyb/blog/item/353f4813df8799055aaf5397.html

[5]http://hi.baidu.com/kindyb/blog/item/2f31daa93f5ed4fb1e17a291.html

[6]http://hi.baidu.com/bigbigant/blog/item/7b91aa01e46dd4021d958317.html

本文由pc28.am发布于pc28.am神测网,转载请注明出处:PCM数据格式,音频管理

上一篇:删除网络中的本地连接,XP系统下oracle完整卸载过 下一篇:没有了
猜你喜欢
热门排行
精彩图文
  • rm命令总计,要做手術
    rm命令总计,要做手術
     功能说明:删除文件、目录 测试删除测试删除测试删除测试删除测试删除测试删除测试删除测试删除测试删除测试删除测试删除测试删除测试删除测试删
  • mv命令总结,Linux基础知识之文件管理命令
    mv命令总结,Linux基础知识之文件管理命令
    cp命令使用: Linux基础知识之文件管理命令(cp、mv、rm) 我们日常工作中对于文件的操作用到最多的几个我觉得应该是是复制、剪切、移动、重命名、删除这
  • windows虚构内部存款和储蓄器机制,有相当多图
    windows虚构内部存款和储蓄器机制,有相当多图
    在windows系统中个,每一种进程具有协和独自的设想地址空间(Virtual AddressSpace)。那大器晚成地点空间的轻重与Computer硬件、操作系统以至应用程序都有涉及。
  • 车辆工程
    车辆工程
  • CentOS6.4 安装MySQL
    CentOS6.4 安装MySQL
    首先我们通过命令yum list | grep mysql看看MySQL是否被安装过 Linux下使用yum安装MySQL,以及启动、登录和远程访问MySQL数据库。 [root@ecs-3c46 /]# yum list | grep mysql