摘 要 流媒體文件格式在流媒體系統中占有重要地位,設計合理的文件格式是提高流媒體服務(wù)器工作效率最直接和最有效的辦法。該文在剖析常用流媒體系統和文件格式的基礎上,特別地對美國xiph.org基金會(huì )的開(kāi)源流媒體工程O(píng)gg文件格式子項目做了深入的分析,指出Ogg格式對媒體編碼數據的存儲讀取和傳輸具有簡(jiǎn)潔性,Ogg格式的映射與逆映射與媒體編碼數據具有相對獨立性,能夠有效提高流媒體服務(wù)器的工作效率。
1 引言
流媒體是指在Internet/Intranet中使用流式傳輸技術(shù)的連續時(shí)基媒體,如音頻、視頻等多媒體文件。文件格式和傳輸協(xié)議是流媒體應用的主要技術(shù)。從不同的角度看,流媒體數據有三種格式:壓縮格式、文件格式、發(fā)布格式。其中壓縮格式描述了流媒體文件中媒體數據的編碼、解碼方式;流媒體文件格式是指服務(wù)器端待傳輸的流媒體組織形式,文件格式為數據交換提供了標準化的方式;流媒體發(fā)布格式是一種呈現給客戶(hù)端的媒體安排方式。本文所討論的格式是指第二種:流媒體文件格式。特別地分析了一種開(kāi)源流媒體文件格式:Ogg。它是美國xiph.org基金會(huì )開(kāi)發(fā)的開(kāi)源流媒體工程的一個(gè)子項目,它是應其開(kāi)源音/視頻媒體壓縮編碼格式Vorbis/Theora等的存儲與傳輸需要而設計的。
本文在研究和分析已有流媒體系統的基礎上,結合在研發(fā)新的流媒體系統中的經(jīng)驗和教訓,對流媒體文件格式做系統和深入的剖析,旨在深入理解流媒體系統和找到提高流媒體系統工作效率的方法。
2 流媒體文件格式分析
2.1 文件格式在流媒體系統中的重要性
一個(gè)簡(jiǎn)化的流媒體系統由流媒體服務(wù)器、客戶(hù)端和傳輸網(wǎng)絡(luò )組成,流媒體系統的核心是流媒體服務(wù)器。隨著(zhù)流媒體技術(shù)研究的深入和流媒體應用的擴展,如何提高流媒體系統的工作效率,主要指標體現為如何提高服務(wù)器并發(fā)媒體流的數量,這是一個(gè)被廣泛關(guān)注的課題。它取決于服務(wù)器處理每個(gè)流的效率,決定了一個(gè)服務(wù)器能夠同時(shí)為多少客戶(hù)服務(wù),其成果不但具有理論價(jià)值,更具有極大的經(jīng)濟價(jià)值。
圖1的圓圈內標出了影響流媒體系統性能的一些主要因素。如果對其中每個(gè)因素仔細分析判斷,可以發(fā)現對于一個(gè)現有的流媒體服務(wù)器而言,能有效提高其效率的手段并不多。例如:提升客戶(hù)端、服務(wù)器端的硬件配置,只能獲得性能提高,工作效率沒(méi)有得到提高;實(shí)時(shí)傳輸、控制協(xié)議是人們經(jīng)過(guò)多年的大量應用實(shí)踐總結,由IETF因特網(wǎng)工程任務(wù)組確認的媒體流傳輸共同標準,是必須遵守的標準,是無(wú)法輕易改變的;節目源的質(zhì)量、壓縮方式等因素對于服務(wù)器而言是不可預知或者是不可控制的。那么在這些客觀(guān)因素無(wú)法改變的情況下,優(yōu)化流媒體文件格式為提高流媒體服務(wù)器的工作效率提供了可能。
流媒體文件格式能夠對服務(wù)器的工作效率產(chǎn)生影響是由流服務(wù)器工作方式的特點(diǎn)決定的。流服務(wù)器的主要工作任務(wù)是通過(guò)直播或點(diǎn)播的方式向用戶(hù)提供流媒體內容,它輸入磁盤(pán)上存儲的流媒體文件,然后進(jìn)行實(shí)時(shí)傳輸協(xié)議封裝后再通過(guò) IP網(wǎng)絡(luò )輸出給客戶(hù)端。簡(jiǎn)言之,其工作流程為3 步:讀取、封裝、發(fā)送。由于每發(fā)送一個(gè)媒體流都需要啟動(dòng)一個(gè)流程,并且所有流程都需要實(shí)時(shí)進(jìn)行,可見(jiàn)當一個(gè)流服務(wù)器并發(fā)幾千個(gè)流時(shí),每個(gè)流程工作效率的細小區別都會(huì )對服務(wù)器工作效率造成很大的影響。
圖1 簡(jiǎn)化的流媒體系統結構及其影響因素
每個(gè)工作流程的輸入是流媒體文件,輸出是媒體數據包。輸入、輸出數據的內容是沒(méi)有改變的,都是多媒體壓縮碼流,兩者之間只有格式的不同,所以從數據流角度來(lái)看,服務(wù)器的主要工作其實(shí)是一個(gè)格式轉換的過(guò)程。由于媒體數據包的格式是由傳輸協(xié)議事先確定的,那么流媒體文件格式是否能夠方便服務(wù)器讀取、封裝就決定了服務(wù)器的工作量。
2.2 流媒體文件格式的分析與比較
流媒體文件在流媒體系統中具有重要地位,文獻[2]分析了具有代表性的QuickTime電影文件(mov)和 Microsoft Media Server的電影文件(asf),對其文件格式和相關(guān)環(huán)節做了深入剖析。發(fā)現這些文件格式對服務(wù)器工作效率存在如下負面影響:
(1)磁盤(pán)控制器訪(fǎng)問(wèn)吞吐量低。每次封裝一個(gè)媒體數據包需要讀取一幀數據,一般每幀大小為1K左右,每秒需要25幀,這造成對磁盤(pán)頻繁訪(fǎng)問(wèn),吞吐量低。
(2)對于QuickTime Mov文件格式,媒體數據沒(méi)有經(jīng)過(guò)預處理,服務(wù)器每發(fā)一個(gè)包都需要從hint軌中獲得打包時(shí)需要的相關(guān)參數,實(shí)時(shí)讀取媒體數據、封裝、發(fā)送,對CPU占用率很大。
(3)對于Microsoft Asf文件格式,媒體數據在Packet中時(shí)已經(jīng)是mms包的半成品,服務(wù)器節省了截取媒體流的時(shí)間,但仍然需要服務(wù)器選擇媒體流來(lái)組織mms包。并且,Packet中的數據不全是需要發(fā)送的數據,浪費了內存空間和磁盤(pán)IO時(shí)間。
文獻[3]提出了一種新的流媒體文件格式NMF,該格式具有如下基本結構(如圖2所示)和特點(diǎn):
圖2 NMF文件結構
NMF流媒體文件由頭文件和體文件構成。頭文件主要包含文件描述、媒體描述、流描述等必要的信息;體文件包含全部的媒體數據。一個(gè)NMF由一個(gè)頭文件和若干個(gè)體文件構成,同一媒體源不同的流(不同的傳輸協(xié)議或不同的碼速率)存放在不同的體文件中,此結構用來(lái)實(shí)現多碼速率切換/智能流技術(shù)和兼容現有的流媒體播放器。頭文件和體文件的功能劃分原則是:當服務(wù)器和客戶(hù)建立連接時(shí)(在發(fā)送媒體數據之前),只需要從頭文件中讀數據;當服務(wù)器和客戶(hù)建立連接后,只需要從文件體中讀取媒體數據。這樣,服務(wù)器中各個(gè)模塊間耦合減少,效率提高。由于頭文件和體文件的相對獨立,使文件具有很強的可擴展性,并且使得利用硬件進(jìn)行封裝、發(fā)送也成為可能。
NMF的核心思想就是充分利用預處理過(guò)程,將原始媒體文件組織成方便服務(wù)器處理的格式,減少實(shí)時(shí)封裝和發(fā)送時(shí)的工作量,同時(shí)增加文件結構的兼容性和可擴展性,以提高流服務(wù)器的工作效率,增加并發(fā)流數量。
3 Ogg 文件格式結構
3.1 文件格式在流媒體系統中的重要性
邏輯流以頁(yè)(page)為單位組織鏈接成物理流,如圖3所示:
圖3 Ogg 文件的組織形式
圖3中的文件鏈接了兩個(gè)物理流,A、B和C三個(gè)邏輯流組成一個(gè)物理流,邏輯流D單獨是一個(gè)物理流。一個(gè)物理流中的所有邏輯流的bos_page都必須在物理位置上相鄰,如圖3所示*A*、*B*、*C*三個(gè)bos_page的位置。
bos:beginning of stream; eos:end of stream
映射到Ogg格式的媒體(如vorbis音頻,Theora視頻)有相關(guān)詳細定義,這些定義使得這些媒體之間有更具體的約束關(guān)系。Ogg 本身并沒(méi)詳細說(shuō)明多個(gè)并發(fā)媒體流之間的時(shí)間關(guān)系,這需要并發(fā)媒體流在映射到Ogg格式的時(shí)刻來(lái)指定,通常他們之間的交錯關(guān)系是按他們產(chǎn)生的時(shí)間先后順序來(lái)排列。
3.2 Ogg page 頁(yè)結構
每個(gè)頁(yè)之間相互獨立,都包含了各自應有的信息,頁(yè)的大小是可變的,通常為4K-8KB,最大值不能超過(guò)65307bytes(27+255+255*255=65307)。頁(yè)頭部格式如圖4。
頁(yè)頭部各字段域詳細說(shuō)明參見(jiàn)文獻[4]:(小端字節序列格式LSB)。
⑴ capture_pattern: 模式捕獲域,4個(gè)字節,表示頁(yè)的開(kāi)始,其作用是分離Ogg封裝格式還原媒體編碼時(shí)識別新頁(yè)的作用,它包含了四個(gè)幻數(ASCII字符集):
0x4f 'O' 0x67 'g' 0x67 'g' 0x53 'S'
⑵ stream_structure_version:1個(gè)字節,表示當前Ogg文件格式的版本,目前為0。
圖4 Ogg頁(yè)頭部結構
⑶ header_type_flag:頭部類(lèi)型標識,1個(gè)字節。標識當前頁(yè)具體類(lèi)型。其設置分三種情況:
* bit 0x01 若已設置,頁(yè)包含的媒體編碼數據于前一頁(yè)同屬于一個(gè)邏輯流的同一packet。若未設置,本頁(yè)是一個(gè)新的packet。
* bit 0x02 設置,表示邏輯流的第一個(gè)頁(yè)bos。未設,不是第一個(gè)頁(yè)。
* bit 0x04 設置,表示邏輯流的最后一頁(yè)eos。未設,不是最后一頁(yè)。
⑷ granule_position:8個(gè)字節(字節6-字節13),包含了媒體編碼相關(guān)參數信息。對于音頻流,包含了到本頁(yè)為止邏輯流在PCM中采樣編碼的總次數。對于視頻流,包含了邏輯流到本頁(yè)為止視頻幀編碼的總次數。其值若為-1,則說(shuō)明到此頁(yè)為止,邏輯流的packet還未結束。
⑸ bitstream_serial_number:流序列號,4字節,表示本頁(yè)所屬邏輯流與其他邏輯流相區別的序號。
⑹ page_sequence_number: 表明了本頁(yè)在邏輯流中的序列號,Ogg解碼器能據此識別有無(wú)頁(yè)丟失。
⑺ CRC_checksum: 循環(huán)冗余校驗碼校驗和,4字節域,包含頁(yè)的32bit CRC校驗和(包括頁(yè)頭部零CRC校驗和頁(yè)數據校驗),它的產(chǎn)生多項式為:0x04c11db7。
⑻ number_page_segments:1字節,給定了在本頁(yè)的segment_tabale域中所出現的segement個(gè)數,其最大值為255segments(每片255個(gè)字節),即頁(yè)頭部第26個(gè)字節的取值范圍為:0x00-0xff (0-255)。頁(yè)最大物理尺寸為65307bytes,小于64KB。
⑼ segment_table:邏輯流中的每個(gè)packet每個(gè)segment長(cháng)度的取值(lacing values,除了每個(gè)packet的最后一個(gè)segment小于255外,其它segment都為255),這些值以segment出現的先后順序依次排列。此域的字節數為number_page_segments域所表示的數字(即在0-255之間)。
byte value
27 0xff (255)
[................. ]
n-1 0xff (255)
n 0x00-0xfe (0-254, n=num_segments+26)
頁(yè)頭部長(cháng)度的字節數:
header_size = 27 + number_page_segments [Byte]
即頁(yè)頭部長(cháng)度為上述9個(gè)域名所表述占據的字節數之和。
頁(yè)的總長(cháng)度:
page_size = header_size + sum(lacing_values: 1...number_page_segments) [Byte]
即頁(yè)的總長(cháng)度為頁(yè)頭部長(cháng)度加上緊隨其后的若干segments長(cháng)度之和(凈載荷長(cháng)度)。
3.3 Ogg封裝處理過(guò)程
(1)音視頻編碼在提供給Ogg封裝之前是以具有包邊界的“Packets”形式呈現的,包邊界依賴(lài)于具體的編碼格式。如圖5所示。
(2)將邏輯流的各個(gè)包進(jìn)行分片segmentation,每片大小固定為255Byte,但包的最后一個(gè)segment通常小于255字節。因為packet的大小可以是任意長(cháng)度,由具體的媒體編碼器來(lái)決定。
(3)進(jìn)行頁(yè)封裝,每頁(yè)都被加上頁(yè)頭,每頁(yè)的長(cháng)度可不等,由具體情況而確定。頁(yè)頭部segment_table域告知了 “l(fā)acing_value”值的大小,即頁(yè)中最后一個(gè)segment的長(cháng)度(可以為0,或小于255)。一次處理一個(gè)packet,此packet被封裝成一個(gè)或多個(gè)page頁(yè)(page的長(cháng)度設定了上限,一般為4kB);下一個(gè)packet必須用新的page開(kāi)始封裝,由首部字段域header_type_flag的設置規定來(lái)表示。
(4)多個(gè)已被頁(yè)格式封裝好的邏輯流(如語(yǔ)音、文本、圖片、音頻、視頻等)按應用要求的時(shí)序關(guān)系合成物理流。
3.4 Ogg文件的映射與逆映射
用Ogg文件格式封裝好壓縮編碼媒體流可用于存儲(磁盤(pán)文件)或直接傳輸(TCP或管道),這是因為Ogg比特流格式提供了封裝/同步、差錯同步捕獲、尋找標記以及其它足夠的信息使得這種分散開(kāi)的數據能夠完全地還原為封裝之前的具有包邊界“packet”形式的壓縮編碼媒體流,恢復到這種原來(lái)媒體流就具有的包邊界形式不需要依賴(lài)于針對壓縮編碼的解碼器。也就是說(shuō)Ogg映射與逆映射和媒體流的壓縮編碼、解碼具有相對獨立性。
圖5 Ogg封裝流程示意圖
Ogg文件需要解封裝的情況有兩種:(1)播放器要對媒體流解碼之前;(2)對媒體流進(jìn)行RTP/UDP傳輸之前。解封裝的過(guò)程就是ogg逆映射過(guò)程,即還原為具有包邊界“packet”形式的媒體流,同時(shí)以預先填充好了的RTP首部字段與相應一段媒體數據捆綁,形成RTP封包。此過(guò)程便是媒體流從Ogg格式到RTP格式的轉換過(guò)程。
將以packet為單元的媒體流映射為以page為單元的Ogg格式比特流,其中間經(jīng)過(guò)了segment的劃分和重組環(huán)節,但方便了對媒體流的存儲與傳輸(TCP)。對源緩沖區媒體數據(packet)的操作,需建立幾個(gè)中間環(huán)節的數據結構,只需將切割的媒體數據在內存移動(dòng)一次,操作指向媒體數據的指針便能達到媒體數據遷移到目的緩沖區(page)的意圖,其過(guò)程可用兩個(gè)函數轉換來(lái)表述:
ogg_stream_packetin()àogg_stream_pageout()。 將Ogg格式比特流逆映射還原為packets媒體流,以備播放解碼或以RTP封裝進(jìn)行UDP傳輸 。其中間環(huán)節是把page中的segment單元數據按順序重組為packet,同樣媒體數據在內存中的復制只有一次,其過(guò)程可用三個(gè)函數轉換來(lái)表述:ogg_sync_pageout()à ogg_stream_pagein ()à ogg_stream_packetout(),媒體數據復制發(fā)生在第一個(gè)函數ogg_sync_pageout()。
Ogg映射與逆映射的功能都體現在ogg函數庫中,當前最新版本為libogg-1.1.3。
4 結束語(yǔ)
Ogg格式是在吸收其它流媒體文件格式優(yōu)點(diǎn)的基礎上針對具有“packet”包邊界形式的媒體流而制定的利于其存儲和傳輸的開(kāi)源流媒體文件格式,在icecast流服務(wù)器的傳輸中得到了很好的應用;根據icecast官方網(wǎng)站公布其測試結果,在GB主干網(wǎng)的條件下對Oggvorbis音頻傳輸的客戶(hù)端并發(fā)流可達14000個(gè)。更為重要的是,作為流媒體技術(shù)的核心環(huán)節,大多數流媒體文件格式至今仍沒(méi)有完全公開(kāi),且受專(zhuān)利保護。要在流媒體技術(shù)和應用飛速
發(fā)展的今天占得一席之地,遵從GNU/GPL協(xié)定,走開(kāi)源之路,發(fā)展不受知識產(chǎn)權約束的流媒體文件格式是緊追先進(jìn)流媒體技術(shù)的較佳選擇。
幾種常見(jiàn)的流媒體格式文件:
微軟高級流格式ASF簡(jiǎn)介
Microsoft公司的Windows Media的核心是ASF(Advanced Stream Format)。微軟將ASF 定義為同步媒體的統一容器文件格式。ASF是一種數據格式,音頻、視頻、圖像以及控制命令腳本等多媒體信息通過(guò)這種格式,以網(wǎng)絡(luò )數據包的形式傳輸,實(shí)現流式多媒體內容發(fā)布。
ASF最大優(yōu)點(diǎn)就是體積小,因此適合網(wǎng)絡(luò )傳輸,使用微軟公司的最新媒體播放器(Microsoft Windows Media Player)可以直接播放該格式的文件。用戶(hù)可以將圖形、聲音和動(dòng)畫(huà)數據組合成一個(gè)ASF格式的文件,當然也可以將其他格式的視頻和音頻轉換為ASF格式,而且用戶(hù)還可以通過(guò)聲卡和視頻捕獲卡將諸如麥克風(fēng)、錄像機等等外設的數據保存為ASF格式。另外,ASF格式的視頻中可以帶有命令代碼,用戶(hù)指定在到達視頻或音頻的某個(gè)時(shí)間后觸發(fā)某個(gè)事件或操作。
ASF的特征
可擴展的媒體類(lèi)型- ASF文件允許制作者很容易地定義新的媒體類(lèi)型。ASF格式提供了非常有效的靈活地定義符合ASF文件格式定義的新的媒體流類(lèi)型。任一存儲的媒體流邏輯上都是獨立于其他媒體流的,除非在文件頭部分明顯地定義了其與另一媒體流的關(guān)系。
部件下載-特定的有關(guān)播放部件的信息(如,解壓縮算法和播放器)能夠存儲在A(yíng)SF 文件頭部分,這些信息能夠為客戶(hù)機用來(lái)找到合適的所需的播放部件的版本---如果它們沒(méi)有在客戶(hù)機上安裝。
可伸縮的媒體類(lèi)型- ASF是設計用來(lái)表示可伸縮的媒體類(lèi)型的"帶寬"之間的依賴(lài)關(guān)系。ASF存儲各個(gè)帶寬就像一個(gè)單獨的媒體流。媒體流之間的依賴(lài)關(guān)系存儲在文件頭部分,為客戶(hù)機以一個(gè)獨立于壓縮的方式解釋可伸縮的選項提供了豐富的信息流的優(yōu)先級化- 現代的多媒體傳輸系統能夠動(dòng)態(tài)地調整以適應網(wǎng)絡(luò )資源緊張的情況(如,帶寬不足)。多媒體內容的制作者要能夠根據流的優(yōu)先級表達他們的參考信息,如最低保證音頻流的傳輸。隨著(zhù)可伸縮媒體類(lèi)型的出現,流的優(yōu)先級的安排變得復雜起來(lái),因為在制作的時(shí)候很難決定各媒體流的順序。ASF允許內容制作者有效地表達他們的意見(jiàn)(有關(guān)媒體的優(yōu)先級),甚至在可伸縮的媒體類(lèi)型出現的情況下也可以.
多語(yǔ)言- ASF設計為支持多語(yǔ)言。媒體流能夠可選地指示所含媒體的語(yǔ)言。這個(gè)功能常用于音頻和文本流。一個(gè)多語(yǔ)言ASF文件指的是包含不同語(yǔ)言版本的同一內容的一系列媒體流,其允許客戶(hù)機在播放的過(guò)程中選擇最合適的版本。
目錄信息- ASF提供可繼續擴展的目錄信息的功能,該功能的擴展性和靈活性都非常好。所有的目錄信息都以無(wú)格式編碼的形式存儲在文件頭部分,并且支持多語(yǔ)言,如果需要,目錄信息既可預先定義(如,作者和標題),也可以是制作者自定義。目錄信息功能既可以用于整個(gè)文件也可以用于單個(gè)媒體流。
RealSystem的RealMedia文件格式
RealNetworks公司的RealMedia包括RealAudio、RealVideo和RealFlash三類(lèi)文件,其中RealAudio用來(lái)傳輸接近CD音質(zhì)的音頻數據,RealVideo用來(lái)傳輸不間斷的視頻數據,RealFlash則是RealNetworks公司與Macromedia公司新近聯(lián)合推出的一種高壓縮比的動(dòng)畫(huà)格式RealMedia文件格式的引入了,它使得RealSystem可以通過(guò)各種網(wǎng)絡(luò )傳送高質(zhì)量的多媒體內容。第三方開(kāi)發(fā)者可以通過(guò)RealNetworks公司提供的SDK將它們的媒體格式轉換成RealMedia文件格式。
QuickTime電影(Movie)文件格式
Apple公司的QuickTime電影文件現已成為是數字媒體領(lǐng)域的工業(yè)標準。 QuickTime電影文件格式定義了存儲數字媒體內容的標準方法,使用這種文件格式不僅可以存儲單個(gè)的媒體內容(如視頻幀或音頻采樣),而且能保存對該媒體作品的完整描述;QuickTime文件格式被設計用來(lái)適應為與數字化媒體一同工作需要存儲的各種數據。因為這種文件格式能用來(lái)描述幾乎所有的媒體結構,所以它是應用程序間(不管運行平臺如何)交換數據的理想格式。QuickTime文件格式中媒體描述和媒體數據是分開(kāi)存儲的,媒體描述或元數據(meta-data)叫做電影(movie),包含軌道數目、視頻壓縮格式和時(shí)間信息。同時(shí)movie包含媒體數據存儲區域的索引。媒體數據是所有的采樣數據,如視頻幀和音頻采樣,媒體數據可以與QuickTime movie存儲在同一個(gè)文件中,也可以在一個(gè)單獨的文件或者在幾個(gè)文件中。