AIFF格式容器规范
1、?? ?AIFF Container概念:
? ? 1)AIFF是音頻交換文件格式(Audio Interchange File Format)的英文縮寫,是Apple公司開發的一種聲音文件格式,是一種文件格式存儲的數字音頻(波形)的數據;
?? ?2)AIFF應用于個人電腦及其它電子音響設備以存儲音樂數據;
?? ?3)AIFF支持ACE2、ACE8、MAC3和MAC6壓縮,支持16位44.1kHz立體聲;
?? ?4)AIFF是Apple蘋果電腦上面的標準音頻格式,屬于QuickTime技術的一部分。
2、AIFF Container規范:
1)數據類型:
?? ??? ?char、unsigned char;
?? ??? ?short、unsigned short;
?? ??? ?long、unsigned long;
?? ??? ?extends:80位IEEE標準754浮點數(標準Apple數字環境[SANE]數據類型擴展)。
?? ??? ?pstring:Pascal樣式的字符串,一個字節計數后跟文本字節。 此數據類型中的總字節數應為偶數。可以在文本末尾添加填充字節以完成此操作。該填充字節不會反映在計數中。
?? ??? ?ID:32位,在''(SP,0x20)到'~'(0x7E)范圍內的四個可打印ASCII字符的串聯。空格(0x20)不能在打印字符之前; 允許尾隨空格。禁止控制字符。
?? ??? ?OSType:32位。內部定義的由四個字符組成的串接。
?? ??? ?文件字節順序:大端模式,一些格式包含little-endian聲音數據。
?? ?2)文件結構:
?? ??? ?Audio IFF符合“EA IFF 85”標準。“EA IFF 85”文件由許多數據塊組成。
?? ??? ?塊是“EA IFF 85”文件的組件,塊由一些header information(ckID、ckSize)和data組成。
?? ??? ?用C結構體表示為:
?? ??? ?typedef struct {
?? ??? ??? ?ID ckID; ?? ??? ?/* chunk ID */
?? ??? ??? ?long ckSize; ?? ?/* chunk Size */
?? ??? ??? ?char ckData[]; ?? ?/* data */
?? ??? ?} Chunk;
?? ??? ?ckID描述數據塊的數據部分的格式。程序可以通過檢查ckID來確定如何解釋塊數據。
?? ??? ?ckSize是塊的數據部分的大小,以字節為單位。它不包括ckID和ckSize使用的8個字節。
?? ??? ?ckData包含存儲在塊中的數據。此數據的格式由ckID決定。如果數據長度為奇數字節,則必須在末尾添加零填充字節。ckSize中不包含填充字節。
?? ??? ?Audio IFF文件中的塊在容器塊中組合在一起。 “EA IFF 85”定義了許多容器塊,但Audio IFF使用的容器塊稱為FORM。 FORM具有以下格式:
?? ??? ?typedef struct {
?? ??? ??? ?ID ckID;
?? ??? ??? ?long ckSize;
?? ??? ??? ?ID formType;
?? ??? ??? ?char chunks[];
?? ??? ?} Chunk;
?? ??? ?ckID始終是'FORM'。這表明這是一個FORM chunk。
?? ??? ?ckSize包含'FORM'塊的數據部分的大小。請注意,數據部分已分為兩部分,formType和chunks []。
?? ??? ?formType描述'FORM'塊中的內容。對于Audio IFF文件,formType始終為“AIFF”。
?? ??? ?這表示FORM中的塊與采樣聲音有關。FORMType為“AIFF”的FORM塊稱為FORM AIFF。塊是FORM中包含的塊。這些塊稱為本地塊。FORM AIFF及其本地塊構成Audio IFF文件。
?? ?3)Local Chunk Types(本地塊類型):
?? ??? ?有兩種類型的塊,一種是必需的,另一種是可選的。公共塊是必需的。如果采樣的聲音長度大于零,則需要聲音數據塊。所有其他塊都是可選的。所有使用表單AIFF的應用程序都必須能夠讀取所需的塊,并且可以選擇選擇性地忽略可選塊。復制FORM AIFF的程序應該復制FOEM AIFF中的所有塊。
?? ?4)Common Chunk(公共塊):
?? ??? ?公共塊描述采樣聲音的基本參數,定義如下:
?? ??? ?#define CommonID 'COMM' /* ckID for Common Chunk */
?? ??? ?typedef struct {
?? ??? ??? ?ID ckID;
?? ??? ??? ?long ckSize;
?? ??? ??? ?short numChannels;
?? ??? ??? ?unsigned long numSampleFrames;
?? ??? ??? ?short sampleSize;
?? ??? ??? ?extended sampleRate;
?? ??? ?} CommonChunk;
?? ??? ?ckID總是“COMM”。ckSize是塊的數據部分的大小,以字節為單位。
?? ??? ?它不包括ckID和ckSize使用的8個字節。對于普通塊,ckSize總是18。?
?? ??? ?numChannels包含聲音的音頻通道的數量。值1表示單聲道聲音,值2表示立體聲,值4表示四聲道聲音,等等??梢员硎救魏螖盗康囊纛l通道。
?? ??? ?實際的聲音樣本存儲在另一個塊中,即聲音數據塊。對于多通道聲音,每個通道的單采樣點是交錯的。 一組交錯的樣本點稱為樣本幀。
?? ??? ?對于單聲道聲音,一個采樣幀是一個單采樣點。?
?? ??? ?numSampleFrames包含Sound Data Chunk中的樣本幀數。numSampleFrames是樣本幀的數量,而不是Sound Data Chunk中的字節數和采樣點數。文件中的采樣點總數為numSampleFrames的numChannels倍。
?? ??? ?sampleSize是每個采樣點中的位數。它可以是1到32之間的任何數字。
?? ??? ?sampleRate是聲音被回放的采樣率,以每秒采樣幀數為單位。
?? ??? ?每個FORM AIFF都只需要一個公共塊。?
?? ?5)Sound Data Chunk(聲音數據塊):
?? ??? ?聲音數據塊包含實際的樣本幀。
?? ??? ?#define SoundDataID 'SSND' /* ckID for Sound Data Chunk */
?? ??? ?typedef struct {
?? ??? ??? ?ID ckID;
?? ??? ??? ?long ckSize;
?? ??? ??? ?unsigned long offset;
?? ??? ??? ?unsigned long blockSize;
?? ??? ??? ?unsigned char soundData[];
?? ??? ?} SoundDataChunk;
?? ??? ?ckID總是'SSND'。
?? ??? ?ckSize是塊的數據部分的大小,以字節為單位。它不包括ckID和ckSize使用的8個字節。
?? ??? ?offset確定soundData中第一個樣本幀的開始位置。offset以字節為單位。大多數應用程序不會使用偏移量,應將其設置為零。
? ? ? ? blockSize與偏移量一起用于塊對齊聲音數據。它包含聲音數據對齊到的塊的字節大小。與偏移量一樣,大多數應用程序不會使用塊大小,應該將其設置為零。
?? ??? ?soundData包含組成聲音的示例幀。soundData中的樣本幀數由Common Chunk中的numSampleFrames參數確定。
?? ?6)Marker Chunk(標記塊)
?? ??? ?標記塊包含指向聲音數據中位置的標記。標記可用于應用程序所需的任何目的。
?? ??? ?標記具有一下格式:
?? ??? ?typedef short MarkerId;
?? ??? ?typedef struct {
?? ??? ??? ?MarkerId id;
?? ??? ??? ?unsigned long position;
?? ??? ??? ?pstring markerName;
?? ??? ?} Marker;
?? ??? ?id是唯一標識FORM AIFF中標記的數字。id可以是任何正的非零整數,只要同一FORM AIFF中的其他標記沒有相同的id。
?? ??? ?標記在聲音數據中的位置由position確定。標記在概念上落在兩個樣本幀之間。位置的單位為幀而不是字節。
?? ??? ?/*前面的8是什么*/markerName是一個帕斯卡風格的文本字符串,包含標記的名稱。
?
?? ??? ?標記塊內數據的格式如下所示。
?? ??? ?#define MarkerID 'MARK' /* ckID for Marker Chunk */
?? ??? ?typedef struct {
?? ??? ??? ?ID ckID;
?? ??? ??? ?long ckSize;
?? ??? ??? ?unsigned short numMarkers;
?? ??? ??? ?Marker Markers[];
?? ??? ?} MarkerChunk;
?? ??? ?ckID總是“MARK”。
?? ??? ?ckSize是塊的數據部分的大小,以字節為單位。它不包括ckID和ckSize使用的8個字節。
?? ??? ?nummarker是標記塊中的標記數量。
?? ?7)Instrument Chunk(儀器塊):
?? ??? ?Instrument Chunk定義了儀器(如采樣器)可用于回放聲音數據的基本參數。
?? ??? ?
?? ??? ?聲音數據可以循環,允許重復聲音的一部分以延長聲音。下面的結構描述了一個循環:
?? ??? ?typedef struct {
?? ??? ??? ?short playMode;
?? ??? ??? ?MarkerId beginLoop;
?? ??? ??? ?MarkerId endLoop;
?? ??? ?} Loop;
?? ??? ?
?? ??? ?playMode指定要執行哪種類型的循環。
?? ??? ?#define NoLooping 0
?? ??? ?#define ForwardLooping 1
?? ??? ?#define ForwardBackwardLooping 2
?? ??? ?如果指定了NoLooping,那么在回放期間將忽略循環點。
?? ??? ?
?? ??? ?beginLoop是一個Markerid,用于標記循環段的開始位置。?
?? ??? ?endLoop標記一個循環的結束位置。起始位置必須小于結束位置。
?? ??? ?
?? ??? ?Instrument Chunk Format(工具塊格式):
?? ??? ??? ?工具數據塊中的數據格式如下所述:
?? ??? ??? ?#define InstrumentID 'INST' /* ckID for Instrument Chunk */
?? ??? ??? ?typedef struct {
?? ??? ??? ??? ?ID ckID;
?? ??? ??? ??? ?long ckSize;
?? ??? ??? ??? ?char baseNote;
?? ??? ??? ??? ?char detune;
?? ??? ??? ??? ?char lowNote;
?? ??? ??? ??? ?char highNote;
?? ??? ??? ??? ?char lowVelocity;
?? ??? ??? ??? ?char highVelocity;
?? ??? ??? ??? ?short gain;
?? ??? ??? ??? ?Loop sustainLoop;
?? ??? ??? ??? ?Loop releaseLoop;
?? ??? ??? ?} InstrumentChunk;
?? ??? ??? ?
?? ??? ??? ?ckID始終是'INST'。ckSize是塊的數據部分的大小,以字節為單位。對于儀器塊,ckSize始終為20。
?? ??? ??? ?baseNote是工具在沒有音調修改的情況下播放聲音數據的注釋。單位是MIDI(MIDI是樂器數字接口的首字母縮寫)音符編號,范圍是0到127.中間C是60。
?? ??? ??? ?detune決定工具在播放時應改變聲音音高的程度。單位為美分(半音的1/100),范圍從-50到+50。負數表示聲音的音高應該降低,而正數表示應該提高聲音的音高。
? ? ? ? ? ? lowNote和highNote指定鍵盤上的建議范圍以播放聲音數據。如果要求樂器在低音符和高音符之間播放音符,則應播放聲音數據。基調不必在此范圍內。lowNote和highNote的單位是MIDI音符值。
?? ??? ??? ?lowVelocity和highVelocity指定播放聲音數據的建議速度范圍。如果音符開啟速度介于低速和高速之間,則應播放聲音數據。單位是MIDI速度值,1(最低速度)到127(最高速度)。
?? ??? ??? ?gain(增益)是在播放時改變聲音增益的量。單位是分貝。例如,0 db表示沒有變化,6 db表示每個采樣點的值加倍,而-6 db表示每個采樣點的值減半。
?? ??? ??? ?sustainLoop指定一個循環,當工具維持聲音時要播放該循環。
?? ??? ??? ?releaseLoop指定當樂器處于播放聲音的釋放階段時要播放的循環。釋放階段通常在樂器上的鍵釋放后發生。
?? ??? ??? ?
?? ??? ??? ?Instrument Chunk是可選的。FORM AIFF中只能出現一個Instrument Chunk。
?? ??? ??? ?
?? ?8)MIDI Data Chunk(MIDI數據塊):
?? ??? ?MIDI數據塊可用于存儲MIDI數據。結構定義如下:
?? ??? ?#define MIDIDataID 'MIDI' /* ckID for MIDI Data Chunk */
?? ??? ?typedef struct {
?? ??? ??? ?ID ckID;
?? ??? ??? ?long ckSize;
?? ??? ??? ?unsigned char MIDIdata[];
?? ??? ?} MIDIDataChunk;
?? ??? ?
?? ??? ?ckID總是'MIDI'。ckSize是塊的數據部分的大小,以字節為單位。它不包括ckID和ckSize使用的8個字節。
?? ??? ?MIDIData包含MIDI數據流。
?? ??? ?MIDI數據塊是可選的。FORM AIFF中可能存在任意數量的MIDI數據塊。如果要將多個樂器的MIDI系統專用信息存儲在FORM AIFF中,最好每個樂器使用一個MIDI數據塊,而不是所有樂器使用一個大的MIDI數據塊。
?? ?
?? ?9)Audio Recording Chunk(錄音塊)
?? ??? ?錄音塊包含與錄音設備有關的信息。結構定義如下:
?? ??? ?#define AudioRecordingID 'AESD' /* ckID for Audio Recording Chunk. */
?? ??? ?typedef struct {
?? ??? ??? ?ID ckID;
?? ??? ??? ?long ckSize;
?? ??? ??? ?unsigned char AESChannelStatusData[24];
?? ??? ?} AudioRecordingChunk;
?? ??? ?
?? ??? ?ckID始終是'AESD'。ckSize是塊的數據部分的大小,以字節為單位。對于錄音塊,ckSize始終為24。
?? ??? ?AESChannelStatusData的24個字節在AES推薦的數字音頻工程實踐 - 線性表示的數字音頻數據的串行傳輸格式,第7.1節,通道狀態數據中規定。該文件描述了用于音頻設備之間的數字音頻的實時數字傳輸的格式。為方便起見,此信息在音頻記錄塊中重復。一般感興趣的是字節0的位2,3和4,它們描述了記錄強調。
?? ??? ?音頻錄制塊是可選的。FORM AIFF中不得出現多個音頻錄制塊。
?? ?
?? ?10)Application Specific Chunk(應用程序特殊塊)
?? ??? ?Application Specific Chunk可以用于應用程序制造商的任何目的。結構如下:
?? ??? ?
?? ??? ?#define ApplicationSpecificID 'APPL' /* ckID for Application Specific Chunk. */
?? ??? ?typedef struct {
?? ??? ??? ?ID ckID;
?? ??? ??? ?long ckSize;
?? ??? ??? ?OSType applicationSignature;
?? ??? ??? ?char data[];
?? ??? ?} ApplicationSpecificChunk;
?? ??? ?
?? ??? ?ckID總是'APPL'。ckSize是塊的數據部分的大小,以字節為單位。它不包括ckID和ckSize使用的8個字節。
?? ??? ?applicationSignature標識特定的應用程序。
?? ??? ?data是Application Specific Chunk的數據。
?? ??? ?Application Specific Chunk是可選的。單個FORM AIFF中可能存在任意數量的Application Specific Chunk。
?? ?
?? ?11)Comments Chunk(注釋塊)
?? ??? ?Comments Chunk用于在FORM AIFF中存儲注釋?!癊A IFF 85”有一個可用于注釋的注釋塊,但是注釋塊有兩個在“EA IFF 85”塊中找不到的功能。它們是:1)評論的時間戳;2)指向標記的鏈接。
?? ??? ?Comments由時間戳,標記ID和文本計數跟文本組成。結構如下:
?? ??? ?typedef struct {
?? ??? ?unsigned long timeStamp;
?? ??? ??? ?MarkerID marker;
?? ??? ??? ?unsigned short count;
?? ??? ??? ?char text;
?? ??? ?} Comment;
?? ??? ?timeStamp表示Comments的創建時間。單位是自1904年1月1日以來的秒數。
?? ??? ?Comments可以鏈接到標記。這允許應用程序將標記的長描述存儲為Comments。如果Comments指的是標記,則marker是該標記的ID。否則,標記為零,表示此Comments未鏈接到標記。
?? ??? ?count是組成Comments的文本的長度。這是一個16位的數量,允許比pstring更長的Comments。
?? ??? ?text包含Comments本身。必須在末尾用一個字節填充此文本,以確保它的長度為偶數個字節。該填充字節(如果存在)不包括在計數中。
?? ??? ?
?? ??? ?Comments Chunk Format:
?? ??? ?
?? ??? ??? ?#define CommentID 'COMT' /* ckID for Comments Chunk. */
?? ??? ??? ?typedef struct {
?? ??? ??? ??? ?ID ckID;
?? ??? ??? ??? ?long ckSize;
?? ??? ??? ??? ?unsigned short numComments;
?? ??? ??? ??? ?Comment comments[];
?? ??? ??? ?} CommentsChunk;
?? ??? ??? ?ckID總是'COMT'。ckSize是塊的數據部分的大小,以字節為單位。它不包括ckID和ckSize使用的8個字節。
?? ??? ??? ?numComments包含Comments Chunk中的Comments數。接下來是Comments本身。Comments長度總是為偶數個字節,因此Comments Chunk中的Comments之間沒有填充。
?? ??? ??? ?Comments Chunk是可選的。一個FORM AIFF中只能出現一個Comments Chunk。
?? ?12)Text Chunks - Name, Author, Copyright, Annotation(文本塊 - 名稱,作者,版權,注釋)?? ?
?? ??? ?這四個塊包含在每個“EA IFF 85”文件的定義中。全是文本塊;他們的數據部分僅由文本組成。這些塊中的每一個都是可選的。
?? ??? ?#define NameID 'NAME' /* ckID for Name Chunk. */
?? ??? ?#define AuthorID 'AUTH' /* ckID for Author Chunk. */
?? ??? ?#define CopyrightID '(c) ' /* ckID for Copyright Chunk. */
?? ??? ?#define AnnotationID 'ANNO' /* ckID for Annotation Chunk. */
?? ??? ?typedef struct {
?? ??? ??? ?ID ckID;
?? ??? ??? ?long ckSize;
?? ??? ??? ?char text[];
?? ??? ?} TextChunk;
?? ?
?? ??? ?ckID是“NAME”,“AUTH”,“(c)”或“ANNO”,具體取決于塊是否分別為Name Chunk,Author Chunk,Copyright Chunk或Annotation Chunk。對于版權塊,'c'是小寫的,并且在右括號后面有一個空格(0x20)。
?? ??? ?ckSize是塊的數據部分的大小,在本例中是文本。
?? ??? ?text包含純ASCII字符。它不是pstring也不是C字符串。text中的字符數由ckSize確定。text內容取決于塊,如下所述:?
?? ??? ?
?? ??? ?Name Chunk:
?? ??? ??? ?text包含采樣聲音的名稱。名稱塊是可選的。FORM AIFF中可能只存在一個名稱塊。
?? ??? ?Author Chunk:
?? ??? ??? ?text包含一個或多個作者姓名。在這種情況下,作者是采樣聲音的創建者。作者塊是可選的。FORM AIFF中可能只存在一個作者塊。?? ?
?? ??? ?Copyright Chunk:
?? ??? ??? ?版權塊包含聲音的版權聲明。文本包含版權所有者遵循的日期。
?? ??? ??? ?版權塊是可選的。FORM AIFF中可能只存在一個版權塊。
?? ??? ?Annotation Chunk:
?? ??? ??? ?text包含評論。在FORM AIFF中不鼓勵使用此塊。應該使用功能更強大的Comments Chunk。Annotation Chunk是可選的。FORM AIFF中可能存在許多Annotation Chunk。
?? ?
?? ?13)Chunk Precedence(塊優先級)
?? ??? ?FORM AIFF的幾個本地塊可能包含重復信息。例如,樂器塊定義了循環點,MIDI數據塊中的MIDI系統專用數據也可以定義循環點。如果這些循環點不同會發生什么?應用程序應該如何循環聲音?
?? ??? ?通過定義塊的優先級來解決此類沖突:?
?? ??? ??? ?Common Chunk(Highest Precedence)->?
?? ??? ??? ?Sound Data Chunk ->?
?? ??? ??? ?Marker Chunk ->?
?? ??? ??? ?Instrument Chunk ->?
?? ??? ??? ?Comment Chunk ->?
?? ??? ??? ?Name Chunk ->?
?? ??? ??? ?Author Chunk ->?
?? ??? ??? ?Copyright Chunk ->?
?? ??? ??? ?Annotation Chunk ->
?? ??? ??? ?Audio Recording Chunk ->
?? ??? ??? ?MIDI Data Chunk ->
?? ??? ??? ?Application Specific Chunk(Lowest Precedence)
?? ??? ?Common Chunk具有最高優先級,而Application Specific Chunk具有最低優先級。
?? ??? ?Common Chunk中的信息始終優先于任何其他塊中的沖突信息。Application Specific Chunk總是在與其他塊沖突時丟失。
?? ??? ?例如,通過查看塊層次結構,可以看到Instrument Chunk中的循環點優先于MIDI數據塊中發現的沖突循環點。
?? ??? ?應用程序負責將數據寫入較低優先級的塊,以確保更高優先級的塊相應地更新。
參考:http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/AIFF/AIFF.html
總結
以上是生活随笔為你收集整理的AIFF格式容器规范的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安全操作规程规范培训PPT模板
- 下一篇: 牛客网笔试真题 2021 阿里巴巴编程题