亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解RIFF和WAVE音頻文件格式

 更新時間:2022年01月26日 13:01:03   作者:Brook_icv  
本文主要介紹了RIFF文件的格式和WAV音頻文件格式,為后面實現(xiàn)對WAVE文件的讀寫打一個理論基礎(chǔ)。后面打算使用C++標準庫,實現(xiàn)對WAV文件的讀寫

RIFF file format

RIFF全稱為資源互換文件格式(Resources Interchange File Format),是Windows下大部分多媒體文件遵循的一種文件結(jié)構(gòu)。RIFF文件所包含的數(shù)據(jù)類型由該文件的擴展名來標識,能以RIFF格式存儲的數(shù)據(jù)有:

  • 音頻視頻交錯格式數(shù)據(jù) .AVI
  • 波形格式數(shù)據(jù) .WAV
  • 位圖數(shù)據(jù)格式 .RDI
  • MIDI格式數(shù)據(jù) .RMI
  • 調(diào)色板格式 .PAL
  • 多媒體電影 .RMN
  • 動畫光標 .ANI
  • 其他的RIFF文件 .BND

CHUNK

chunk是RIFF文件的基本單元,其基本結(jié)構(gòu)如下:

struct chunk
{
	uint32_t id;   // 塊標志
	uint32_t size; // 塊大小
	uint8_t data[size]; // 塊數(shù)據(jù)
};
  • id 4字節(jié),用以標識塊中所包含的數(shù)據(jù)。如:RIFF,LIST,fmt,data,WAV,AVI等,由于這種文件結(jié)構(gòu) 最初是由Microsoft和IBM為PC機所定義,RIFF文件是按照小端 little-endian字節(jié)順序?qū)懭氲摹?/li>
  • size 塊大小 存儲在data域中的數(shù)據(jù)長度,不包含id和size的大小
  • data 包含數(shù)據(jù),數(shù)據(jù)以字為單位存放,如果數(shù)據(jù)長度為奇數(shù)(字節(jié)為單位),則最后添加一個空字節(jié)。

chunk是可以嵌套的,但是只有塊標志為RIFF或者LIST的chunk才能包含其他的chunk。

RIFF chunk

標志為RIFF的chunk是比較特殊的,每一個RIFF文件首先存放的必須是一個RIFF chunk,并且只能有這一個標志為RIFF的chunk。RIFF的數(shù)據(jù)域的起始位置是一個4字節(jié)碼(FOURCC),用于標識其數(shù)據(jù)域中chunk的數(shù)據(jù)類型;緊接著數(shù)據(jù)域的內(nèi)容則是包含的subchunk,如下圖

這是一個RIFF chunk中包含有兩個subchunk,可以看出RIFF chunk的數(shù)據(jù)域首先是是4字節(jié)的 Form Type,接著是兩個subchunk,每一個subchun有包含有自己的標識、數(shù)據(jù)域的大小以及數(shù)據(jù)域。
除了RIFF cunk可以嵌套其他的chunk外,另一個可以有subchunk的就是LIST chunk。

上圖中,首先是RIFF文件必須的RIFF chunk,其數(shù)據(jù)域又包含有兩個subchunk,其中一個subchunk的類型為LIST,該LIST chunk又包含了兩個subchunk。

FourCC

FourCC 全稱為Four-Character Codes,是一個4字節(jié)32位的標識符,通常用來標識文件的數(shù)據(jù)格式。例如,在音視頻播放器中,可以通過 文件的FourCC來決定調(diào)用那種CODEC進行視音頻的解碼。例如:DIV3,DIV4,DIVX,H264等,對于音頻則有:WAV,MP3等。對于上面的RIFF文件,則有:RIFF,WAVE,fmt,data等。FourCC是4個ASCII字符,不足四個字符的則在最后補充空格(不是空字符)。比如,F(xiàn)ourCC fmt,實際上是'f' 'm' 't' ' '。
FourCC的生成通??梢允褂萌缦潞辏?/p>

#define MAKE_FOURCC(a,b,c,d) \
( ((uint32_t)d) | ( ((uint32_t)c) << 8 ) | ( ((uint32_t)b) << 16 ) | ( ((uint32_t)a) << 24 ) )

在程序 中還是不要使用太長的宏為好,在C++中可以使用模板和enum結(jié)合的方式。來保證在編譯時期就能夠?qū)ourCC生成出來。

#define FOURCC uint32_t	
template <char ch0, char ch1, char ch2, char ch3> struct MakeFOURCC{ enum { value = (ch0 << 0) + (ch1 << 8) + (ch2 << 16) + (ch3 << 24) }; };
FOURCC fourcc_fmt = MakeFOURCC<'f', 'm', 't', ' '>::value;

將字符常量傳入模板,在結(jié)構(gòu)體中聲明一個enum,編譯器會在編譯時期確定枚舉值,這樣就能給保證FOURCC在編譯就能生成出來。

WAV file

WAV 是Microsoft開發(fā)的一種音頻文件格式,它符合上面提到的RIFF文件格式標準,可以看作是RIFF文件的一個具體實例。既然WAV符合RIFF規(guī)范,其基本的組成單元也是chunk。一個WAV文件通常有三個chunk以及一個可選chunk,其在文件中的排列方式依次是:RIFF chunk,F(xiàn)ormat chunk,F(xiàn)act chunk(附加塊,可選),Data chunk。

一個WAV文件,首先是一個RIFF chunk;RIFF chunk又包含有Format chunk,Data chunk以及可選的Fact chunk。各個chunk中字段的意義如下:

  • RIFF chunk
  • id
  • FOURCC 值為'R' 'I' 'F' 'F'
  • size
  • 其data字段中數(shù)據(jù)的大小 字節(jié)數(shù)
  • data
  • 包含其他的chunk
  • Format chunk
  • id
  • FOURCC 值為 'f' 'm' 't' ' '
  • size
  • 數(shù)據(jù)字段包含數(shù)據(jù)的大小。如無擴展塊,則值為16;有擴展塊,則值為= 16 + 2字節(jié)擴展塊長度 + 擴展塊長度或者值為18(只有擴展塊的長度為2字節(jié),值為0)
  • data

存放音頻格式、聲道數(shù)、采樣率等信息
format_tag
2字節(jié),表示音頻數(shù)據(jù)的格式。如值為1,表示使用PCM格式。
channels
2字節(jié),聲道數(shù)。值為1則為單聲道,為2則是雙聲道。
samples_per_sec
采樣率,主要有22.05KHz,44.1kHz和48KHz。
bytes_per sec
音頻的碼率,每秒播放的字節(jié)數(shù)。samples_per_sec * channels * bits_per_sample / 8,可以估算出使用緩沖區(qū)的大小
block_align
數(shù)據(jù)塊對齊單位,一次采樣的大小,值為聲道數(shù) * 量化位數(shù) / 8,在播放時需要一次處理多個該值大小的字節(jié)數(shù)據(jù)。
bits_per_sample
音頻sample的量化位數(shù),有16位,24位和32位等。
cbSize
擴展區(qū)的長度
擴展塊內(nèi)容
22字節(jié),具體介紹,后面補充。

  • Fact chunk(option)
  • id
  • FOURCC 值為 'f' 'a' 'c' 't'
  • size
  • 數(shù)據(jù)域的長度,4(最小值為4)
  • 采樣總數(shù) 4字節(jié)
  • Data chunk
  • id

FOURCC 值為'd' 'a' 't' 'a'

  • size

數(shù)據(jù)域的長度

  • data

具體的音頻數(shù)據(jù)存放在這里

采用壓縮編碼的WAV文件,必須要有Fact chunk,該塊中只有一個數(shù)據(jù),為每個聲道的采樣總數(shù)。

Format chunk 中的編碼方式

在Format chunk中,除了有音頻的數(shù)據(jù)的采樣率、聲道等音頻的屬性外,另一個比較主要的字段就是format_tag,該字段表示音頻數(shù)據(jù)是以何種方式編碼存放的。其具體的取值可以為以下:

  • 0x0001

WAVE_FORMAT_PCM,采用PCM格式

  • 0x0003

WAVE_FORMAT_IEEE_FLOAT,存放的值為IEEE float,范圍為[-1.0f,1.0f]

  • 0x0006

WAVE_FORMAT_ALAW , 8bit ITU-T G.711 A-law

  • 0x0007

WAVE_FORMAT_MULAW,8bit ITU-T G.711 μ-law

  • 0XFFFE

WAVE_FORMAT_EXTENSIBLE,具體的編碼方式有擴展區(qū)的 sub_format字段決定

關(guān)于擴展格式塊

當(dāng)WAV文件使用的不是PCM編碼方式是,就需要擴展格式塊,它是在基本的Format chunk又添加一段數(shù)據(jù)。該數(shù)據(jù)的前兩個字節(jié),表示的擴展塊的長度。緊接其后的是擴展的數(shù)據(jù)區(qū),含有擴展的格式信息,其具體的長度取決于壓縮編碼的類型。當(dāng)某種編碼方式(如 ITU G.711 a-law)使擴展區(qū)的長度為0,擴展區(qū)的長度字段還必須保留,只是其值設(shè)置為0。
擴展區(qū)的各個字節(jié)的含義如下:

size 2字節(jié)
擴展區(qū)的數(shù)據(jù)長度 ,可以為0或22

  • valid_bits_per_sample 2字節(jié)

有效的采樣位數(shù),最大值為采樣字節(jié)數(shù) * 8??梢允褂酶`活的量化位數(shù),通常音頻sample的量化位數(shù)為8的倍數(shù),但是使用了WAVE_FORMAT_EXTENSIBLE時,量化的位數(shù)有擴展區(qū)中的valid bits per sample來描述,可以小于Format chunk中制定的bits per sample。

  • channle mask 4字節(jié)

聲道掩碼

  • sub format 16字節(jié)

GUID,include the data format code,數(shù)據(jù)格式碼。

在Format chunk中的format_tag設(shè)置為0xFFFE時,表示使用擴展區(qū)中的sub_format來決定音頻的數(shù)據(jù)的編碼方式。在以下幾種情況下必須要使用WAVE_FORMAT_EXTENSIBLE

  • PCM數(shù)據(jù)的量化位數(shù)大于16
  • 音頻的采樣聲道大于2
  • 實際的量化位數(shù)不是8的倍數(shù)
  • 存儲順序和播放順序不一致,需要指定從聲道順序到聲卡播放順序的映射情況。

Data chunk

Data塊中存放的是音頻的采樣數(shù)據(jù)。每個sample按照采樣的時間順序?qū)懭?,對于使用多個字節(jié)的sample,使用小端模式存放(低位字節(jié)存放在低地址,高位字節(jié)存放在高地址)。對于多聲道的sample采用交叉存放的方式。例如:立體雙聲道的sample存儲順序為:聲道1的第一個sample,聲道2的第一個sample;聲道1的第二個sample,聲道2的第二個sample;依次類推....。對于PCM數(shù)據(jù),有以下兩種的存儲方式:

  • 單聲道,量化位數(shù)為8,使用偏移二進制碼
  • 除上面之外的,使用補碼方式存儲。

總結(jié)

本文主要介紹了RIFF文件的格式和WAV音頻文件格式,為后面實現(xiàn)對WAVE文件的讀寫打一個理論基礎(chǔ)。后面打算使用C++標準庫,實現(xiàn)對WAV文件的讀寫。

到此這篇關(guān)于RIFF和WAVE音頻文件格式的文章就介紹到這了,更多相關(guān)RIFF和WAVE音頻格式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在地址欄里顯示logo的實現(xiàn)方法

    在地址欄里顯示logo的實現(xiàn)方法

    在地址欄里顯示logo,其實大家可以看一些網(wǎng)站的頭部里面,下面的方法講的更仔細。
    2009-02-02
  • vscode修改默認瀏覽器的方法

    vscode修改默認瀏覽器的方法

    本文給大家介紹的是如何實現(xiàn)Vscode瀏覽器打開html頁面的方法,非常的實用,有需要的小伙伴可以查看下
    2020-02-02
  • git rebase -i合并多次提交的實現(xiàn)

    git rebase -i合并多次提交的實現(xiàn)

    這篇文章主要介紹了git rebase -i合并多次提交的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 網(wǎng)站開發(fā)中的文件存儲目錄結(jié)構(gòu)的探討

    網(wǎng)站開發(fā)中的文件存儲目錄結(jié)構(gòu)的探討

    網(wǎng)站應(yīng)用中經(jīng)常會有文件存儲的需求,目錄結(jié)構(gòu)該怎么建才好呢?讓我們來做下分析
    2010-07-07
  • 在IDEA2020.2中配置使用Git的詳細教程

    在IDEA2020.2中配置使用Git的詳細教程

    這篇文章主要介紹了在IDEA2020.2中配置使用Git的詳細教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Jenkins打包、發(fā)布及部署詳細全過程

    Jenkins打包、發(fā)布及部署詳細全過程

    我們要正式的使用jenkins了,第一個任務(wù)就是自動化打包部署項目,下面這篇文章主要給大家介紹了關(guān)于Jenkins打包、發(fā)布及部署的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • git通過內(nèi)網(wǎng)代理訪問外網(wǎng)的相關(guān)配置方法

    git通過內(nèi)網(wǎng)代理訪問外網(wǎng)的相關(guān)配置方法

    這篇文章主要介紹了git通過內(nèi)網(wǎng)代理,訪問外網(wǎng)的相關(guān)配置,配置git代理以http代理為例,給大家詳細講解,需要的朋友可以參考下
    2023-05-05
  • git clone 子模塊沒下載全的問題解決

    git clone 子模塊沒下載全的問題解決

    這篇文章主要介紹了git clone 子模塊沒下載全的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • vs2019生成dll并調(diào)用的實現(xiàn)示例

    vs2019生成dll并調(diào)用的實現(xiàn)示例

    這篇文章主要介紹了vs2019生成dll并調(diào)用的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 如何禁止瀏覽器使用后退按鈕功能

    如何禁止瀏覽器使用后退按鈕功能

    瀏覽器的后退按鈕使得我們能夠方便地返回以前訪問過的頁面,它無疑非常有用。但有時候我們不得不關(guān)閉這個功能,以防止用戶打亂預(yù)定的頁面訪問次序。
    2014-09-09

最新評論