http://blog.csdn.net/chenmeimei_8899/archive/2009/01/20/3839463.aspx
wma是微軟定義的一種媒體檔案格式,它是一種流媒體,由於wma協議是不公開的所以我們就只能通過大量的檔案來做分析,簡單的分析網上一般都可以找到,下邊我就引用別人的一些:
ASF檔案和WMA檔案格式差不多。具體請看下面我寫的代碼。檔案分析根據mplayer其中的asfhead.c提供的代碼進行分析。mplayer只解除出了標準的wma頭資訊,其擴充資訊並沒有解析出來。代碼如下.
每一個WMA檔案,它的頭16個位元組是固定的,為十六進位的“30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C”,用來標識這個是否為WMA檔案。接下來的8個位元組為一個整數,表示整個WMA檔案頭部的大小,這個頭部裡麵包含了Tag資訊等所有非音頻資訊,頭部後面的是音頻資訊,我們在這裡就不深入瞭解了。1所示。那個整數接下來的6個位元組還沒搞清楚是什麼用的,不過不影響我們對Tag資訊的讀寫。以下是WMA檔案結構:
/*
也就是說從檔案開始位移量為31開始,裡面存放了很多幀,有我們需要的標準Tag資訊,擴充Tag資訊,WMA檔案控制資訊等等。每個幀不是等長的,但是幀頭是固定的24個位元組,其中前16位元組是用來標識這個幀的名字,後8個位元組是用來表示這個幀(包括幀頭)的大小。這一點和MP3檔案的ID3V2資訊比較像。
由於我們只需要讀寫Tag資訊,而Tag資訊又分別儲存在兩個幀裡,分別為標準Tag幀和擴充Tag幀,所有我們只需要處理這兩個幀,其他幀完全可以根據獲得的幀長度來跳過。
2,標準Tag幀只包含歌曲標題,藝術家,著作權,備忘四個內容。它的幀名是十六進位的“33 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C”,在24個位元組的幀頭後緊跟著5個分別為2個位元組的整數,前四個分別表示歌曲標題,藝術家,著作權,備忘的大小,第五個還不清楚是什麼用的,大部分情況下是不使用的,即它的大小為0的。
在這10個位元組後,這四個資訊的內容就按順序存放了。記住,在WMA檔案裡,所有的文字都是按Unicode寬字元的編碼方式儲存的,而且每個字串後面都又一個0結束字元的。
再看擴充Tag幀,這裡就比較麻煩了,裡麵包含的資訊的個數是不確定的,每個資訊也是按照像幀一樣的方式組織起來的。擴充Tag幀的幀名是十六進位的“40 A4 D0 D2 07 E3 D2 11 97 F0 00 A0 C9 5E A8 50”,在24位元組的幀頭後先有一個兩個位元組的整數表示這個幀裡一共有的擴充資訊個數(ExNo)。
每一個擴充資訊包含擴充資訊名字和對應的值。先有一個兩個位元組的整數來表示副檔名字資訊的大小,接著是擴充資訊,然後有一個兩個位元組的整數標誌(Flag),這個後面再講。然後又是一個兩個位元組的整數,表示值的大小。接著就是這個值。
當擴充資訊名字為WMFSDKVersion時,這個值表示的是這個WMA檔案的版本;當擴充資訊名字為WM/AlbumTitle時,這個值代表的就是專輯名;當擴充資訊名字為WM/Genre時,這個值代表的就是流派;同理,很容易從擴充資訊的名字看出這個值的用途的。這些擴充資訊的名字和值幾乎都是用Unicode的字串來儲存的,到現在為止只發現對下面兩個情況例外
下面再來看看那個標誌Flag,這個基本上是為沒什麼用的(通常值為0),只對WM/TrackNumber和WM/Track這兩個擴充資訊名字有用,當Flag為3的時候後面的值(也就是曲目資訊)是以4個位元組的整數的形式表示,當Flag為0的時候,曲目資訊是以普通的字串形式表示的。
一般的都是這個樣子的,但是wma有很多版本,只能說在測試的過程中遇到了做一下處理.
我主要說的是關於寫wma的頭,寫檔案當然要保證檔案不被改變,如果一點些不對都會導致檔案不能播放,這是很讓人鬱悶的,我就遇到過,怎麼改也無法讓它播放.一般情況下不要去改變檔案的頭,在wma的頭部一般都會加上很多的0位元組的字元,可以就是為了修改吧.我們稱它為padding值.它一般以:0x74, 0xD4, 0x06, 0x18, 0xDF, 0xCA, 0x09, 0x45,
0xA4, 0xBA, 0x9A, 0xAB, 0xCB, 0x96, 0xAA, 0xE8表示pading幀
有興趣的可以對此做一個分析.
Wma開始有一個是16個位元組的標識,表示是wma:30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 62 CE 6C,在這16個位元組後面有6位元組不清楚是什麼,但是很多人說這6個自己是wma幀的個數。一般沒有什麼用處,可以不管跳過就行。
下來就是wma的幀了,wma有很多幀,每個幀前16個位元組來標識這個幀,緊跟著的8個位元組表示幀的大小。常常用到的是標準的tag和擴充的tag。
1.標準的tag的標識位元組為:33 26 b2 75 8e 66 cf 11 a6 d9 00 aa 00 62 ce 6c,標準的tag裡包含了5個資訊分別是:名稱,藝術家,著作權,注釋,還有一個不清楚。標準tag的結構如下:
幀頭標識(16)
幀大小(8)
音樂名稱大小
藝術家大小
著作權大小
注釋大小
第五個資訊大小
音樂名稱
藝術家
著作權
注釋
第五個資訊
2.擴充tag:40 A4 D0 D2 07 E3 D2 11 97 F0 00 A0 C9 5E A8 50,這裡麵包含了專輯,流派,專輯封面等資訊。其幀的結構如下:
頭標識(16)
幀大小(8)
資訊個數(2)
資訊表示的長度(2)
標識內容
Flag(2)
內容長度(2)
內容
當擴充資訊名字為WMFSDKVersion時,這個值表示的是這個WMA檔案的版本;當擴充資訊名字為WM/AlbumTitle時,這個值代表的就是專輯名;當擴充資訊名字為WM/Genre時,這個值代表的就是流派;"WM/Picture" 這個代碼專輯的封面。這裡重點說一下在arm上讀取音樂檔案裡面的圖片。
儲存圖片的結構如下:
WM/Picture
Flag(2)
Tag size (2)
Unknown flag(1)
Image length
Unknown flag(2)
Image Type
Data
在arm上讀取圖片的時候有它自己的類型如果類型不對,就會出錯。可以通過ISHELL_GetHandle來得到IImage介面的classid。
3.wma頭的擴充幀:B5 03 BF 5F 2E A9 CF 11 8E E3 00 C0 0C 20 53 65,這個tag裡包含了很多資訊,在擴充幀裡可能又包含了很多子幀,有一個對寫wma有用的就是padding的幀,這個幀可以作為擴充幀的子幀也可以獨立成為一幀。這個幀可以在不重新寫wma的情況下,可以對wma的頭做改變。不管padding幀在哪裡它的標識都是一樣的:74 D4 06 18 DF CA 09 45 A4 BA 9A AB CB 96 AA E8,後面的8個位元組表示幀的大小,其他的都是00。
在擴充幀裡有
擴充幀的結構如下:
擴充幀頭標識(16)
幀的大小(8)
保留位(16)
保留位(2)
資料大小(4)
資料(包含很多幀)
3.關於wma屬性的幀,這個幀的16個位元組的標識為:A1 DC AB 8C 47 A9 CF 11 8E E4 00 C0 0C 20 53 65,這個幀裡包含了檔案的大小,建立時間以及檔案播放的一些資料如資料包的個數,碼率等資訊,這些我們就不用詳細瞭解了。在幀開始的第24後跟的是關於檔案大小的資訊。
關於修改wma的頭。
大部分的wma都有pading這個幀,所以不用重新寫檔案,將修改的內容寫入padding就可以了,下面詳細介紹寫法:以修改音樂名稱為例。
音樂名稱是寫在標準tag裡的,所以要修改標準tag。如果pading幀在標準tag的後面那就要把從標準tag到padding tag的內容全部向後移動或者向前移動,總之保證新寫入標準tag的大小。所以要修改padding,如果padding tag在extension tag裡就要修改擴充頭裡的padding的大小,資料的大小,padding tag的大小,如果padding不是extension tag的子tag那就寫該padding tag的大小就行了。然後修改標準頭的大小,再修改音樂名稱長度,在修改名稱。還有一種情況就是如果沒有標準tag,那就需要建立一個標準的tag,一般將它寫在檔案的開頭。寫wma頭的時候一定要小心,因為如果一旦寫錯就會導致檔案破壞不能播放。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/chenmeimei_8899/archive/2009/01/20/3839463.aspx
MPEG音頻檔案格式詳解一(轉載) 2009-06-19 03:21
MP3 檔案是由幀(frame)構成的,幀是MP3 檔案最小的組成單位。MP3 的全稱應為MPEG1 Layer-3 音頻檔案,MPEG(Moving Picture Experts Group)在漢語中譯為活動圖表像專家組,特指活動影音壓縮標準,MPEG 音頻檔案是MPEG1 標準中的聲音部分,也叫MPEG 音頻層,它根據壓縮品質和編碼複雜程度劃分為三層,即 Layer-1、Layer2、Layer3,且分別對應MP1、MP2、MP3 這三種音效檔,並根據不同的用途,使用不同層 次的編碼。MPEG音頻編碼的層次越高,編碼器越複雜,壓縮率也越高,MP1 和MP2 的壓縮率分別為4:1 和 6:1-8:1,而MP3 的壓縮率則高達10:1-12:1,也就是說,一分鐘CD 音質的音樂,未經壓縮需要10MB的儲存空間,而經過MP3 壓縮編碼後只有1MB 左右。不過MP3 對音頻訊號採用的是有損壓縮方式,為了降低聲音失真度,MP3 採取了“感官編碼技術”,即編碼時先對音頻檔案進行頻譜分析,然後用過濾器濾掉噪音電平,接著通過量化的方式將剩下的每一位打散排列,最後形成具有較高壓縮比的MP3 檔案,並使壓縮後的檔案在回放時能夠達到比較接近原音源的聲音效果。 一、MPEG音頻壓縮基礎 在眾多音頻壓縮方法中,這些方法在保持聲音品質的同時盡量壓縮數字音頻使之佔用更小的儲存空間。MPEG壓縮是該領域中效果最好的一個。這種壓縮是有損壓縮,這意味著,當運用這一方法壓縮時肯定會丟失一部分音頻資訊。但是,由於壓縮方法的控制很難發現這種損失。使用幾個非常複雜和苛刻的數學演算法,使得只有原始音頻中幾乎聽不到的部分損失掉。這就給重要的資訊剩下了更多的空間。通過這種方法可以將音頻壓縮12倍(可以選擇壓縮率),效果顯著。正是應為他的品質,MPEG音頻變得流行起來。 MPEG-1,MPEG-2和MPEG-4都是人們熟悉的MPEG標準,MP3隻涉及到前兩中,另外還有一個非官方標準MPEG-2.5用於擴充MPEG-2/LSF到更低的採樣率。 MPEG-1音頻(ISO/IEC 11172-3)描述了具有如下屬性的三層音頻編碼: 1或2個聲道 採樣頻率為32kHz,44.1kHz或48kHz 位率從32kbps到448kbps 每一層都有自己的優點。 MPEG-2音頻(ISO/IEC 13818-3)有兩個MPEG-1的擴充,通常叫做MPEG-2/LSF和MPEG-2/Multichannel MPEG-2/LSF有如下特點: 1或2個聲道 採樣頻率為MPEG-1的一半 傳輸速率從8kbps256kbps MPEG-2/Mutichannel有如下特點: 多達5個聲道和1個LFE-通道(低頻增強 不是重低音) 同MPEG-1一樣的採樣頻率 5.1的最高傳輸速率可能達到1Mbps 二、MPEG Layer3編/解碼的基本原理 音樂CD具有44.1KHz 16Bits 立體聲的音頻品質,一張CD可以儲存74分鐘的歌曲(大約15首左右)。如何將這些歌曲無損或基本無損地進行壓縮,以使在同樣的媒體上儲存更多的歌曲,一直困擾著軟體業。當MPEG協會提出MPEG Audio Layer1~Layer3後,機會產生了。通過使用MPEG1 Layer3編碼技術,製作者得以用大約12∶1的壓縮率記錄16KHz頻寬的有損音樂訊號。不過,同CD原聲區別不大。人的聽力系統具有非常優越的效能,其動態範圍超過96dB。你既可以聽到扣子掉在地上這樣小的聲音,也可以聽到波音747的強大的轟鳴聲。但當我們站在飛機場聽著波音747的轟鳴時,你還能分辨出扣子掉在地上的聲音嗎?不可能。人的聽力系統適應聲音的動態變化,人們對這種適應及屏蔽特性音質研究後得出對聲音壓縮非常有用的理論。人們很早以前就知道利用這種特性來為磁帶錄音降低噪音了(當沒有音樂時嘶嘶聲很容易聽到,而當音樂訊號電平很高時嘶嘶聲不容易聽到)。當聲音較強時產生屏蔽效應。在閾值曲線下的噪音或小訊號聲音無法被人耳聽到。在較強訊號出現時,允許通過更多的訊號。在此時增加被量化過的小訊號資料(使用無用的位來攜帶更多的資訊)可以達到一定程度的壓縮的目的。通常情況下,MP3壓縮器將原始聲音通過FFT(快速傅立葉變換)變化到頻域,然後通過一定的演算法算出何種頻率聲音可以攜帶更多的資訊。而在還原時解碼器所需要做的僅僅是將其從頻域再變換回來。 三、整個MP3檔案結構: MP3檔案大體分為三部分:TAG_V2(ID3V2),Frame, TAG_V1(ID3V1)
ID3V2 |
包含了作者,作曲,專輯等資訊,長度不固定,擴充了ID3V1的資訊量。 |
Frame . . . Frame |
一系列的幀,個數由檔案大小和幀長決定 每個FRAME的長度可能不固定,也可能固定,由位率bitrate決定 每個FRAME又分為幀頭和資料實體兩部分 幀頭記錄了mp3的位率,採樣率,版本等資訊,每個幀之間相互獨立 |
ID3V1 |
包含了作者,作曲,專輯等資訊,長度為128BYTE。 |
四、MPEG音訊框架格式 一個MPEG音頻檔案是許多的稱為幀的較小部分組成的,通常,幀是獨立的組成部分。每一幀都擁有自己的頭和音頻資訊。沒有檔案頭。所以,我們可以剪下MPEG檔案的任何部分並且能夠正常播放(當然要分割到幀的結束處儘管許多程式會處理錯誤頭)。在LayerIII中就並不是100%正確的。這是因為在MPEG-1LayerIII檔案中的資料群組織中,幀常常是互相關聯的並且不能那樣隨便裁切。 當你想讀取MPEG檔案的資訊時,通常只找到第一幀就足夠了,讀取它的頭資訊然後假設其它幀是相同的就可以。但這也不是所有情況。變位元速率的MPEG檔案使用使用所謂位元變換,也就是說每一幀的位元速率依照具體內容變化。這種方法沒有減少聲音品質的幀將應用較低的傳輸速率。這樣就允許更好的壓縮品質的同時又保證了高品質的音質。 幀頭由每一幀的前4個位元組(32位)組成。幀頭的前11位元(或前12個位,見下文關於幀同步)總是固定的稱作“幀同步”。因此,可以在整個檔案中尋找第一個幀同步(即:必須找到一個值為255的且其後跟著三到四個最高位置1的位元組。)然後讀取整個頭檢查值是否正確。關於頭中每一個位元的具體含義應該驗證那一個值的有效性可以操看下面的表格,如果存在被定義為保留,無效,損壞或不允許的值表明該頭已經損壞。記住,光有這些是不夠的,幀同步能在許多二進位檔案裡面的應用是很廣的。而且,MPEG檔案可能在開頭包含可能有錯誤同步資訊的垃圾,所以我們必須檢查兩個或者更多一些幀來確定我們現在讀取的檔案是一個MPEG檔案。 幀可能還有CRC校正。如果存在的話,CRC校正緊跟在幀頭之後,長為16位元。CRC校正之後是音頻資料。計算出幀長度,如果你需要讀取其他頭或者計算該幀的CRC值,可以使用它比較檔案中讀出來的幀。驗證MPEG頭的有效性這是一個非常好的方法。 (參考:http://mpgedit.org/mpgedit/index.html) |