OGG流媒體文件格式探析論文

時間:2022-10-11 11:00:00

導語:OGG流媒體文件格式探析論文一文來源于網友上傳,不代表本站觀點,若需要原創文章可咨詢客服老師,歡迎參考。

OGG流媒體文件格式探析論文

摘要流媒體文件格式在流媒體系統中占有重要地位,設計合理的文件格式是提高流媒體服務器工作效率最直接和最有效的辦法。該文在剖析常用流媒體系統和文件格式的基礎上,特別地對美國基金會的開源流媒體工程ogg文件格式子項目做了深入的分析,指出Ogg格式對媒體編碼數據的存儲讀取和傳輸具有簡潔性,Ogg格式的映射與逆映射與媒體編碼數據具有相對獨立性,能夠有效提高流媒體服務器的工作效率。

關鍵詞流媒體;OGG文件格式;流服務器效率

1引言

流媒體是指在Internet/Intranet中使用流式傳輸技術的連續時基媒體,如音頻、視頻等多媒體文件。文件格式和傳輸協議是流媒體應用的主要技術。從不同的角度看,流媒體數據有三種格式:壓縮格式、文件格式、格式。其中壓縮格式描述了流媒體文件中媒體數據的編碼、解碼方式;流媒體文件格式是指服務器端待傳輸的流媒體組織形式,文件格式為數據交換提供了標準化的方式;流媒體格式是一種呈現給客戶端的媒體安排方式。本文所討論的格式是指第二種:流媒體文件格式。特別地分析了一種開源流媒體文件格式:Ogg。它是美國基金會開發的開源流媒體工程的一個子項目,它是應其開源音/視頻媒體壓縮編碼格式Vorbis/Theora等的存儲與傳輸需要而設計的。

本文在研究和分析已有流媒體系統的基礎上,結合在研發新的流媒體系統中的經驗和教訓,對流媒體文件格式做系統和深入的剖析,旨在深入理解流媒體系統和找到提高流媒體系統工作效率的方法。

2流媒體文件格式分析

2.1文件格式在流媒體系統中的重要性

一個簡化的流媒體系統由流媒體服務器、客戶端和傳輸網絡組成,流媒體系統的核心是流媒體服務器。隨著流媒體技術研究的深入和流媒體應用的擴展,如何提高流媒體系統的工作效率,主要指標體現為如何提高服務器并發媒體流的數量,這是一個被廣泛關注的課題。它取決于服務器處理每個流的效率,決定了一個服務器能夠同時為多少客戶服務,其成果不但具有理論價值,更具有極大的經濟價值。

圖1的圓圈內標出了影響流媒體系統性能的一些主要因素。如果對其中每個因素仔細分析判斷,可以發現對于一個現有的流媒體服務器而言,能有效提高其效率的手段并不多。例如:提升客戶端、服務器端的硬件配置,只能獲得性能提高,工作效率沒有得到提高;實時傳輸、控制協議是人們經過多年的大量應用實踐總結,由IETF因特網工程任務組確認的媒體流傳輸共同標準,是必須遵守的標準,是無法輕易改變的;節目源的質量、壓縮方式等因素對于服務器而言是不可預知或者是不可控制的。那么在這些客觀因素無法改變的情況下,優化流媒體文件格式為提高流媒體服務器的工作效率提供了可能。

流媒體文件格式能夠對服務器的工作效率產生影響是由流服務器工作方式的特點決定的。流服務器的主要工作任務是通過直播或點播的方式向用戶提供流媒體內容,它輸入磁盤上存儲的流媒體文件,然后進行實時傳輸協議封裝后再通過IP網絡輸出給客戶端。簡言之,其工作流程為3步:讀取、封裝、發送。由于每發送一個媒體流都需要啟動一個流程,并且所有流程都需要實時進行,可見當一個流服務器并發幾千個流時,每個流程工作效率的細小區別都會對服務器工作效率造成很大的影響。

圖1簡化的流媒體系統結構及其影響因素

每個工作流程的輸入是流媒體文件,輸出是媒體數據包。輸入、輸出數據的內容是沒有改變的,都是多媒體壓縮碼流,兩者之間只有格式的不同,所以從數據流角度來看,服務器的主要工作其實是一個格式轉換的過程。由于媒體數據包的格式是由傳輸協議事先確定的,那么流媒體文件格式是否能夠方便服務器讀取、封裝就決定了服務器的工作量。

2.2流媒體文件格式的分析與比較

流媒體文件在流媒體系統中具有重要地位,文獻[2]分析了具有代表性的QuickTime電影文件(mov)和MicrosoftMediaServer的電影文件(asf),對其文件格式和相關環節做了深入剖析。發現這些文件格式對服務器工作效率存在如下負面影響:

(1)磁盤控制器訪問吞吐量低。每次封裝一個媒體數據包需要讀取一幀數據,一般每幀大小為1K左右,每秒需要25幀,這造成對磁盤頻繁訪問,吞吐量低。

(2)對于QuickTimeMov文件格式,媒體數據沒有經過預處理,服務器每發一個包都需要從hint軌中獲得打包時需要的相關參數,實時讀取媒體數據、封裝、發送,對CPU占用率很大。

(3)對于MicrosoftAsf文件格式,媒體數據在Packet中時已經是mms包的半成品,服務器節省了截取媒體流的時間,但仍然需要服務器選擇媒體流來組織mms包。并且,Packet中的數據不全是需要發送的數據,浪費了內存空間和磁盤IO時間。

文獻[3]提出了一種新的流媒體文件格式NMF,該格式具有如下基本結構(如圖2所示)和特點:

圖2NMF文件結構

NMF流媒體文件由頭文件和體文件構成。頭文件主要包含文件描述、媒體描述、流描述等必要的信息;體文件包含全部的媒體數據。一個NMF由一個頭文件和若干個體文件構成,同一媒體源不同的流(不同的傳輸協議或不同的碼速率)存放在不同的體文件中,此結構用來實現多碼速率切換/智能流技術和兼容現有的流媒體播放器。頭文件和體文件的功能劃分原則是:當服務器和客戶建立連接時(在發送媒體數據之前),只需要從頭文件中讀數據;當服務器和客戶建立連接后,只需要從文件體中讀取媒體數據。這樣,服務器中各個模塊間耦合減少,效率提高。由于頭文件和體文件的相對獨立,使文件具有很強的可擴展性,并且使得利用硬件進行封裝、發送也成為可能。

NMF的核心思想就是充分利用預處理過程,將原始媒體文件組織成方便服務器處理的格式,減少實時封裝和發送時的工作量,同時增加文件結構的兼容性和可擴展性,以提高流服務器的工作效率,增加并發流數量。

3Ogg文件格式結構

3.1文件格式在流媒體系統中的重要性

邏輯流以頁(page)為單位組織鏈接成物理流,如圖3所示:

圖3Ogg文件的組織形式

圖3中的文件鏈接了兩個物理流,A、B和C三個邏輯流組成一個物理流,邏輯流D單獨是一個物理流。一個物理流中的所有邏輯流的bos_page都必須在物理位置上相鄰,如圖3所示*A*、*B*、*C*三個bos_page的位置。

bos:beginningofstream;eos:endofstream

映射到Ogg格式的媒體(如vorbis音頻,Theora視頻)有相關詳細定義,這些定義使得這些媒體之間有更具體的約束關系。Ogg本身并沒詳細說明多個并發媒體流之間的時間關系,這需要并發媒體流在映射到Ogg格式的時刻來指定,通常他們之間的交錯關系是按他們產生的時間先后順序來排列。

3.2Oggpage頁結構

每個頁之間相互獨立,都包含了各自應有的信息,頁的大小是可變的,通常為4K-8KB,最大值不能超過65307bytes(27+255+255*255=65307)。頁頭部格式如圖4。

頁頭部各字段域詳細說明參見文獻[4]:(小端字節序列格式LSB)。

⑴capture_pattern:模式捕獲域,4個字節,表示頁的開始,其作用是分離Ogg封裝格式還原媒體編碼時識別新頁的作用,它包含了四個幻數(ASCII字符集):

0x4f''''O''''0x67''''g''''0x67''''g''''0x53''''S''''

⑵stream_structure_version:1個字節,表示當前Ogg文件格式的版本,目前為0。

圖4Ogg頁頭部結構

⑶header_type_flag:頭部類型標識,1個字節。標識當前頁具體類型。其設置分三種情況:

*bit0x01若已設置,頁包含的媒體編碼數據于前一頁同屬于一個邏輯流的同一packet。若未設置,本頁是一個新的packet。

*bit0x02設置,表示邏輯流的第一個頁bos。未設,不是第一個頁。

*bit0x04設置,表示邏輯流的最后一頁eos。未設,不是最后一頁。

⑷granule_position:8個字節(字節6-字節13),包含了媒體編碼相關參數信息。對于音頻流,包含了到本頁為止邏輯流在PCM中采樣編碼的總次數。對于視頻流,包含了邏輯流到本頁為止視頻幀編碼的總次數。其值若為-1,則說明到此頁為止,邏輯流的packet還未結束。

⑸bitstream_serial_number:流序列號,4字節,表示本頁所屬邏輯流與其他邏輯流相區別的序號。

⑹page_sequence_number:表明了本頁在邏輯流中的序列號,Ogg解碼器能據此識別有無頁丟失。

⑺CRC_checksum:循環冗余校驗碼校驗和,4字節域,包含頁的32bitCRC校驗和(包括頁頭部零CRC校驗和頁數據校驗),它的產生多項式為:0x04c11db7。

⑻number_page_segments:1字節,給定了在本頁的segment_tabale域中所出現的segement個數,其最大值為255segments(每片255個字節),即頁頭部第26個字節的取值范圍為:0x00-0xff(0-255)。頁最大物理尺寸為65307bytes,小于64KB。

⑼segment_table:邏輯流中的每個packet每個segment長度的取值(lacingvalues,除了每個packet的最后一個segment小于255外,其它segment都為255),這些值以segment出現的先后順序依次排列。此域的字節數為number_page_segments域所表示的數字(即在0-255之間)。

bytevalue

270xff(255)

[.................]

n-10xff(255)

n0x00-0xfe(0-254,n=num_segments+26)

頁頭部長度的字節數:

header_size=27+number_page_segments[Byte]

即頁頭部長度為上述9個域名所表述占據的字節數之和。

頁的總長度:

page_size=header_size+sum(lacing_values:1...number_page_segments)[Byte]

即頁的總長度為頁頭部長度加上緊隨其后的若干segments長度之和(凈載荷長度)。

3.3Ogg封裝處理過程

(1)音視頻編碼在提供給Ogg封裝之前是以具有包邊界的“Packets”形式呈現的,包邊界依賴于具體的編碼格式。如圖5所示。

(2)將邏輯流的各個包進行分片segmentation,每片大小固定為255Byte,但包的最后一個segment通常小于255字節。因為packet的大小可以是任意長度,由具體的媒體編碼器來決定。

(3)進行頁封裝,每頁都被加上頁頭,每頁的長度可不等,由具體情況而確定。頁頭部segment_table域告知了“lacing_value”值的大小,即頁中最后一個segment的長度(可以為0,或小于255)。一次處理一個packet,此packet被封裝成一個或多個page頁(page的長度設定了上限,一般為4kB);下一個packet必須用新的page開始封裝,由首部字段域header_type_flag的設置規定來表示。

(4)多個已被頁格式封裝好的邏輯流(如語音、文本、圖片、音頻、視頻等)按應用要求的時序關系合成物理流。

3.4Ogg文件的映射與逆映射

用Ogg文件格式封裝好壓縮編碼媒體流可用于存儲(磁盤文件)或直接傳輸(TCP或管道),這是因為Ogg比特流格式提供了封裝/同步、差錯同步捕獲、尋找標記以及其它足夠的信息使得這種分散開的數據能夠完全地還原為封裝之前的具有包邊界“packet”形式的壓縮編碼媒體流,恢復到這種原來媒體流就具有的包邊界形式不需要依賴于針對壓縮編碼的解碼器。也就是說Ogg映射與逆映射和媒體流的壓縮編碼、解碼具有相對獨立性。

圖5Ogg封裝流程示意圖

Ogg文件需要解封裝的情況有兩種:(1)播放器要對媒體流解碼之前;(2)對媒體流進行RTP/UDP傳輸之前。解封裝的過程就是ogg逆映射過程,即還原為具有包邊界“packet”形式的媒體流,同時以預先填充好了的RTP首部字段與相應一段媒體數據捆綁,形成RTP封包。此過程便是媒體流從Ogg格式到RTP格式的轉換過程。

將以packet為單元的媒體流映射為以page為單元的Ogg格式比特流,其中間經過了segment的劃分和重組環節,但方便了對媒體流的存儲與傳輸(TCP)。對源緩沖區媒體數據(packet)的操作,需建立幾個中間環節的數據結構,只需將切割的媒體數據在內存移動一次,操作指向媒體數據的指針便能達到媒體數據遷移到目的緩沖區(page)的意圖,其過程可用兩個函數轉換來表述:

ogg_stream_packetin()àogg_stream_pageout()。將Ogg格式比特流逆映射還原為packets媒體流,以備播放解碼或以RTP封裝進行UDP傳輸。其中間環節是把page中的segment單元數據按順序重組為packet,同樣媒體數據在內存中的復制只有一次,其過程可用三個函數轉換來表述:ogg_sync_pageout()àogg_stream_pagein()àogg_stream_packetout(),媒體數據復制發生在第一個函數ogg_sync_pageout()。

Ogg映射與逆映射的功能都體現在ogg函數庫中,當前最新版本為libogg-1.1.3。

4結束語

Ogg格式是在吸收其它流媒體文件格式優點的基礎上針對具有“packet”包邊界形式的媒體流而制定的利于其存儲和傳輸的開源流媒體文件格式,在icecast流服務器的傳輸中得到了很好的應用;根據icecast官方網站公布其測試結果,在GB主干網的條件下對Oggvorbis音頻傳輸的客戶端并發流可達14000個。更為重要的是,作為流媒體技術的核心環節,大多數流媒體文件格式至今仍沒有完全公開,且受專利保護。要在流媒體技術和應用飛速發展的今天占得一席之地,遵從GNU/GPL協定,走開源之路,發展不受知識產權約束的流媒體文件格式是緊追先進流媒體技術的較佳選擇。

參考文獻

[1]李向陽,卞德森,流媒體及其應用技術[J].廣播與電視技術,2001,28(9):76-85

[2]馬杰,田金文.流媒體技術及其文件格式[J],計算機工程與應用,2003.23P49-52.

[3]馬杰,田金文.一種新的流媒體文件格式[J].計算機工程與科學,Vol126,No17,2004.

[4]Walleij,L..Theapplication/oggMediaType,RFC3534,May2003.

[5]Pfeiffer,S..TheOggEncapsulationFormatVersion0.RFC3533,May2003.

[6]/downloads/libogg

[7]/loadtest1.php