發展過程
OGM起源於一個網際網路上的黑客想用ogg vorbis音頻格式作為視頻的音軌,然而他發現由於AVI的天生結構缺陷,使得聲畫難以同步,最後在盡力多次嘗試之後,他終於得到了結果,不是把ogg vorbis併入到AVI中,而是把一個視頻檔案併入到OGG中,這最終導致了OGM格式的出現,因此OGM檔案的格式和OGG檔案是相同的。
OGM作為一個全新的多媒體容器,在視頻上可以使用DivX/XviD的編碼畫面,音頻上可以使用ogg vorbis/AC3/(CBR/ABR/VBR)MP3等,文本上可以使用srt字幕,支持Chapetr。
尤為重要的一點是OGM可以方便的嵌入多個音軌和字幕,然後只要安裝了相應的解碼器,就可以使用wmp6.4無困難的播放,OGM在索引上要遠快於AVI,拖動進度條再也不用像AVI情況下等上好一陣子,同時Chapter又可以把DVD中的章節信息完美載入。而且在聲畫同步上OGM做得更好,不用出現某些AVI情況下畫面要快進才能趕上聲音的場面,同時在製作上還能進一步節省為同步而占用的空間。
OGM目前已經有一整套完整的工具支持 ;
Ogg Vorbis Direct Show Filters——wmp6.4 需要用來回放OGM的外掛程式 ;
Ogg subtitle filter——wmp6.4 用來回放OGM內置字幕的外掛程式 ;
HeadAC3he or BeSweet and OggMachine——用來將AC3轉成ogg vorbis的工具 ;
Ogg Cutter——用於切割OGM的工具 ;
OggMux——用於製作OGM的工具 。
同時線性編輯之王VirtualDub的一個特殊版本VirutalDubMOD也全面支持OGM格式。儘管OGM不會完全取代AVI,但是有理由相信古老的AVI格式被替代是不可避免的。
檔案格式
邏輯流以頁(page)為單位組織連結成物理流。每個頁之間相互獨立,都包含了各自應有的信息,頁的大小是可變的,通常為4K-8KB,最大值不能超過65307bytes(27+255+255*255=65307)。
頁頭部各欄位域詳細說明
⑴ capture_pattern: 模式捕獲域,4個位元組,表示頁的開始,其作用是分離Ogg封裝格式還原媒體編碼時識別新頁的作用,它包含了四個幻數(ASCII字元集):
0x4f 'O' 0x67 'g' 0x67 'g' 0x53 'S'
⑵ stream_structure_version:1個位元組,表示當前Ogg檔案格式的版本,目前為0。
⑶ header_type_flag:頭部類型標識,1個位元組。標識當前頁具體類型。其設定分三種情況:
* bit 0x01 若已設定,頁包含的媒體編碼數據於前一頁同屬於一個邏輯流的同一packet。若未設定,本頁是一個新的packet。
* bit 0x02 設定,表示邏輯流的第一個頁bos。未設,不是第一頁。
* bit 0x04 設定,表示邏輯流的最後一頁eos。未設,不是最後一頁。
⑷ granule_position:8個位元組(位元組6-位元組13),包含了媒體編碼相關參數信息。對於音頻流,包含了到本頁為止邏輯流在PCM中採樣編碼的總次數。對於視頻流,包含了邏輯流到本頁為止視頻幀編碼的總次數。其值若為-1,則說明到此頁為止,邏輯流的packet還未結束。
⑸ bitstream_serial_number:流序列號,4位元組,表示本頁所屬邏輯流與其他邏輯流相區別的序號。
⑹ page_sequence_number: 表明了本頁在邏輯流中的序列號,Ogg解碼器能據此識別有無頁丟失。
⑺ CRC_checksum:循環冗餘校驗碼校驗和,4位元組域,包含頁的32bit CRC校驗和(包括頁頭部零CRC校驗和頁數據校驗),它的產生多項式為:0x04c11db7。
⑻ number_page_segments:1位元組,給定了在本頁的segment_tabale域中所出現的segement個數,其最大值為255segments(每片255個位元組),即頁頭部第26個位元組的取值範圍為:0x00-0xff (0-255)。頁最大物理尺寸為65307bytes,小於64KB。
⑼ segment_table:邏輯流中的每個packet每個segment長度的取值(lacing values,除了每個packet的最後一個segment小於255外,其它segment都為255),這些值以segment出現的先後順序依次排列。此域的位元組數為number_page_segments域所表示的數字(即在0-255之間)。
頁頭部長度的位元組數
header_size = 27 + number_page_segments [Byte]
即頁頭部長度為上述9個域名所表述占據的位元組數之和。
頁的總長度
page_size = header_size + sum(lacing_values: 1...number_page_segments) [Byte]
即頁的總長度為頁頭部長度加上緊隨其後的若干segments長度之和。
封裝過程
(1)音視頻編碼在提供給Ogg封裝之前是以具有包邊界的“Packets”形式呈現的,包邊界依賴於具體的編碼格式。
(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)多個已被頁格式封裝好的邏輯流(如語音、文本、圖片、音頻、視頻等)按套用要求的時序關係合成物理流。
處理方法
處理音頻採用Vorbis編碼的OGM影片的三種方法
經常接觸計算機視頻的朋友相信對DivX並不陌生,它是目前很流行的一種視頻編碼格式,而Vorbis則是一種音頻編碼格式,由於其完全免費且開放源碼,正受到越來越多的關注。以下文中所講的OGM影片,也就是視頻採用DivX或XviD編碼,音頻採用Ogg編碼的影片。
要想觀看OGM影片並不困難,只要你安裝了相應的解碼器就可以了。不過,如果你想要用視頻編輯軟體對OGM影片進行處理,就不是那么容易了,因為多數視頻編輯軟體並不支持處理這種格式的影片。這裡介紹三種處理OGM格式影片的方法,供讀者參考。
轉換並製作成VCD
如果要將OGM影片轉換成VCD,就比較簡單了。運行TMPGEnc Plus,在程式操作主界面中點擊“視頻源”右側的“瀏覽”按鈕,打開要轉換的影片,然後點擊界面右下方的“設定”按鈕,對有關參數進行設定。例如要剪接影片,可以打開“詳細視頻設定”選項卡,雙擊“源檔案範圍”選項,然後在彈出的對話框中進行設定。設定完成後,回到程式主界面,單擊上方的“開始壓縮”按鈕就可以開始轉換了。
轉換成其它視頻格式
使用TMPGEnc Plus可以將OGM影片轉製成VCD,但如果要轉換成其它的視頻格式,例如AVI、WMV,怎么辦?我們可以試試Zealot All Video Joiner這款工具。
運行該軟體,打開程式主界面。首先添加需要轉換的影片檔案,單擊“Add”按鈕,打開需要轉換的影片檔案。回到程式主界面後,可以在列表框中看到添加的檔案,單擊選中後,按下右側的“Preview”按鈕,查看影片播放是否正常。
在“Output File Format”選項組中指定相應的選項,可以將OGM影片轉換成MPEG、AVI或者是WMV格式。例如要將影片轉換成AVI格式,可以點選AVI一項,如果勾選了右側的“Use Video Compressor(使用視頻壓縮)”和“Use Audio Compressor(使用音頻壓縮)”,下方的視頻編碼和音頻編碼下拉列表框就會激活,我們可以根據需要選擇合適的編碼器。這裡還需要注意對畫面尺寸及拉伸模式進行設定。確認無誤後,單擊界面右上方的“Join”按鈕執行轉換,等到軟體處理完畢,就可以在原資料夾中找到轉換後的視頻檔案。
分割與合併
如果要對OGM影片進行分割,我們可以試試另一款工具All Video Splitter,它也能夠對這類影片進行處理。此外,要想分割、合併這種格式的影片,還有一種簡單的方法,那就是利用檔案分割器。這裡以WinSplit為例,介紹一下具體的操作方法:
運行WinSplit程式(如圖2),首先在左側窗格中選擇需要分割的影片檔案,這時工作視窗左上方就會顯示出檔案名稱和檔案的位元組大小。然後單擊右側區域“Parts”下拉列表框,按照需要剪裁的部分選擇分片數。同時,確認下方的“Batch File”複選框已經勾選,這樣程式在分割時會自動生成一個批處理檔案。最後選擇存放檔案塊的目標資料夾。確認上述設定無誤後,單擊工具列中的“Split”按鈕,即可對影片檔案進行分割。分割完成後,可以在指定的資料夾中找到分割的檔案塊以及一個合併用的批處理檔案。
接下來,我們需要對合併批處理檔案重新編輯。例如要刪除影片的第二部分,用記事本打開與影片同名的批處理檔案,找到合併檔案這行命令:
Copy /b "filename.001" + "filename.002" + "filename.003" + "filename.004" "filename.avi"
將其改為:
Copy /b "filename.001" + "filename.003" + "filename.004" "filename.avi"
最後雙擊執行該批處理檔案,將分割檔案塊合併即可。這裡需要注意的是,不能將檔案頭部分剪掉,否則就無法正常播放。