AIFF-C压缩格式容器规范解析
1、AIFF-C與AIFF的區(qū)別和注意事項(xiàng):
? ? (1)AIFF-C和AIFF的區(qū)別:
?? ??? ?1)FORM標(biāo)識(shí)符已從“AIFF”更改為“AIFC”。這將AIFF-C文件與AIFF文件區(qū)分開(kāi)來(lái)。
?? ??? ?2)Common Chunk已擴(kuò)展為包含壓縮類(lèi)型ID和壓縮類(lèi)型名稱。因此,AIFF-C能夠存儲(chǔ)從任何壓縮算法生成的壓縮音頻數(shù)據(jù)。
?? ??? ?3)Sound Data Chunk可以包含壓縮音頻數(shù)據(jù)。Chunk格式尚未修改。
?? ??? ?4)Sound Accelerator(Saxel)Chunk是全新的。它旨在消除在由標(biāo)記定義的隨機(jī)點(diǎn)開(kāi)始播放時(shí)由解壓縮算法引起的初始偽像。
?? ??? ?5)Format Version Chunk是新的。此Chunk旨在為AIFF-C規(guī)范的未來(lái)潛在升級(jí)提供平滑過(guò)渡。
?? ?(2)注意事項(xiàng):
?? ??? ?1)Chunk Ordering(塊排序)
?? ??? ??? ?塊沒(méi)有順序!它們可能以任何順序出現(xiàn)在AIFF文件中。
?? ??? ??? ?應(yīng)用程序讀取AIFF文件應(yīng)該被設(shè)計(jì)為獲取塊,識(shí)別它,然后處理它,而不是假設(shè)它被識(shí)別之前它是什么塊。
?? ??? ?2)Modifying Chunks(修改Chunks)?? ?
?? ??? ??? ?如果應(yīng)用程序允許修改Chunk,您還必須負(fù)責(zé)更新基于修改的Chunk的其他Chunks。
?? ??? ?3)Registering New Compression Types(注冊(cè)新的壓縮類(lèi)型)?? ?
?? ??? ??? ?您必須向Apple注冊(cè)壓縮類(lèi)型才能建立正式的compressionType和compressionName。
?? ??? ??? ?您還應(yīng)該為壓縮類(lèi)型描述Sound Accelerator Chunk的格式和用法。
?? ??? ?4)Number of Sample Frames(樣本幀數(shù))
?? ??? ??? ?文件中包含的樣本幀數(shù)的是從Common Chunk中的numSampleFrames參數(shù)獲得的,而不是Sound Data Chunk中的ckDataSize參數(shù)。
?? ??? ?5)Remember the Pad Byte!(記住填充字節(jié))
?? ??? ??? ?每個(gè)Chunk必須包含偶數(shù)個(gè)字節(jié)。對(duì)于總內(nèi)容將產(chǎn)生奇數(shù)字節(jié)數(shù)的塊,必須在塊的末尾添加零填充字節(jié)。此填充字節(jié)不包含在ckDataSize中。
?? ??? ?6)Format Version Chunk(格式版本Chunk)
?? ??? ??? ?Format Version Chunk中標(biāo)題為“何時(shí)讀取AIFF-C文件”的部分特別重要。
2、AIFF-C壓縮格式規(guī)范:
? ? (1)INTRODUCTION(介紹)
?? ??? ?音頻交換文件格式AIFF-C為存儲(chǔ)未壓縮或壓縮的采樣聲音提供了標(biāo)準(zhǔn)。
?? ??? ?該格式可以存儲(chǔ)一系列采樣率和樣本寬度的單聲道或多聲道采樣聲音。
?? ??? ?該格式是可擴(kuò)展的,以處理新的壓縮類(lèi)型和特定應(yīng)用程序的數(shù)據(jù)。
?? ??? ?AIFF-C基于Audio IFF(AIFF),它符合Electronic Arts開(kāi)發(fā)的“EA IFF 85”交換格式文件標(biāo)準(zhǔn)。
?? ??? ?AIFF-C專為交換而設(shè)計(jì),盡管應(yīng)用程序設(shè)計(jì)人員應(yīng)該發(fā)現(xiàn)它足夠靈活,可以用作日常數(shù)據(jù)存儲(chǔ)格式。
?? ??? ?如果應(yīng)用程序使用不同的存儲(chǔ)格式,它可以轉(zhuǎn)換為此處定義的AIFF-C格式。這將有助于在應(yīng)用程序之間和各種計(jì)算機(jī)平臺(tái)之間共享聲音數(shù)據(jù)。
?? ??? ?1)Data types(數(shù)據(jù)類(lèi)型)
?? ??? ??? ?char、unsigned char;
? ?? ??? ??? ?short、unsigned short;
? ?? ??? ??? ?long、unsigned long;
? ?? ??? ??? ?extends:80位IEEE標(biāo)準(zhǔn)754浮點(diǎn)數(shù)(標(biāo)準(zhǔn)Apple數(shù)字環(huán)境[SANE]數(shù)據(jù)類(lèi)型擴(kuò)展)。
?? ??? ??? ?pstring:Pascal樣式的字符串,一個(gè)字節(jié)計(jì)數(shù)后跟文本字節(jié)。 此數(shù)據(jù)類(lèi)型中的總字節(jié)數(shù)應(yīng)為偶數(shù)??梢栽谖谋灸┪蔡砑犹畛渥止?jié)以完成此操作。該填充字節(jié)不會(huì)反映在計(jì)數(shù)中。
?? ??? ??? ?ID:32位,在''(SP,0x20)到'~'(0x7E)范圍內(nèi)的四個(gè)可打印ASCII字符的串聯(lián)。空格(0x20)不能在打印字符之前; 允許尾隨空格。禁止控制字符。
?? ??? ??? ?OSType:32位。內(nèi)部定義的由四個(gè)字符組成的串接。大寫(xiě)/小寫(xiě)很重要,也就是說(shuō),使用簡(jiǎn)單的32位相等性檢查來(lái)比較OSType。
?? ??? ?2)Data Organization(數(shù)據(jù)組織)
?? ??? ??? ?所有數(shù)據(jù)均以Motorola 68000格式存儲(chǔ)。數(shù)字首先存儲(chǔ)為高字節(jié)。
?? ??? ??? ?數(shù)據(jù)的低位存放在高地址,高位存放在低地址(Big-endian)。
?? ?(2)FILE STRUCTURE(文件結(jié)構(gòu))
?? ??? ?交換格式文件的“EA IFF 85”標(biāo)準(zhǔn)定義了用于在文件中存儲(chǔ)數(shù)據(jù)的整體結(jié)構(gòu)。
?? ??? ?“EA IFF 85”文件是從許多數(shù)據(jù)塊構(gòu)建的。Chunks是“EA IFF 85”文件的構(gòu)建塊。塊包含一些標(biāo)頭信息,后跟數(shù)據(jù)。
?? ??? ?結(jié)構(gòu)表示如下:
?? ??? ?typedef struct {
?? ??? ??? ?ID ckID; /* chunk ID */
?? ??? ??? ?long ckDataSize; /* chunk data size, in bytes */
?? ??? ??? ?char ckData[]; /* data */
?? ??? ?} Chunk;
?? ??? ?參數(shù)解析:
?? ??? ?ckID描述了chunk數(shù)據(jù)部分的格式。程序可以通過(guò)檢查ckID來(lái)確定如何解釋chunk數(shù)據(jù)。
?? ??? ?ckDataSize是塊的數(shù)據(jù)部分的大小,以字節(jié)為單位。它不包括ckID和ckDataSize使用的8個(gè)字節(jié)。
?? ??? ?ckData是存儲(chǔ)在塊中的數(shù)據(jù)。該數(shù)據(jù)的格式由ckID確定。如果數(shù)據(jù)的長(zhǎng)度為奇數(shù)個(gè)字節(jié),則必須在末尾添加零填充字節(jié)。填充字節(jié)不包含在ckDataSize中。
?? ??? ?
?? ??? ?AIFF-C文件是許多不同類(lèi)型的塊的集合。
?? ??? ?Common Chunk包含描述采樣聲音的重要參數(shù),例如其length和sample rate。
?? ??? ?Sound Data Chunk包含實(shí)際的音頻樣本。
?? ??? ?還有其他幾個(gè)可選塊來(lái)定義markers,列出instrument parameters(儀器參數(shù)),存儲(chǔ)應(yīng)用程序特定信息等。
?? ??? ?AIFF-C文件中的塊在容器塊中組合在一起?!癊A IFF 85”定義了許多容器塊,但AIFF-C使用的容器塊稱為FORM。
?? ??? ?FORM具有以下格式:
?? ??? ?typedef struct {
?? ??? ??? ?ID ckID; /* 'FORM' */
?? ??? ??? ?long ckDataSize;
?? ??? ??? ?
?? ??? ??? ?ID formType; /* 'AIFC' */
?? ??? ??? ?Chunk chunks[];
?? ??? ?} FormAIFCChunk;
?? ??? ?參數(shù)解析:
?? ??? ?ckID始終是'FORM'。這表明這是一個(gè)FORM chunk。
?? ??? ?ckDataSize包含'FORM'塊的數(shù)據(jù)部分的大小。注意數(shù)據(jù)部分已分為兩部分,formType和chunks []。
?? ??? ?formType描述'FORM'塊中的內(nèi)容,非常類(lèi)似于Mac文件類(lèi)型。對(duì)于AIFF-C文件,formType是'AIFC'。FORMType“AIFC”的FORM塊稱為FORM AIFC。
?? ??? ?chunks是FORM中包含的chunks。這些chunks稱為local chunks,因?yàn)樗鼈冏约旱腸kID是FORM AIFC的local chunks。FORM AIFC及其local chunks構(gòu)成AIFF-C文件。
?? ??? ?
?? ??? ?FORM AIFC中對(duì)本地塊的排序沒(méi)有限制。
?? ??? ?
?? ??? ?1)Local Chunk Types(本地塊類(lèi)型)
?? ??? ??? ?FORM AIFC中需要Common Chunk。如果采樣的聲音長(zhǎng)度大于零,則需要Sound Data chunk。所有其他塊都是可選的。
?? ??? ??? ?使用FORM AIFC的所有應(yīng)用程序必須能夠讀取所需的塊,并可以選擇有選擇地忽略可選塊。
?? ??? ?2)Dealing with Unrecognized Local Chunks(處理無(wú)法識(shí)別的本地塊)
?? ??? ??? ?在讀取IFF文件時(shí),程序可能會(huì)遇到無(wú)法識(shí)別的本地塊類(lèi)型,可能是在編寫(xiě)程序后定義的擴(kuò)展。
?? ??? ??? ?在FORM AIFC中,這種情況也適用于具有無(wú)法識(shí)別的應(yīng)用程序簽名的應(yīng)用于特定程序的塊。(應(yīng)用程序簽名充當(dāng)塊子類(lèi)型。)
?? ??? ??? ?程序在IFF FORM中遇到無(wú)法識(shí)別的塊時(shí)應(yīng)該怎么做?最安全的是在讀FORM時(shí)簡(jiǎn)單地丟棄它們。
?? ?(3)FORMAT VERSION CHUNK(格式版本塊)
?? ??? ?Format Version Chunk包含一個(gè)日期字段,用于指示AIFF-C規(guī)范的格式規(guī)則。這將使未來(lái)更順利地升級(jí)到此規(guī)范。
?? ??? ?1)Format Version Chunk
?? ??? ??? ?Format Version Chunk數(shù)據(jù)格式如下:
?? ??? ??? ?#define AIFCVersion1 0xA2805140 /* Version 1 of AIFF-C this is 2726318400 in decimal */
?? ??? ??? ?typedef struct {
?? ??? ??? ??? ?ID ckID ; /* 'FVER' */
?? ??? ??? ??? ?long ckDataSize ; /* 4 */
?? ??? ??? ??? ?unsigned long timestamp ; /* AIFCVersion1 */
?? ??? ??? ?} FormatVersionChunk;
?? ??? ??? ?參數(shù)解析:
?? ??? ??? ?ckID總是'FVER'。
?? ??? ??? ?ckDataSize是塊的數(shù)據(jù)部分的大小,以字節(jié)為單位。它不包括ckID和ckDataSize使用的8個(gè)字節(jié)。對(duì)于此Chunk,ckDataSize的值為4。
?? ??? ??? ?timeStamp表示何時(shí)創(chuàng)建AIFF-C文件的格式版本。單位是自1904年1月1日以來(lái)的秒數(shù)。
?? ??? ??? ?
?? ??? ??? ?只有Apple可能會(huì)改變時(shí)間戳的值。不要將格式版本與文件的創(chuàng)建日期混淆。
?? ??? ??? ?格式版本是指在此文檔或?qū)?lái)的文檔中包含的規(guī)則,這些文檔指定如何安排AIFF-C文件。
?? ??? ??? ?格式版塊是必需的。一個(gè)且只有一個(gè)Format Version Chunk必須出現(xiàn)在FORM AIFC中。
?? ??? ?2)為什么添加了格式版本塊
?? ??? ??? ?“如果我們?cè)贏IFF中有一個(gè)版本塊,我們就不必更改AIFFC的FORM類(lèi)型了。hh”
?? ??? ??? ?您識(shí)別的Chunk名稱將包含您熟悉的格式的信息。
?? ??? ??? ?如果找不到應(yīng)用程序所需的Chunk,請(qǐng)檢查Format Version Chunk以確定文件是否已損壞,或者應(yīng)用程序與文件之間是否存在不匹配。
?? ??? ??? ?
?? ??? ?了解以下步驟如何簡(jiǎn)化您的生活(和我們的生活)以確定FORM AIFC是否可用:
?? ??? ?
?? ??? ?3)讀取AIFF-C文件時(shí)
?? ??? ??? ?1.首先找到FORM AIFC字段。如果找不到,請(qǐng)發(fā)出“此文件不包含AIFC標(biāo)準(zhǔn)錄音”的提醒,然后退出這些指示。
?? ??? ??? ?2.嘗試找到對(duì)您的應(yīng)用程序至關(guān)重要的所有塊(可能是COMM和SSND,但我們可以想象一個(gè)只需要COMM塊的應(yīng)用程序,例如確定播放持續(xù)時(shí)間)。
?? ??? ??? ??? ?如果找到,那些熟悉的chunk ID表示塊內(nèi)容采用您期望的格式。
?? ??? ??? ?3.如果沒(méi)有找到,請(qǐng)不要崩潰。而是檢查格式版本塊。
?? ??? ?4)Remember
?? ??? ??? ?為了在交換和格式演變中生存,讀程序必須對(duì)塊順序,缺少塊和意外塊有強(qiáng)大的作用。
?? ??? ??? ?與原始AIFF規(guī)范相反,當(dāng)程序遇到無(wú)法識(shí)別的塊時(shí),它應(yīng)該跳過(guò)它。請(qǐng)勿將其復(fù)制到新的已編輯文件中。這是IFF中的一般規(guī)則,因?yàn)樵诰庉嬛車(chē)鷶?shù)據(jù)時(shí)無(wú)法保持無(wú)法識(shí)別的塊的完整性。
?? ??? ?5)Format Version Chunk如何幫助未來(lái)的潛在升級(jí)
?? ??? ??? ?如果在AIFF中已經(jīng)有格式版本塊,將如何升級(jí)AIFF來(lái)處理壓縮音頻:
?? ??? ??? ??? ??壓縮是可選的。
?? ??? ??? ??? ??不要更改COMM Chunk的格式?,F(xiàn)有程序仍然可以讀取它。
?? ??? ??? ??? ??添加一個(gè)“Compression Descriptor”塊,其中包含4個(gè)字母的壓縮類(lèi)型代碼和壓縮名稱字符串。
?? ??? ??? ??? ??用壓縮聲音數(shù)據(jù)塊“CSND”替換SSND塊。(現(xiàn)有程序?qū)⒑雎运?#xff09;
?? ??? ??? ??? ??更改格式版本日期(為了警報(bào))。
?? ??? ??? ??? ??添加可選的Saxel Chunk。
?? ??? ??? ?將FORM類(lèi)型從AIFF更改為AIFC,是由于缺少Format Version Chunk,現(xiàn)有應(yīng)用程序?qū)o(wú)法發(fā)出有用的錯(cuò)誤消息。如果某些現(xiàn)有應(yīng)用程序找不到SSND Chunk,它們甚至可能會(huì)崩潰。
?? ?(4)COMMON CHUNK?? ??? ?
?? ??? ?Common Chunk描述了采樣聲音的基本參數(shù)。結(jié)構(gòu)如下:
?? ??? ?#define CommonID 'COMM' /* ckID for Common Chunk */
?? ??? ?typedef struct {
?? ??? ??? ?ID ckID; /* 'COMM' */
?? ??? ??? ?long ckDataSize;
?? ??? ??? ?
?? ??? ??? ?short numChannels; /* # audio channels */
?? ??? ??? ?unsigned long numSampleFrames; /* # sample frames = samples/channel */
?? ??? ??? ?short sampleSize; /* # bits/sample */
?? ??? ??? ?extended sampleRate; /* sample_frames/sec */
?? ??? ??? ?ID compressionType; /* compression type ID code */
?? ??? ??? ?pstring compressionName; /* human-readable compression type name */
?? ??? ?} CommonChunk;
?? ??? ?參數(shù)解析:
?? ??? ?ckID始終是'COMM'。
?? ??? ?ckDataSize是塊的數(shù)據(jù)部分的大小(以字節(jié)為單位)。它不包括ckID和ckDataSize使用的8個(gè)字節(jié)。
?? ??? ??? ?對(duì)于Common Chunk,ckDataSize是22 +pstring的大小。(當(dāng)需要填充偶數(shù)個(gè)字節(jié)時(shí),pstring包含填充字節(jié)。)
?? ??? ?numChannels包含聲音的音頻通道數(shù)。值1表示單聲道聲音,2表示立體聲,4表示四聲道聲音等??梢员硎救我鈹?shù)量的音頻聲道。
?? ??? ??? ?實(shí)際的聲音樣本存儲(chǔ)在另一個(gè)Sound Data Chunk中,對(duì)于多聲道聲音,來(lái)自每個(gè)聲道的單個(gè)采樣點(diǎn)是交錯(cuò)的。一組交錯(cuò)的采樣點(diǎn)稱為采樣幀。
?? ??? ??? ?對(duì)于單聲道聲音,樣本幀是單個(gè)樣本點(diǎn)。
?? ??? ?numSampleFrames包含Sound Data Chunk中的樣本幀數(shù)。
?? ??? ??? ?請(qǐng)注意,numSampleFrames是樣本幀的數(shù)量,而不是Sound Data Chunk中的字節(jié)數(shù)和采樣點(diǎn)數(shù)。對(duì)于未壓縮的聲音數(shù)據(jù),文件中的采樣點(diǎn)總數(shù)為numSampleFrames * numChannels。
?? ??? ?sampleSize是未壓縮聲音數(shù)據(jù)的每個(gè)采樣點(diǎn)中的位數(shù)。
?? ??? ??? ?它可以是1到32之間的任何數(shù)字。對(duì)于壓縮聲音數(shù)據(jù),sampleSize表示壓縮前原始聲音數(shù)據(jù)中的位數(shù)。
?? ??? ?sampleRate是播放聲音的采樣率,是sample frames per second(每秒采樣幀數(shù))。
?? ??? ?程序使用compressionType來(lái)識(shí)別聲音數(shù)據(jù)上使用的壓縮算法(如果有的話)。
?? ??? ?compressionName被人們用來(lái)識(shí)別壓縮算法。
?? ??? ??? ?使用compressionType選擇解壓縮例程。當(dāng)您沒(méi)有所需的解壓縮例程時(shí),使用compressionName顯示人類(lèi)可讀的消息。
?? ??? ??? ?如果pstring長(zhǎng)度不是偶數(shù)個(gè)字節(jié),用零字節(jié)填充compressionName的末尾,但不要在計(jì)數(shù)中包含填充字節(jié)。
?? ??? ?compressionType compressionName ?? ??? ?meaning
?? ??? ?'NONE'?? ??? ? ? ?"not compressed" ?? ??? ?uncompressed, that is, straight digitized samples
?? ??? ?'ACE2' ?? ??? ??? ?"ACE 2-to-1" 2-to-1 ?? ?IIGS ACE (Audio Compression / Expansion)
?? ??? ?'ACE8' ?? ??? ??? ?"ACE 8-to-3" 8-to-3 ?? ?IIGS ACE (Audio Compression / Expansion)
?? ??? ?'MAC3' ?? ??? ??? ?"MACE 3-to-1" 3-to-1 ?? ?Macintosh Audio Compression / Expansion
?? ??? ?'MAC6'?? ??? ? ? ?"MACE 6-to-1" 6-to-1 ?? ?Macintosh Audio Compression / Expansion
?? ??? ?
?? ??? ?注意:compressionType是標(biāo)識(shí)壓縮算法的標(biāo)準(zhǔn)32位ID值。
?? ??? ?相反,compressionName的值可以是特定于國(guó)家的,例如 以法語(yǔ)或西班牙語(yǔ)存儲(chǔ)。
?? ??? ?
?? ??? ?每個(gè)FORM AIFC中必須出現(xiàn)一個(gè)且只有一個(gè)Common Chunk。
?? ??? ?
?? ?(5)SOUND DATA CHUNK
?? ??? ?SOUND DATA CHUNK包含實(shí)際的采樣幀。
?? ??? ?結(jié)構(gòu)定義如下:
?? ??? ?#define SoundDataID 'SSND' /* ckID for Sound Data Chunk */
?? ??? ?typedef struct {
?? ??? ??? ?ID ckID; /* 'SSND' */
?? ??? ??? ?long ckDataSize;
?? ??? ??? ?unsigned long offset;
?? ??? ??? ?unsigned long blockSize;
?? ??? ??? ?char soundData[];
?? ??? ?} SoundDataChunk;
?? ??? ?參數(shù)解析:
?? ??? ?ckID始終是'SSND'。
?? ??? ?ckDataSize是塊的數(shù)據(jù)部分的大小,以字節(jié)為單位。
?? ??? ??? ?它不包括ckID和ckDataSize使用的8個(gè)字節(jié)。它包括offset和blockSize占用的8個(gè)字節(jié)。
?? ??? ??? ?如果soundData []包含奇數(shù)個(gè)字節(jié),則在末尾添加一個(gè)值為零的填充字節(jié),以保留此塊的偶數(shù)長(zhǎng)度。此填充字節(jié)(如果存在)不包含在ckDataSize中。
?? ??? ??? ?為避免混淆,應(yīng)始終從Common Chunk中的numSampleFrames參數(shù)獲取實(shí)際的采樣幀數(shù)。
?? ??? ?offset確定soundData中第一個(gè)樣本幀的開(kāi)始位置。offset以字節(jié)為單位。
?? ??? ??? ?下面的BlockAligning Sound Data部分解釋了用于非零偏移的用法。
?? ??? ?blockSize與偏移結(jié)合用于塊對(duì)齊聲音數(shù)據(jù)。它包含聲音數(shù)據(jù)對(duì)齊的塊的字節(jié)大小。
?? ??? ??? ?與偏移量一樣,大多數(shù)應(yīng)用程序不會(huì)使用blockSize,應(yīng)將其設(shè)置為零。
?? ??? ?soundData包含組成聲音的采樣幀。soundData中的樣本幀數(shù)由Common Chunk中的numSampleFrames參數(shù)確定。?? ?
?? ??? ??? ?如果soundData []包含奇數(shù)個(gè)字節(jié),則在末尾添加零填充字節(jié)(但不用于回放)。
?? ??? ?
?? ??? ?1)Linear Sound Data (not compressed)(線性聲音數(shù)據(jù))
?? ??? ??? ?樣本幀中的每個(gè)樣本點(diǎn)都是線性的2的補(bǔ)碼值。
?? ??? ??? ?采樣點(diǎn)的寬度為1到32位,由Common Chunk中的sampleSize參數(shù)決定。每個(gè)采樣點(diǎn)存儲(chǔ)在整數(shù)個(gè)連續(xù)字節(jié)中。
?? ??? ??? ?一到八位寬的采樣點(diǎn)存儲(chǔ)在一個(gè)字節(jié)中; 9到16位寬的采樣點(diǎn)存儲(chǔ)在兩個(gè)字節(jié)中; 17至24位寬的采樣點(diǎn)以3個(gè)字節(jié)存儲(chǔ); 25到32位寬的采樣以4個(gè)字節(jié)存儲(chǔ)。
?? ??? ??? ?當(dāng)采樣點(diǎn)的寬度小于8位的倍數(shù)時(shí),采樣點(diǎn)數(shù)據(jù)左對(duì)齊(使用左移指令),其余位為零。右端的剩余低位設(shè)置為零。
?? ??? ??? ?
?? ??? ??? ?例如,12位樣本二進(jìn)制101000010111以左對(duì)齊方式存儲(chǔ)在兩個(gè)字節(jié)中:
?? ??? ??? ?1 0 1 0 0 0 0 1 0 1 1 1 ? 0 0 0 0
?? ??? ??? ?12位采樣點(diǎn)左對(duì)齊 ? ? ? ? ?最右邊的4位是零填充
?? ??? ?2)Sample Frames(采樣幀)
?? ??? ??? ?采樣幀內(nèi)的采樣點(diǎn)按照上面“Common Chunk”中的描述打包在一起。采樣幀按照增加的時(shí)間順序存儲(chǔ)。采樣點(diǎn)之間或采樣幀之間沒(méi)有填充字節(jié)。
?? ??? ?3)Compressed Sound Data(壓縮聲音數(shù)據(jù))
?? ??? ??? ?soundData根據(jù)Common Chunk中的compressionType參數(shù)進(jìn)行壓縮。
?? ??? ??? ?附錄C描述了現(xiàn)有Apple Computer音頻壓縮實(shí)用程序的編碼格式以及Marker和Saxel Chunks(見(jiàn)下文)與各種壓縮類(lèi)型的使用。
?? ??? ?4)Block-Aligning Sound Data
?? ??? ??? ?可能存在一些應(yīng)用程序,為了實(shí)現(xiàn)音頻的實(shí)時(shí)記錄和回放,希望將采樣的聲音數(shù)據(jù)對(duì)準(zhǔn)固定大小的磁盤(pán)塊。這可以使用offset和blockSize參數(shù)來(lái)完成。
?? ??? ??? ?第一個(gè)樣本幀從磁盤(pán)塊N的開(kāi)頭開(kāi)始。這是通過(guò)跳過(guò)soundData的第一個(gè)偏移字節(jié)來(lái)完成的。
?? ??? ??? ?blockSize指定對(duì)齊塊的大小(以字節(jié)為單位)。blockSize為零表示聲音數(shù)據(jù)不需要塊對(duì)齊。
?? ??? ??? ?在編寫(xiě)AIFF-C文件時(shí),不關(guān)心塊對(duì)齊的應(yīng)用程序應(yīng)將blockSize和offset設(shè)置為零。4
?? ??? ??? ?寫(xiě)入塊對(duì)齊聲音數(shù)據(jù)的應(yīng)用程序應(yīng)將blockSize設(shè)置為適當(dāng)?shù)膲K大小。
?? ??? ??? ?修改現(xiàn)有AIFF-C文件的應(yīng)用程序應(yīng)嘗試保留聲音數(shù)據(jù)的對(duì)齊,盡管這不是必需的。
?? ??? ??? ?如果應(yīng)用程序不保留對(duì)齊,則應(yīng)將blockSize和offset設(shè)置為零。如果應(yīng)用程序需要將聲音數(shù)據(jù)重新對(duì)齊到不同大小的塊,則應(yīng)更新blockSize并相應(yīng)地進(jìn)行偏移。
?? ??? ??? ?
?? ??? ??? ?除非Common Chunk中的numSampleFrames字段為零,否則聲音數(shù)據(jù)塊是必需的。最多一個(gè)聲音數(shù)據(jù)塊可以出現(xiàn)在FORM AIFC中。
?? ??? ?
?? ?(6)MARKER CHUNK
?? ??? ?Marker Chunk包含指向聲音數(shù)據(jù)中位置的標(biāo)記。
?? ??? ??? ?Markers可用于應(yīng)用程序所需的任何目的。后面定義的Instrument Chunk使用標(biāo)記來(lái)標(biāo)記循環(huán)起點(diǎn)和終點(diǎn)。
?? ??? ?1)Markers
?? ??? ??? ?Markers結(jié)構(gòu)如下:
?? ??? ??? ?typedef short MarkerId;
?? ??? ??? ?typedef struct {
?? ??? ??? ??? ?MarkerId id; /* must be > 0 */
?? ??? ??? ??? ?unsigned long position; /* sample frame number */
?? ??? ??? ??? ?pstring markerName;
?? ??? ??? ?} Marker;
?? ??? ??? ?參數(shù)解析:
?? ??? ??? ?id是唯一標(biāo)識(shí)FORM AIFC中marker的數(shù)字。只要同一個(gè)FORM AIFC中沒(méi)有其他marker具有相同的id,id就可以是任何正的非零整數(shù)。
?? ??? ??? ?marker在聲音數(shù)據(jù)中的位置由position指示。marker在概念上落在兩個(gè)采樣幀之間。
?? ??? ??? ??? ?落在聲音數(shù)據(jù)中第一個(gè)樣本幀之前的標(biāo)記位于零位置,而落在聲音數(shù)據(jù)中第一個(gè)和第二個(gè)樣本幀之間的標(biāo)記位于位置1.注意位置的單位是樣本幀,而不是字節(jié)和樣本點(diǎn)。
?? ??? ??? ?
?? ??? ??? ??? ?對(duì)于壓縮聲音數(shù)據(jù),標(biāo)記的位置基于擴(kuò)展(未壓縮)聲音數(shù)據(jù),而不是壓縮樣本幀的位置。
?? ??? ??? ??? ?這允許細(xì)粒度分辨率將標(biāo)記點(diǎn)精確放置在需要的位置(對(duì)于循環(huán)點(diǎn)尤其重要)。
?? ??? ??? ??? ?單個(gè)字節(jié)的壓縮聲音數(shù)據(jù)可以擴(kuò)展為擴(kuò)展聲音數(shù)據(jù)的許多字節(jié),從而防止基于壓縮數(shù)據(jù)的標(biāo)記的高分辨率。
?? ??? ??? ??? ?對(duì)于現(xiàn)有的Apple音頻壓縮算法,可以輕松完成壓縮聲音數(shù)據(jù)樣本幀到擴(kuò)展聲音數(shù)據(jù)樣本幀的映射。
?? ??? ??? ??? ?
?? ??? ??? ??? ?建議音頻編輯器程序在編輯音頻數(shù)據(jù)時(shí)更新標(biāo)記。
?? ??? ??? ?markerName是一個(gè)包含標(biāo)記名稱的pstring。在需要時(shí)將填充字節(jié)包括為pstring到偶數(shù)個(gè)字節(jié)。
?? ??? ?2)Marker Chunk Format
?? ??? ??? ?Marker Chunk中數(shù)據(jù)的格式如下所示:
?? ??? ??? ?#define MarkerID 'MARK' /* ckID for Marker Chunk */
?? ??? ??? ?typedef struct {
?? ??? ??? ??? ?ID ckID; /* 'MARK' */
?? ??? ??? ??? ?long ckDataSize;
?? ??? ??? ??? ?unsigned short numMarkers;
?? ??? ??? ??? ?Marker markers[];
?? ??? ??? ?} MarkerChunk;
?? ??? ??? ?參數(shù)解析:
?? ??? ??? ?ckID總是'MARK'。
?? ??? ??? ?ckDataSize是塊的數(shù)據(jù)部分的大小,以字節(jié)為單位。它不包括ckID和ckDataSize使用的8個(gè)字節(jié)。
?? ??? ??? ?numMarkers是Marker Chunk中的標(biāo)記數(shù)。
?? ??? ??? ?numMarkers,如果非零,則后跟標(biāo)記本身。
?? ??? ??? ??? ?由于標(biāo)記中的所有字段長(zhǎng)度均為偶數(shù)個(gè)字節(jié),因此任何標(biāo)記的長(zhǎng)度始終為偶數(shù)。
?? ??? ??? ??? ?因此,標(biāo)記被打包在一起,它們之間沒(méi)有未使用的字節(jié)。標(biāo)記不需要以任何特定方式排序。
?? ??? ??? ?Marker Chunk是可選的。在FORM AIFC中只能出現(xiàn)一個(gè)Marker Chunk。
?? ??? ??? ?
?? ??? ??? ?注意:如果包含一個(gè)或多個(gè)標(biāo)記的聲音數(shù)據(jù)片段在聲音流中重新定位,則必須重新計(jì)算要移動(dòng)的片段內(nèi)的標(biāo)記。
?? ?(7)COMMENTS CHUNK
?? ??? ?Comments Chunk用于在FORM AIFF中存儲(chǔ)注釋。“EA IFF 85”有一個(gè)可用于注釋的注釋塊,但是注釋塊有兩個(gè)在“EA IFF 85”塊中找不到的功能。它們是:1)評(píng)論的時(shí)間戳;2)指向標(biāo)記的鏈接。
?? ??? ?1)Comment
?? ??? ?Comments由時(shí)間戳,標(biāo)記ID和文本計(jì)數(shù)跟文本組成。結(jié)構(gòu)如下:
?? ??? ?typedef struct {
?? ??? ??? ?unsigned long timeStamp; /* comment creation date */
?? ??? ??? ?MarkerId marker; /* comments for this marker number */
?? ??? ??? ?unsigned short count; /* comment text string length */
?? ??? ??? ?char text[]; /* comment text */
?? ??? ?} Comment;
?? ??? ?參數(shù)解析:
?? ??? ?timeStamp表示Comments的創(chuàng)建時(shí)間。單位是自1904年1月1日以來(lái)的秒數(shù)。
?? ??? ?Comments可以鏈接到標(biāo)記。這允許應(yīng)用程序?qū)?biāo)記的長(zhǎng)描述存儲(chǔ)為Comments。如果Comments指的是標(biāo)記,則marker是該標(biāo)記的ID。否則,標(biāo)記為零,表示此Comments未鏈接到標(biāo)記。
?? ??? ?count是組成Comments的文本的長(zhǎng)度。這是一個(gè)16位的數(shù)量,允許比pstring更長(zhǎng)的Comments。
?? ??? ?text包含Comments本身。必須在末尾用一個(gè)字節(jié)填充此文本,以確保它的長(zhǎng)度為偶數(shù)個(gè)字節(jié)。該填充字節(jié)(如果存在)不包括在計(jì)數(shù)中。
?? ??? ?
?? ??? ?2)Comments Chunk Format:
?? ??? ??? ?結(jié)構(gòu)如下:
?? ??? ??? ?#define CommentID 'COMT' /* ckID for Comments Chunk. */
?? ??? ??? ?typedef struct {
?? ??? ??? ??? ?ID ckID;
?? ??? ??? ??? ?long ckSize;
?? ??? ??? ??? ?unsigned short numComments;
?? ??? ??? ??? ?Comment comments[];
?? ??? ??? ?} CommentsChunk;
?? ??? ??? ?ckID總是'COMT'。ckSize是塊的數(shù)據(jù)部分的大小,以字節(jié)為單位。它不包括ckID和ckSize使用的8個(gè)字節(jié)。
?? ??? ??? ?numComments包含Comments Chunk中的Comments數(shù)。接下來(lái)是Comments本身。Comments長(zhǎng)度總是為偶數(shù)個(gè)字節(jié),因此Comments Chunk中的Comments之間沒(méi)有填充。
?? ??? ??? ?Comments Chunk是可選的。一個(gè)FORM AIFF中只能出現(xiàn)一個(gè)Comments Chunk。
?? ?(8)SOUND ACCELERATOR (SAXEL) CHUNK(聲音加速器(SAXEL)CHUNK)
?? ??? ?Saxel Chunk旨在通過(guò)壓縮音頻數(shù)據(jù)流中的任何隨機(jī)點(diǎn)(由標(biāo)記指示)提供高質(zhì)量的播放。
?? ??? ?對(duì)Saxel Chunk的需求源于音頻解壓縮器的行為,其在很大程度上依賴于最近解壓縮的樣本的一些歷史來(lái)預(yù)測(cè)下一個(gè)要解壓縮的樣本的值。
?? ??? ??? ?在隨機(jī)點(diǎn)開(kāi)始解壓縮音頻流將導(dǎo)致在算法的內(nèi)部解壓縮參數(shù)穩(wěn)定之前聽(tīng)到初始音頻偽像。
?? ?(9)INSTRUMENT CHUNK?? ?
?? ??? ?Instrument Chunk定義了儀器(例如采樣鍵盤(pán))可用于回放聲音數(shù)據(jù)的基本參數(shù)。
?? ??? ?1)Looping(循環(huán))
?? ??? ??? ?可以重復(fù)聲音數(shù)據(jù)的一部分以延長(zhǎng)聲音。該部分稱為循環(huán)段,重復(fù)進(jìn)行,直到被取樣鍵盤(pán)上的鍵釋放中斷為止。
?? ??? ??? ?有兩種播放循環(huán)的方法:前向循環(huán)和前進(jìn)/后退(或“乒乓”)循環(huán)。
?? ??? ??? ?
?? ??? ??? ?要實(shí)現(xiàn)前向循環(huán),請(qǐng)反復(fù)播放循環(huán)段。要實(shí)現(xiàn)向前/向后循環(huán),請(qǐng)向前播放循環(huán)段,然后向后播放,并反復(fù)向前/向后重復(fù)此對(duì)。
?? ??? ??? ?下面的結(jié)構(gòu)描述了一個(gè)循環(huán):
?? ??? ??? ?typedef struct {
?? ??? ??? ??? ?short playMode;
?? ??? ??? ??? ?MarkerId beginLoop;
?? ??? ??? ??? ?MarkerId endLoop;
?? ??? ??? ?} Loop;
?? ??? ??? ?參數(shù)解析:
?? ??? ??? ?playMode指定要執(zhí)行的循環(huán)類(lèi)型:
?? ??? ??? ?#define NoLooping 0
?? ??? ??? ?#define ForwardLooping 1
?? ??? ??? ?#define ForwardBackwardLooping 2
?? ??? ??? ?
?? ??? ??? ?NoLooping意味著在播放期間忽略這些循環(huán)點(diǎn)。
?? ??? ??? ?beginLoop和endLoop是標(biāo)記id,用于標(biāo)記循環(huán)段的開(kāi)始和結(jié)束位置。
?? ??? ??? ?開(kāi)始位置必須小于結(jié)束位置,因此環(huán)段將具有正長(zhǎng)度。(如果不是這種情況,則忽略此循環(huán)段。不會(huì)發(fā)生循環(huán)。)
?? ??? ?2)Instrument Chunk Format
?? ??? ??? ?Instrument Chunk中的數(shù)據(jù)格式如下所述:
?? ??? ??? ?#define InstrumentID 'INST' /* ckID for Instrument Chunk */
?? ??? ??? ?typedef struct {
?? ??? ??? ??? ?ID ckID; /* 'INST' */
?? ??? ??? ??? ?long ckDataSize;
?? ??? ??? ??? ?char baseNote;
?? ??? ??? ??? ?char detune;
?? ??? ??? ??? ?char lowNote;
?? ??? ??? ??? ?char highNote;
?? ??? ??? ??? ?char lowVelocity;
?? ??? ??? ??? ?char highVelocity;
?? ??? ??? ??? ?short gain;
?? ??? ??? ??? ?Loop sustainLoop;
?? ??? ??? ??? ?Loop releaseLoop;
?? ??? ??? ?} InstrumentChunk;
?? ??? ??? ?參數(shù)解析:
?? ??? ??? ?ckID始終是'INST'。
?? ??? ??? ?ckDataSize是塊的數(shù)據(jù)部分的大小,以字節(jié)為單位。
?? ??? ??? ??? ?對(duì)于儀器塊,ckDataSize始終為20。
?? ??? ??? ?ckID始終是'INST'。ckSize是塊的數(shù)據(jù)部分的大小,以字節(jié)為單位。對(duì)于儀器塊,ckSize始終為20。
?? ??? ??? ?baseNote是工具在沒(méi)有音調(diào)修改的情況下播放聲音數(shù)據(jù)的注釋。單位是MIDI(MIDI是樂(lè)器數(shù)字接口的首字母縮寫(xiě))音符編號(hào),范圍是0到127.中間C是60。
?? ??? ??? ?detune決定工具在播放時(shí)應(yīng)改變聲音音高的程度。單位為美分(半音的1/100),范圍從-50到+50。負(fù)數(shù)表示聲音的音高應(yīng)該降低,而正數(shù)表示應(yīng)該提高聲音的音高。
?? ??? ??? ?lowNote和highNote指定鍵盤(pán)上的建議范圍以播放聲音數(shù)據(jù)。如果要求樂(lè)器在低音符和高音符之間播放音符,則應(yīng)播放聲音數(shù)據(jù)?;{(diào)不必在此范圍內(nèi)。lowNote和highNote的單位是MIDI音符值。
?? ??? ??? ?lowVelocity和highVelocity指定播放聲音數(shù)據(jù)的建議速度范圍。如果音符開(kāi)啟速度介于低速和高速之間,則應(yīng)播放聲音數(shù)據(jù)。單位是MIDI速度值,1(最低速度)到127(最高速度)。
?? ??? ??? ?gain(增益)是在播放時(shí)改變聲音增益的量。單位是分貝。例如,0 db表示沒(méi)有變化,6 db表示每個(gè)采樣點(diǎn)的值加倍,而-6 db表示每個(gè)采樣點(diǎn)的值減半。
?? ??? ??? ?sustainLoop指定一個(gè)循環(huán),當(dāng)工具維持聲音時(shí)要播放該循環(huán)。
?? ??? ??? ?releaseLoop指定當(dāng)樂(lè)器處于播放聲音的釋放階段時(shí)要播放的循環(huán)。釋放階段通常在樂(lè)器上的鍵釋放后發(fā)生。
?? ??? ??? ?
?? ??? ??? ?Instrument Chunk是可選的。FORM AIFF中只能出現(xiàn)一個(gè)Instrument Chunk。
?? ?(10)MIDI DATA CHUNK
?? ??? ?MIDI數(shù)據(jù)塊可用于存儲(chǔ)MIDI數(shù)據(jù)。
?? ??? ?此塊的主要用途是存儲(chǔ)MIDI系統(tǒng)專用消息,盡管其他類(lèi)型的MIDI數(shù)據(jù)可以存儲(chǔ)在此塊。
?? ??? ?隨著越來(lái)越多的儀器上市,它們可能會(huì)有一些參數(shù)未包含在AIFF-C規(guī)范中。
?? ??? ?這些樂(lè)器的MIDI系統(tǒng)專用信息可能包含許多未包含在樂(lè)器組塊中的參數(shù)。
?? ??? ?例如,新的采樣儀器可能具有多于Instrument Chunk中定義的兩個(gè)環(huán)路。
?? ??? ?這些循環(huán)可能會(huì)在新機(jī)器的MIDI System Exclusive消息中表示。此MIDI系統(tǒng)專用消息可以存儲(chǔ)在MIDI數(shù)據(jù)塊中。
?? ??? ?
?? ??? ?#define MIDIDataID 'MIDI' /* ckID for MIDI Data Chunk */
?? ??? ?typedef struct {
?? ??? ??? ?ID ckID; /* 'MIDI' */
?? ??? ??? ?long ckDataSize;
?? ??? ??? ?unsigned char MIDIdata[];
?? ??? ?} MIDIDataChunk;
?? ??? ?ckID總是'MIDI'。
?? ??? ?ckDataSize是塊的數(shù)據(jù)部分的大小,以字節(jié)為單位。它不包括ckID和ckSize使用的8個(gè)字節(jié)。
?? ??? ?MIDIData包含MIDI數(shù)據(jù)流。
?? ??? ?MIDI數(shù)據(jù)塊是可選的。FORM AIFF中可能存在任意數(shù)量的MIDI數(shù)據(jù)塊。
?? ??? ??? ?如果要將多個(gè)樂(lè)器的MIDI系統(tǒng)專用信息存儲(chǔ)在FORM AIFF中,最好每個(gè)樂(lè)器使用一個(gè)MIDI數(shù)據(jù)塊,而不是所有樂(lè)器使用一個(gè)大的MIDI數(shù)據(jù)塊。
?? ?(11)AUDIO RECORDING CHUNK(錄音塊)
?? ??? ?錄音塊包含與錄音設(shè)備有關(guān)的信息。結(jié)構(gòu)定義如下:
?? ??? ?#define AudioRecordingID 'AESD' /* ckID for Audio Recording Chunk */
?? ??? ?typedef struct {
?? ??? ??? ?ID ckID; /* 'AESD' */
?? ??? ??? ?long ckDataSize;
?? ??? ??? ?unsigned char AESChannelStatusData[24];
?? ??? ?} AudioRecordingChunk;
?? ??? ?#define AudioRecordingID 'AESD' /* ckID for Audio Recording Chunk. */
?? ??? ?typedef struct {
?? ??? ??? ?ID ckID;
?? ??? ??? ?long ckSize;
?? ??? ??? ?unsigned char AESChannelStatusData[24];
?? ??? ?} AudioRecordingChunk;
?? ??? ?
?? ??? ?ckID始終是'AESD'。
?? ??? ?ckDataSize是塊的數(shù)據(jù)部分的大小,以字節(jié)為單位。對(duì)于錄音塊,ckSize始終為24。
?? ??? ?AESChannelStatusData的24個(gè)字節(jié)在AES推薦的數(shù)字音頻工程實(shí)踐 - 線性表示的數(shù)字音頻數(shù)據(jù)的串行傳輸格式,第7.1節(jié),通道狀態(tài)數(shù)據(jù)中規(guī)定。該文件描述了用于音頻設(shè)備之間的數(shù)字音頻的實(shí)時(shí)數(shù)字傳輸?shù)母袷?。為方便起?jiàn),此信息在音頻記錄塊中重復(fù)。一般感興趣的是字節(jié)0的位2,3和4,它們描述了記錄強(qiáng)調(diào)。
?? ??? ?音頻錄制塊是可選的。FORM AIFF中不得出現(xiàn)多個(gè)音頻錄制塊。
?? ?(12)APPLICATION SPECIFIC CHUNK(應(yīng)用程序特殊塊)
?? ??? ?Application Specific Chunk可以用于應(yīng)用程序制造商的任何目的。結(jié)構(gòu)如下:
?? ??? ??? ?例如,編輯聲音的應(yīng)用程序可能希望使用該塊來(lái)存儲(chǔ)編輯器狀態(tài)參數(shù),例如放大級(jí)別,最后光標(biāo)位置等。
?? ??? ?結(jié)構(gòu)如下:
?? ??? ?#define ApplicationSpecificID 'APPL' /* ckID for Application Specific Chunk. */
?? ??? ?typedef struct {
?? ??? ??? ?ID ckID;
?? ??? ??? ?long ckDataSize;
?? ??? ??? ?OSType applicationSignature;
?? ??? ??? ?char data[];
?? ??? ?} ApplicationSpecificChunk;
?? ??? ?
?? ??? ?ckID總是'APPL'。
?? ??? ?ckDataSize是塊的數(shù)據(jù)部分的大小,以字節(jié)為單位。它不包括ckID和ckSize使用的8個(gè)字節(jié)。
?? ??? ?applicationSignature標(biāo)識(shí)特定的應(yīng)用程序。
?? ??? ??? ?對(duì)于Macintosh應(yīng)用程序,這將是應(yīng)用程序的四個(gè)字符簽名。
?? ??? ??? ?對(duì)于Apple II應(yīng)用程序,applicationSignature應(yīng)始終為“pdos”或十六進(jìn)制字節(jié)0x70646F73。
?? ??? ??? ?如果applicationSignature是'pdos',則數(shù)據(jù)區(qū)的開(kāi)頭被定義為包含應(yīng)用程序名稱的Pascal樣式字符串(長(zhǎng)度字節(jié)后跟ASCII字符串字節(jié))。
?? ??? ??? ?這是必要的,因?yàn)锳pple II應(yīng)用程序沒(méi)有Macintosh應(yīng)用程序那樣的四字節(jié)簽名。
?? ??? ??? ?對(duì)于在Apple計(jì)算機(jī)以外運(yùn)行的應(yīng)用程序,應(yīng)用程序簽名應(yīng)始終為“stoc”。數(shù)據(jù)區(qū)的開(kāi)頭被定義為包含應(yīng)用程序名稱的Pascal樣式字符串(長(zhǎng)度字節(jié)后跟ASCII字符串字節(jié))。
?? ??? ?data是Application Specific Chunk的數(shù)據(jù)。必須根據(jù)需要在末尾填充一個(gè)字節(jié),以使其長(zhǎng)度為偶數(shù)個(gè)字節(jié)。
?? ??? ?Application Specific Chunk是可選的。單個(gè)FORM AIFF中可能存在任意數(shù)量的Application Specific Chunk。
?? ?(13)TEXT CHUNKS - NAME, AUTHOR, COPYRIGHT, ANNOTATION
?? ??? ?這四個(gè)塊包含在每個(gè)“EA IFF 85”文件的定義中。全是文本塊;他們的數(shù)據(jù)部分僅由文本組成。這些塊中的每一個(gè)都是可選的。
?? ??? ?#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 ckDataSize;
?? ??? ??? ?char text[];
?? ??? ?} TextChunk;
?? ?
?? ??? ?ckID是“NAME”,“AUTH”,“(c)”或“ANNO”,具體取決于塊是否分別為Name Chunk,Author Chunk,Copyright Chunk或Annotation Chunk。對(duì)于版權(quán)塊,'c'是小寫(xiě)的,并且在右括號(hào)后面有一個(gè)空格(0x20)。
?? ??? ?ckDataSize是塊的數(shù)據(jù)部分的大小,在本例中是文本。
?? ??? ?text包含純ASCII字符。它不是pstring也不是C字符串。text中的字符數(shù)由ckSize確定。text內(nèi)容取決于塊,如下所述:?
?? ??? ?
?? ??? ?Name Chunk:
?? ??? ??? ?text包含采樣聲音的名稱。名稱塊是可選的。FORM AIFF中可能只存在一個(gè)名稱塊。
?? ??? ?Author Chunk:
?? ??? ??? ?text包含一個(gè)或多個(gè)作者姓名。在這種情況下,作者是采樣聲音的創(chuàng)建者。作者塊是可選的。FORM AIFF中可能只存在一個(gè)作者塊。?? ?
?? ??? ?Copyright Chunk:
?? ??? ??? ?版權(quán)塊包含聲音的版權(quán)聲明。文本包含版權(quán)所有者遵循的日期。
?? ??? ??? ?版權(quán)塊是可選的。FORM AIFF中可能只存在一個(gè)版權(quán)塊。
?? ??? ?Annotation Chunk:
?? ??? ??? ?text包含評(píng)論。在FORM AIFF中不鼓勵(lì)使用此塊。應(yīng)該使用功能更強(qiáng)大的Comments Chunk。Annotation Chunk是可選的。FORM AIFF中可能存在許多Annotation Chunk。
?? ?(14)CHUNK PRECEDENCE
?? ??? ?FORM AIFF的幾個(gè)本地塊可能包含重復(fù)信息。例如,樂(lè)器塊定義了循環(huán)點(diǎn),MIDI數(shù)據(jù)塊中的MIDI系統(tǒng)專用數(shù)據(jù)也可以定義循環(huán)點(diǎn)。如果這些循環(huán)點(diǎn)不同會(huì)發(fā)生什么?應(yīng)用程序應(yīng)該如何循環(huán)聲音?
?? ??? ?通過(guò)定義塊的優(yōu)先級(jí)來(lái)解決此類(lèi)沖突:?
?? ??? ?Format Version Chunk ?? ??? ??? ?Highest precedence
?? ??? ?Common Chunk
?? ??? ?Instrument Chunk
?? ??? ?Saxel Chunk
?? ??? ?Comments Chunk
?? ??? ?Marker Chunk
?? ??? ?Sound Data Chunk
?? ??? ?Name Chunk
?? ??? ?Author Chunk
?? ??? ?Copyright Chunk
?? ??? ?Annotation Chunk(s) ?? ??? ??? ?-- in the order they appear in the FORM
?? ??? ?Audio Recording Chunk
?? ??? ?MIDI Data Chunk(s)
?? ??? ?Application Specific Chunks?? ??? ?Lowest precedence
?? ??? ?Common Chunk具有最高優(yōu)先級(jí),而Application Specific Chunk具有最低優(yōu)先級(jí)。
?? ??? ?Common Chunk中的信息始終優(yōu)先于任何其他塊中的沖突信息。Application Specific Chunk總是在與其他塊沖突時(shí)丟失。
?? ??? ?例如,通過(guò)查看塊層次結(jié)構(gòu),可以看到Instrument Chunk中的循環(huán)點(diǎn)優(yōu)先于MIDI數(shù)據(jù)塊中發(fā)現(xiàn)的沖突循環(huán)點(diǎn)。
?? ??? ?應(yīng)用程序負(fù)責(zé)將數(shù)據(jù)寫(xiě)入較低優(yōu)先級(jí)的塊,以確保更高優(yōu)先級(jí)的塊相應(yīng)地更新。
?? ?(15)FORM AIFC的示例?? ?
?? ??? ?請(qǐng)記住,塊可以在FORM AIFC中以任何順序出現(xiàn)
?? ??? ?示例列表:
?? ??? ?1.以22.25454 kHz采樣的8位單聲道聲音數(shù)據(jù)。聲音數(shù)據(jù)未壓縮。
?? ??? ?2.使用Macintosh Audio Compression&Expansion實(shí)用程序以22.25454 kHz采樣的8位單聲道聲音數(shù)據(jù),壓縮3倍。
?? ??? ?3.以44.1kHz(CD質(zhì)量)采樣的16位立體聲數(shù)據(jù)。聲音數(shù)據(jù)未壓縮。
?? ??? ?
?? ??? ?1)一個(gè)文件包含大約4.476秒的8位單聲道聲音數(shù)據(jù),采樣頻率為22.25454 kHz。聲音數(shù)據(jù)未壓縮。
?? ??? ?2)一個(gè)文件,包含大約28.972秒的8位聲音數(shù)據(jù),以22.25454 kHz采樣,并使用Macintosh音頻壓縮和擴(kuò)展實(shí)用程序壓縮3倍。
?? ??? ??? ?注意:聲音加速器塊(Saxel)使用附錄D中定義的Saxels的初步版本。
?? ??? ?3)包含大約2.325秒的16位立體聲聲音數(shù)據(jù)的文件,采樣頻率為44.1kHz(CD質(zhì)量)。聲音數(shù)據(jù)未壓縮。
?? ?(16)Compressed Audio Encoding Format
?? ??? ?1. ACE和Macintosh壓縮實(shí)用程序的編碼格式
?? ??? ?2. ACE和Macintosh壓縮聲音數(shù)據(jù)的標(biāo)記
?? ??? ?3. ACE和Macintosh的Saxels壓縮聲音數(shù)據(jù)
?? ??? ?
?? ??? ?編碼格式:
?? ??? ?針對(duì)單聲道聲音數(shù)據(jù)示出了編碼格式。下面描述多通道壓縮音頻編碼的示例。以下的原始聲音數(shù)據(jù)是8位線性樣本。
?? ??? ?3:1 Macintosh音頻壓縮和擴(kuò)展實(shí)用程序 ? Frame size = 2 bytes
?? ??? ?原始未壓縮單聲道聲音數(shù)據(jù):
?? ??? ?Marker:
?? ??? ?0 ?? ??? ?1 ?? ??? ?2 ?? ??? ?3 ?? ? ? 4 ?? ?5 ?? ??? ?6 ?? ??? ?7 ?? ??? ?8 ?? ? ?9 ?? ?10
?? ??? ?8-bits 8-bits 8-bits 8-bits 8-bits 8-bits 8-bits 8-bits 8-bits 8-bits 8-bits
?? ??? ?3:1 Compressed Sound Data: 8-bits 8-bits 8-bits 8-bits
?? ??? ?......
?? ??? ?
?? ??? ?標(biāo)記位置(參見(jiàn)標(biāo)記塊部分)針對(duì)擴(kuò)展(未壓縮)聲音數(shù)據(jù)。
?? ??? ?因此,必須進(jìn)行計(jì)算以從壓縮數(shù)據(jù)流中的位置映射到未壓縮聲音數(shù)據(jù)中的目標(biāo)位置。
未完...
參考:http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/AIFF/AIFF.html
?
總結(jié)
以上是生活随笔為你收集整理的AIFF-C压缩格式容器规范解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ubuntu18.04 未发现wifi驱
- 下一篇: 【F-16资料库】AIFF和IFF控制面