By: Ailson Jack
Date: 2020.01.31
個人博客:http://www.only2fire.com/
本文在我博客的地址是:http://www.only2fire.com/archives/112.html,排版更好,便於學習,也可以去我博客逛逛,興許有你想要的內容呢。
1、簡介
RIFF(Resources Interchange File Format)中文翻譯爲資源互換文件格式,是Windows下大部分多媒體文件遵循的一種文件結構。RIFF文件所包含的數據類型由該文件的擴展名來標識,能以RIFF格式存儲的數據有:
- 音頻視頻交錯格式數據 .AVI
- 波形格式數據 .WAV
- 位圖數據格式 .RDI
- MIDI格式數據 .RMI
- 調色板格式 .PAL
- 多媒體電影 .RMN
- 動畫光標 .ANI
- 其他的RIFF文件 .BND
2、chunk
chunk(區塊)是RIFF文件的基本單元,RIFF文件由不同數量的chunk組成,每個chunk由“標識符”、“數據大小”和“數據”三個部分組成,“標識符”和“數據大小”都是佔用 4 個字節空間,chunk的基本結構如下所示:
struct chunk
{
uint32_t ID; //塊標識符
uint32_t Size; //塊數據大小
uint8_t Data[Size]; //塊數據
};
ID:由4個ASCII字符組成,用以識別塊中所包含的數據。如:'RIFF','LIST','fmt ','data','WAV ','AVI '等,這種文件結構最初是由Microsoft和IBM爲PC機所定義,所以RIFF文件是按照小端字節順序寫入的。
Size:塊數據大小,存儲在Data域中的數據長度,不包含ID和Size的大小。
Data:塊數據,數據以字爲單位存放,如果數據長度爲奇數(字節爲單位),則最後添加一個空字節。
chunk是可以嵌套的,但是隻有塊標識符爲'RIFF'或者'LIST'的chunk才能包含其他的chunk。
3、FourCC
FourCC(Four Character Codes)是一個4字節32位的標識符,通常用來標識文件的數據格式。例如,在音視頻播放器中,可以通過文件的FourCC來決定調用哪種CODEC進行音視頻的解碼。例如:DIV3,DIV4,DIVX,H264等,對於音頻則有:WAV,MP3等。FourCC是4個ASCII字符,不足四個字符的則在最後補充空格(不是空字符)。比如,FourCC fmt,實際上是'f' 'm' 't' ' '。
4、RIFF chunk和LIST chunk
塊標識符ID爲'RIFF'的chunk是比較特殊的,每一個RIFF文件首先存放的必須是一個RIFF chunk,並且只能有一個標識符爲'RIFF'的chunk。RIFF chunk的數據域的起始位置是一個4字節的FormType(FourCC格式),用於標識RIFF chunk數據域中所包含的chunk的數據類型。緊接着FormType之後的數據域的內容則是RIFF chunk所包含的subchunk。一個簡單的RIFF chunk的示意圖如下所示:
上圖中的RIFF chunk包含有兩個subchunk,可以看出RIFF chunk的數據域首先是4字節的FormType,接着是兩個subchunk,每一個subchunk又包含有自己的標識符、數據域的大小以及數據域。
除了RIFF chunk可以嵌套其他的chunk外,另一個可以包含subchunk的就是LIST chunk,其示意圖如下所示:
上圖中,首先是RIFF文件必須的RIFF chunk,其數據域又包含有兩個subchunk,其中一個subchunk的類型爲'LIST',該LIST chunk又包含了兩個subchunk。
RIFF chunk和LIST chunk的基本結構如下所示:
struct chunk
{
uint32_t ID; //塊標識符: 'RIFF'或者'LIST'
uint32_t Size; //塊數據大小
struct ChunkData { //塊數據
uint32_t Type; //包含的subchunk的數據類型, 與上面圖中的FormType和ListType對應
uint8_t Data[Size-4]; //包含的subchunk
};
};
備註:一個RIFF文件的總大小爲:RIFF chunk的Size+8,這裏的8是ID和Size所佔用的空間。
如果覺得文章寫的不錯,對你有幫助,歡迎點贊,關注博主喲!
排版更好的內容見我博客的地址:http://www.only2fire.com/archives/112.html
注:轉載請註明出處,謝謝!^_^