国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【音視頻 | Ogg】Ogg封裝格式詳解——包含Ogg封裝過(guò)程、數(shù)據(jù)包(packet)、頁(yè)(page)、段(segment)等

這篇具有很好參考價(jià)值的文章主要介紹了【音視頻 | Ogg】Ogg封裝格式詳解——包含Ogg封裝過(guò)程、數(shù)據(jù)包(packet)、頁(yè)(page)、段(segment)等。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

??博客主頁(yè)??:??https://blog.csdn.net/wkd_007??
??博客內(nèi)容??:??嵌入式開發(fā)、Linux、C語(yǔ)言、C++、數(shù)據(jù)結(jié)構(gòu)、音視頻??
??本文內(nèi)容??:??介紹Ogg文件格式??
??金句分享??:??子曰:見賢思齊焉,見不賢而內(nèi)自省也。——《論語(yǔ)·里仁篇》。意思是,看見德才兼?zhèn)涞娜司拖蛩麑W(xué)習(xí),希望能向他看齊;看見不賢的人,就反省自己有沒有和他一樣的缺點(diǎn),有要改正。??

文章未經(jīng)允許,不許轉(zhuǎn)載 ?。。?/p>

opus、Ogg 相關(guān)文章:
1、RFC3533 :Ogg封裝格式版本 0(The Ogg Encapsulation Format Version 0)
2、Ogg封裝格式詳解——包含Ogg封裝過(guò)程、數(shù)據(jù)包(packet)、頁(yè)(page)、段(segment)等
3、libogg庫(kù)詳解介紹以及使用——附帶libogg庫(kù)解析.opus文件的C源碼
4、RFC7845:Opus音頻編解碼器的Ogg封裝(Ogg Encapsulation for the Opus Audio Codec)
5、opus編解碼庫(kù)(opus-1.4)詳細(xì)介紹以及使用——附帶解碼示例代碼
6、opus編碼的Ogg封裝文件詳解


【音視頻 | Ogg】Ogg封裝格式詳解——包含Ogg封裝過(guò)程、數(shù)據(jù)包(packet)、頁(yè)(page)、段(segment)等,音視頻基礎(chǔ),音視頻,Ogg,Ogg封裝格式,Ogg封裝過(guò)程,libogg

??一、Ogg 概述

Ogg是一個(gè)自由且開放標(biāo)準(zhǔn)的多媒體文件格式,由Xiph.Org基金會(huì)所維護(hù)。Ogg格式并不受到軟件專利的限制,并設(shè)計(jì)用于有效率地流媒體和處理高質(zhì)量的數(shù)字多媒體。

與大多數(shù)容器格式一樣,它封裝了原始的壓縮數(shù)據(jù),并允許在一種方便的格式中交錯(cuò)存儲(chǔ)音頻和視頻數(shù)據(jù)。

Ogg 這個(gè)詞匯通常意指Ogg Vorbis此一音頻文件格式,也就是將Vorbis編碼的音效包含在Ogg的容器中所成的格式。在以往,.ogg 此一擴(kuò)展名曾經(jīng)被用在任何Ogg支持格式下的內(nèi)容,但在2007年,Xiph.Org 基金會(huì)為了向后兼容的考慮,提出請(qǐng)求,將.ogg只留給Vorbis格式來(lái)使用。 Xiph.Org基金會(huì)決定創(chuàng)造一些新的擴(kuò)展名和媒體格式來(lái)描述不同類型的內(nèi)容,像是只包含音效所用的.oga,包含或不含聲音的影片(涵蓋 Theora)所用的.ogv和程序所用的.ogx

更多關(guān)于Ogg的資料可以到Ogg官網(wǎng)學(xué)習(xí):https://xiph.org/ogg/

描述Ogg封裝格式的 RFC3533 文檔:https://www.xiph.org/ogg/doc/rfc3533.txt 或 https://datatracker.ietf.org/doc/html/rfc3533

原文鏈接:https://blog.csdn.net/wkd_007/article/details/134150061

【音視頻 | Ogg】Ogg封裝格式詳解——包含Ogg封裝過(guò)程、數(shù)據(jù)包(packet)、頁(yè)(page)、段(segment)等,音視頻基礎(chǔ),音視頻,Ogg,Ogg封裝格式,Ogg封裝過(guò)程,libogg

??二、Ogg 支持的編碼格式

Ogg意指一種文件格式,可以納入各式各樣自由和開放源代碼的編解碼器,包含音效、視頻、文字(像字幕)與元數(shù)據(jù)的處理。
下面是Ogg支持的編碼格式:

  • 音頻

    • 有損
      • Speex:以低比特率處理語(yǔ)音數(shù)據(jù)(?2.1-32 kbit / s /通道)
      • Vorbis:處理中高級(jí)可變比特率(每通道≈16-500kbit / s)的一般音頻數(shù)據(jù)
      • Opus:以低和高可變比特率處理語(yǔ)音,音樂和通用音頻(每通道≈6-510kbit / s)
    • 無(wú)損
      • FLAC:處理文件和高保真音頻數(shù)據(jù)。
    • 未壓縮
      • OggPCM:處理未壓縮的PCM音頻。它與WAV大致相當(dāng)[5]。
  • 視頻

    • 有損
      • Theora:基于On2的VP3,它的目標(biāo)是與MPEG-4視頻(例如,使用DivX或Xvid編碼),RealVideo或Windows Media Video進(jìn)行競(jìng)爭(zhēng)。
      • Daala:正在開發(fā)的視頻編碼格式。
      • Dirac:由BBC開發(fā)的免費(fèi)開放視頻格式。使用小波編碼[6]。
      • Tarkin:實(shí)驗(yàn)項(xiàng)目,現(xiàn)在過(guò)時(shí)的視頻編解碼器在2000年,2001年和2002年開發(fā)利用離散小波變換的三個(gè)維度的寬度,高度和時(shí)間。[7][8][9]。在Theora成為視頻編碼的主要焦點(diǎn)之后,已被擱置(2002年8月)[10]。
    • 無(wú)損
      • Dirac:Dirac規(guī)范的一部分涵蓋無(wú)損壓縮。
      • Daala:正在開發(fā)的視頻編碼格式。
  • 文本

    • Writ:用于嵌入字幕或字幕的文本編解碼器的草稿不完整,于2007年停止[11]。
    • CMML:用于定時(shí)元數(shù)據(jù),字幕和格式的文本/應(yīng)用編解碼器。
    • Annodex:CSIRO開發(fā)的免費(fèi)開源標(biāo)準(zhǔn),用于注釋和索引網(wǎng)絡(luò)媒體。
    • OggKate:最初設(shè)計(jì)用于卡拉OK和文本的重疊編解碼器,可以在Ogg中復(fù)用。

【音視頻 | Ogg】Ogg封裝格式詳解——包含Ogg封裝過(guò)程、數(shù)據(jù)包(packet)、頁(yè)(page)、段(segment)等,音視頻基礎(chǔ),音視頻,Ogg,Ogg封裝格式,Ogg封裝過(guò)程,libogg

??三、Ogg 基礎(chǔ)知識(shí)

?3.1 Ogg 相關(guān)術(shù)語(yǔ)

  • 物理比特流:Ogg封裝的結(jié)果,被稱為物理(Ogg)比特流,也就是說(shuō).ogg文件屬于一個(gè)物理比特流。
  • 邏輯比特流:Ogg封裝了一個(gè)或多個(gè)編碼器創(chuàng)建的比特流,稱為 邏輯比特流,例如:Vorbis編碼的流,Theora編碼的流等。
    每個(gè)邏輯比特流都以一個(gè)特殊的起始頁(yè)(bos=beginning of stream)開始,并以一個(gè)特定的頁(yè)(eos=end of stream)結(jié)束。
  • 分包(packet):Ogg封裝過(guò)程中,邏輯比特流會(huì)被拆分為一系列數(shù)據(jù)包(packet),它們不包含邊界信息地串在一起。
  • 頁(yè)(page):頁(yè)(page)是Ogg物理比特流的基本組成單位。Ogg比特流由一個(gè)個(gè)大小可變的頁(yè)(page)組成,頁(yè)的大小通常為4-8 kB,最大65307字節(jié)。
  • 段(segments):由于頁(yè)的最大大小約為64k字節(jié),封裝時(shí)有些數(shù)據(jù)包(packet)太大,需要存在幾個(gè)頁(yè)里。為了簡(jiǎn)化過(guò)程,Ogg將每個(gè)數(shù)據(jù)包劃分為255字節(jié)長(zhǎng)的塊和最后一個(gè)較短的塊,這些塊被稱為“Ogg段”(Ogg Segments)。假設(shè)一個(gè)數(shù)據(jù)包(packet)大小為520字節(jié),那么它會(huì)被分成三個(gè)段,大小分別為:255字節(jié)、255字節(jié)、10字節(jié)。
    (疑問(wèn):有沒有可能有些數(shù)據(jù)包很小,使得一頁(yè)中包含很多個(gè)數(shù)據(jù)包?)

?3.2 Ogg 物理比特流類型

  • 分組(Grouping):分組(Grouping)定義了如何在同一物理比特流中逐頁(yè)交錯(cuò)多個(gè)邏輯比特流。例如,在同一比特流中將視頻流和音頻流交錯(cuò)存儲(chǔ)。
  • 鏈接(Chaining):完整的邏輯比特流被連接在一起。

看下圖例子加深理解:在這個(gè)例子中,有兩個(gè)鏈接的物理比特流,第一個(gè)是由三個(gè)邏輯比特流A、B和C組成的分組流。第二個(gè)物理比特流D鏈接在分組比特流的末尾之后,分組比特流在其所有分組邏輯比特流的最后一個(gè)eos頁(yè)之后結(jié)束。
【音視頻 | Ogg】Ogg封裝格式詳解——包含Ogg封裝過(guò)程、數(shù)據(jù)包(packet)、頁(yè)(page)、段(segment)等,音視頻基礎(chǔ),音視頻,Ogg,Ogg封裝格式,Ogg封裝過(guò)程,libogg

?3.3 Ogg 封裝過(guò)程

Ogg 封裝過(guò)程:
1、編碼器提供的比特流作為“分包”(Packets)移交給Ogg,分包邊界(packet boundaries)取決于編碼格式;
2、Ogg封裝過(guò)程將數(shù)據(jù)包分割成若干段;
3、將一組連續(xù)的段(segments)包裝成一個(gè)可變長(zhǎng)度的頁(yè)面(page);
4、最后將各個(gè)頁(yè)(page)混合組成一個(gè)Ogg物理比特流。

【音視頻 | Ogg】Ogg封裝格式詳解——包含Ogg封裝過(guò)程、數(shù)據(jù)包(packet)、頁(yè)(page)、段(segment)等,音視頻基礎(chǔ),音視頻,Ogg,Ogg封裝格式,Ogg封裝過(guò)程,libogg
上圖是Ogg封裝過(guò)程的例子:

  • 1、編解碼器提供的部分比特流細(xì)分為數(shù)據(jù)包。
  • 2、Ogg封裝過(guò)程將數(shù)據(jù)包分割成若干段。本例中的數(shù)據(jù)包相當(dāng)大,因此數(shù)據(jù)包1被分為5個(gè)段,其中4個(gè)段有255個(gè)字節(jié),最后一個(gè)較小。數(shù)據(jù)包2分為4個(gè)段,其中3個(gè)段有255個(gè)字節(jié),最后一個(gè)非常小。數(shù)據(jù)包3分為兩個(gè)段。
  • 3、封裝過(guò)程會(huì)創(chuàng)建頁(yè)面,在本例中頁(yè)面非常小。頁(yè)面1由數(shù)據(jù)包1的前三個(gè)段組成,頁(yè)面2包含數(shù)據(jù)包1中剩余的兩個(gè)段,頁(yè)面3包含數(shù)據(jù)包2的前三頁(yè)。
  • 4、最后,該邏輯比特流的頁(yè)面和其他邏輯比特流頁(yè)面被混合組成一個(gè)物理Ogg比特流。

【音視頻 | Ogg】Ogg封裝格式詳解——包含Ogg封裝過(guò)程、數(shù)據(jù)包(packet)、頁(yè)(page)、段(segment)等,音視頻基礎(chǔ),音視頻,Ogg,Ogg封裝格式,Ogg封裝過(guò)程,libogg

??四、Ogg 文件結(jié)構(gòu)

從上面內(nèi)容可知,Ogg文件也屬于一個(gè)物理比特流。是由一個(gè)個(gè)頁(yè)(page)組成的。首先,我們要了解一個(gè)頁(yè)的內(nèi)容,然后找到Ogg文件的各個(gè)頁(yè)就可以解析Ogg文件了。

?4.1 Ogg 頁(yè)(page)格式

Ogg的頁(yè)(page)由頁(yè)面頭部(page header) 加上該頁(yè)的各個(gè)段(segments)的數(shù)據(jù)組成。
【音視頻 | Ogg】Ogg封裝格式詳解——包含Ogg封裝過(guò)程、數(shù)據(jù)包(packet)、頁(yè)(page)、段(segment)等,音視頻基礎(chǔ),音視頻,Ogg,Ogg封裝格式,Ogg封裝過(guò)程,libogg

頁(yè)面頭部(page header)中的9個(gè)字段具有以下含義:

  • 1、capture_pattern:表示頁(yè)面開始的4字節(jié)字段。它包含4個(gè)字符:O、g、gS。它可以幫助解碼器找到頁(yè)面邊界,并在解析損壞的流后重新獲得同步。一旦發(fā)現(xiàn)捕獲模式,解碼器就通過(guò)計(jì)算和比較校驗(yàn)和來(lái)驗(yàn)證頁(yè)面同步和完整性。

  • 2、stream_structure_version:1字節(jié),表示該流中使用的Ogg文件格式的版本號(hào)(本文檔指定版本0)。

  • 3、header_type_flag:這1字節(jié)字段中的位標(biāo)識(shí)該頁(yè)面的特定類型。

    • bit 0x01
      • 被設(shè)置:頁(yè)面包含從上一頁(yè)繼續(xù)的數(shù)據(jù)包的數(shù)據(jù)。
      • 沒設(shè)置: 頁(yè)面包含新的數(shù)據(jù)包
    • bit 0x02
      • 被設(shè)置:這是邏輯比特流(bos)的第一頁(yè)
      • 沒設(shè)置:此頁(yè)面不是首頁(yè)
    • bit 0x04
      • 被設(shè)置:這是邏輯比特流(eos)的最后一頁(yè)
      • 沒設(shè)置:這一頁(yè)不是最后一頁(yè)
  • 4、granule_position:包含位置信息的8字節(jié)字段。例如,對(duì)于音頻流,它可能包含在包括此頁(yè)面上完成的所有幀之后編碼的PCM樣本的總數(shù)。對(duì)于視頻流,它可能包含在此頁(yè)面之后編碼的視頻幀的總數(shù)。這是對(duì)解碼器的提示,并給它一些定時(shí)和位置信息。其含義取決于該邏輯比特流的編解碼器,并在特定媒體映射中指定。特殊值-1(以2的補(bǔ)碼表示)表示此頁(yè)上沒有數(shù)據(jù)包結(jié)束。

  • 5、bitstream_serial_number:包含唯一序列號(hào)的4字節(jié)字段,通過(guò)該唯一序列號(hào)來(lái)識(shí)別邏輯比特流。

  • 6、page_sequence_number:包含頁(yè)面序列號(hào)的4字節(jié)字段,使得解碼器可以識(shí)別頁(yè)面丟失。該序列號(hào)在每個(gè)邏輯比特流上分別增加。

  • 7、CRC_checksum:包含頁(yè)面的32位CRC校驗(yàn)和的4字節(jié)字段(包括具有零CRC字段的報(bào)頭和頁(yè)面內(nèi)容)。生成多項(xiàng)式為0x04c11db7。

  • 8、number_page_segments:1字節(jié),給出分段表(segment table)中編碼的分段條目的數(shù)量。

  • 9、segment_table:大小為 number_page_segments 個(gè)字節(jié)。包含此頁(yè)中所有段的lacing value。每個(gè)字節(jié)包含一個(gè) lacing value。

以字節(jié)為單位的頁(yè)面頭部大小(total header size)由下式給出:

header_size = number_page_segments + 27 [Byte]

以字節(jié)為單位的總頁(yè)面大小由下式給出:頁(yè)面頭部大小 + 所有l(wèi)acing_values值之和

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

?4.2 Ogg 封裝文件解析

這里按照上面的頁(yè)的格式,演示怎樣解析一個(gè)Ogg封裝的文件,文件可以在這個(gè)鏈接下載:https://download.csdn.net/download/wkd_007/88492683 。

用Notepad打開該文件并查看十六進(jìn)制模式:

下面是文件第一頁(yè)的數(shù)據(jù):
【音視頻 | Ogg】Ogg封裝格式詳解——包含Ogg封裝過(guò)程、數(shù)據(jù)包(packet)、頁(yè)(page)、段(segment)等,音視頻基礎(chǔ),音視頻,Ogg,Ogg封裝格式,Ogg封裝過(guò)程,libogg

  • capture_pattern字段:值為0x4f、0x67、0x67、0x53,對(duì)應(yīng)字符OggS,表示頁(yè)起始標(biāo)志;
  • stream_structure_version字段:值為0x00,表示版本號(hào);
  • header_type_flag字段:值為0x02,表示邏輯比特流(bos)的第一頁(yè);
  • granule_position字段:值為0x0,媒體編碼相關(guān)的參數(shù)信息,表示到本頁(yè)為止邏輯流有0個(gè)采樣;
  • bitstream_serial_number字段:0x23、0x49、0x02、0x11,邏輯比特流序列號(hào);
  • page_sequence_number字段:0x00、0x00、0x00、0x00,頁(yè)面序列號(hào);
  • CRC_checksum字段:0xdf、0xe2、0x0c、0x1f,32位CRC校驗(yàn);
  • number_page_segments字段:0x01,表示后面段(segment)的個(gè)數(shù),本頁(yè)有1個(gè)段(segment);
  • segment_table:前面指明了只有1個(gè)段,所以segment_table大小為1個(gè)字節(jié),值為 0x13,表示這個(gè)段的大小為0x13個(gè)字節(jié)。
  • 后面的0x13個(gè)字節(jié)就是段的內(nèi)容(上圖中淺藍(lán)色背景的字節(jié)):0x4f開始到0x00。

緊接著是第二頁(yè)的數(shù)據(jù):
【音視頻 | Ogg】Ogg封裝格式詳解——包含Ogg封裝過(guò)程、數(shù)據(jù)包(packet)、頁(yè)(page)、段(segment)等,音視頻基礎(chǔ),音視頻,Ogg,Ogg封裝格式,Ogg封裝過(guò)程,libogg

  • capture_pattern字段:值為0x4f、0x67、0x67、0x53,對(duì)應(yīng)字符OggS,表示頁(yè)起始標(biāo)志;
  • stream_structure_version字段:值為0x00,表示版本號(hào);
  • header_type_flag字段:值為0x00,表示不是邏輯比特流(bos)的第一頁(yè),也不是最后一頁(yè),也不包含從上一頁(yè)繼續(xù)的數(shù)據(jù)包;
  • granule_position字段:值為0x0,媒體編碼相關(guān)的參數(shù)信息,表示到本頁(yè)為止邏輯流有0個(gè)采樣;
  • bitstream_serial_number字段:0x23、0x49、0x02、0x11,邏輯比特流唯一序列號(hào);
  • page_sequence_number字段:0x01、0x00、0x00、0x00,頁(yè)面序列號(hào);
  • CRC_checksum字段:0xd4、0x3e、0x3f、0x20,32位CRC校驗(yàn);
  • number_page_segments字段:0x03,表示后面段(segment)的個(gè)數(shù),本頁(yè)有3個(gè)段(segment);
  • segment_table:前面指明了3個(gè)段,所以segment_table大小為3個(gè)字節(jié),值為 0xff、0xff、0xfe,表示這個(gè)3個(gè)段的大小分別為為 0xff、0xff、0xfe個(gè)字節(jié)。后面三個(gè)段的總字節(jié)數(shù)為: 0xff+0xff+0xfe=0x2fc字節(jié)。
  • 之后的0x2fc個(gè)字節(jié)就是三個(gè)段的內(nèi)容(上圖中淺藍(lán)色背景的字節(jié),沒顯示完整):0x4f開始到0x00。這里的起始地址是0x4d,加上0x2fc,就是下一頁(yè)的地址0x349。

緊接著是第三頁(yè)的數(shù)據(jù),起始地址是0x349
【音視頻 | Ogg】Ogg封裝格式詳解——包含Ogg封裝過(guò)程、數(shù)據(jù)包(packet)、頁(yè)(page)、段(segment)等,音視頻基礎(chǔ),音視頻,Ogg,Ogg封裝格式,Ogg封裝過(guò)程,libogg

  • capture_pattern字段:值為0x4f、0x67、0x67、0x53,對(duì)應(yīng)字符OggS,表示頁(yè)起始標(biāo)志;
  • stream_structure_version字段:值為0x00,表示版本號(hào);
  • header_type_flag字段:值為0x00,表示不是邏輯比特流(bos)的第一頁(yè),也不是最后一頁(yè),也不包含從上一頁(yè)繼續(xù)的數(shù)據(jù)包;
  • granule_position字段:值為0x80、0xbb、0x0、0x0、0x0、0x0、0x0、0x0,媒體編碼相關(guān)的參數(shù)信息,小端表示到本頁(yè)的邏輯流有48000幀(小端0xbb80=48000);
  • bitstream_serial_number字段:0x23、0x49、0x02、0x11,邏輯比特流唯一序列號(hào);
  • page_sequence_number字段:0x02、0x00、0x00、0x00,頁(yè)面序列號(hào);
  • CRC_checksum字段:0x98、0x9d、0xc5、0x56,32位CRC校驗(yàn);
  • number_page_segments字段:0x33,表示后面段(segment)的個(gè)數(shù),本頁(yè)有51(0x33=51)個(gè)段(segment);
  • segment_table:前面指明了51個(gè)段,所以segment_table大小為51個(gè)字節(jié),值分別為圖中藍(lán)色背景部分,每個(gè)字節(jié)表示各個(gè)段的大小。這51個(gè)字節(jié)的值相加就是后面51個(gè)段總字節(jié)數(shù):0xff + 0x06 + 0xe5 + 0xab + 0xa2 + 0xa1 + 0xa5 + 0xa3 + 0xdf + 0xab + 0xa7 + 0xa1 + 0xa3 + 0x9d + 0xec + 0xe0 + 0xa4 + 0x9e + 0xb3 + 0xa6 + 0xbe + 0xb8 + 0xb4 + 0xaa + 0xa3 + 0xa2 + 0xa4 + 0x99 + 0x9f + 0x9c + 0x96 + 0x94 + 0x94 + 0x97 + 0x99 + 0x9a + 0xa1 + 0x9e + 0xa0 + 0xa6 + 0xa1 + 0xa0 + 0xaa + 0xa9 + 0xac + 0xa4 + 0xa6 + 0x9d + 0x9a + 0x94 + 0x98 = 8484個(gè)字節(jié);
  • 之后的8484個(gè)字節(jié)就是51個(gè)段的內(nèi)容。第一個(gè)段的起始地址是0x397,加上8484,就是下一頁(yè)的地址0x24bb

緊接著是第四頁(yè)的數(shù)據(jù),起始地址是0x24bb
【音視頻 | Ogg】Ogg封裝格式詳解——包含Ogg封裝過(guò)程、數(shù)據(jù)包(packet)、頁(yè)(page)、段(segment)等,音視頻基礎(chǔ),音視頻,Ogg,Ogg封裝格式,Ogg封裝過(guò)程,libogg

  • capture_pattern字段:值為0x4f、0x67、0x67、0x53,對(duì)應(yīng)字符OggS,表示頁(yè)起始標(biāo)志;
  • stream_structure_version字段:值為0x00,表示版本號(hào);
  • header_type_flag字段:值為0x00,表示不是邏輯比特流(bos)的第一頁(yè),也不是最后一頁(yè),也不包含從上一頁(yè)繼續(xù)的數(shù)據(jù)包;
  • granule_position字段:值為0x00、0x77、0x01、0x0、0x0、0x0、0x0、0x0,媒體編碼相關(guān)的參數(shù)信息,小端表示到本頁(yè)的邏輯流有96000幀(小端0x017700=96000);
  • bitstream_serial_number字段:0x23、0x49、0x02、0x11,邏輯比特流唯一序列號(hào);
  • page_sequence_number字段:0x03、0x00、0x00、0x00,頁(yè)面序列號(hào);
  • CRC_checksum字段:0x25、0x80、0xd7、0x7d,32位CRC校驗(yàn);
  • number_page_segments字段:0x32,表示后面段(segment)的個(gè)數(shù),本頁(yè)有50(0x32=51)個(gè)段(segment);
  • segment_table:前面指明了50個(gè)段,所以segment_table大小為50個(gè)字節(jié),值分別為圖中藍(lán)色背景部分,每個(gè)字節(jié)表示各個(gè)段的大小。這50個(gè)字節(jié)的值相加就是后面50個(gè)段總字節(jié)數(shù),這里不計(jì)算了,感興趣自己算。
  • 之后的若干個(gè)字節(jié)就是50個(gè)段的內(nèi)容。

這里解析了4頁(yè),后面的頁(yè)數(shù)依次類推去分析,這個(gè)文件有118頁(yè),最后一頁(yè)的話,其header_type_flag字段值為0x04。

【音視頻 | Ogg】Ogg封裝格式詳解——包含Ogg封裝過(guò)程、數(shù)據(jù)包(packet)、頁(yè)(page)、段(segment)等,音視頻基礎(chǔ),音視頻,Ogg,Ogg封裝格式,Ogg封裝過(guò)程,libogg

??五、讀取Ogg文件的C語(yǔ)言代碼

// readOggFile.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 8字節(jié)數(shù)組轉(zhuǎn)成 unsigned long long
unsigned long long ToULL(unsigned char num[8], int len)
{
	unsigned long long ret = 0;
	if(len==8)
	{	
		int i=0;
		for(i=0; i<len; i++)
		{
			ret |= ((unsigned long long)num[i] << (i*8));
		}
	}
	return ret;
}

// 4字節(jié)數(shù)組轉(zhuǎn)成 unsigned int
unsigned int ToUInt(unsigned char num[4], int len)
{
	unsigned int ret = 0;
	if(len==4)
	{
		int i=0;
		for(i=0; i<len; i++)
		{
			ret |= ((unsigned int)num[i] << (i*8));
		}
	}
	return ret;
}

int readOggPage(char *oggFile)
{
	typedef struct PAGE_HEADER{  
		char           Oggs[4];        
		unsigned char  ver;
		unsigned char  header_type_flag;
		unsigned char  granule_position[8];
		unsigned char  stream_serial_num[4];
		unsigned char  page_sequence_number[4];
		unsigned char  CRC_checksum[4];
		unsigned char  seg_num;
		unsigned char  segment_table[];
	}PAGE_HEADER;
	
	FILE *fp=fopen(oggFile,"rb");
	
	while(!feof(fp))
	{
		// 1、讀取 page_header
		PAGE_HEADER page_header;
		if(1 != fread(&page_header,sizeof(page_header),1,fp))
			break;
		printf("page_num:%03u; ",ToUInt(page_header.page_sequence_number, 4));
		printf("Oggs:%c %c %c %c; ",page_header.Oggs[0],page_header.Oggs[1],page_header.Oggs[2],page_header.Oggs[3]);
		printf("type=%d, granule_position:%08llu; ", page_header.header_type_flag,ToULL(page_header.granule_position, 8));
		//printf("seg_num:%d \n",page_header.seg_num);
		
		// 2、讀取 Segment_table
		unsigned char *pSegment_table = (unsigned char *)malloc(page_header.seg_num);
		fread(pSegment_table,sizeof(unsigned char),page_header.seg_num,fp);
		
		// 3、計(jì)算段數(shù)據(jù)總大小
		unsigned int TotalSegSize = 0;
		int i=0;
		for(i=0; i<page_header.seg_num; i++)
		{
			TotalSegSize += pSegment_table[i];
		}
		printf("TotalSegSize:%d \n",TotalSegSize);
		
		// 4、讀取段數(shù)據(jù)
		unsigned char *pSegment_data = (unsigned char *)malloc(TotalSegSize);
		fread(pSegment_data,sizeof(unsigned char),TotalSegSize,fp);
		
		if(page_header.header_type_flag == 4)
			printf("Last 4 Byte: %x %x %x %x\n",pSegment_data[TotalSegSize-4],pSegment_data[TotalSegSize-3], pSegment_data[TotalSegSize-2],pSegment_data[TotalSegSize-1]);
		
		free(pSegment_data);
		free(pSegment_table);
	}
	fclose(fp);
	return 0;
}

int main()
{
	readOggPage("48000Hz-s16le-1ch-ChengDu.opus");
	return 0;
}

【音視頻 | Ogg】Ogg封裝格式詳解——包含Ogg封裝過(guò)程、數(shù)據(jù)包(packet)、頁(yè)(page)、段(segment)等,音視頻基礎(chǔ),音視頻,Ogg,Ogg封裝格式,Ogg封裝過(guò)程,libogg

??六、總結(jié)

本文介紹了Ogg支持的編碼格式,Ogg的封裝過(guò)程,Ogg文件結(jié)構(gòu),以及Ogg的相關(guān)術(shù)語(yǔ)(物理比特流、邏輯比特流、數(shù)據(jù)包(packet)、頁(yè)(page)、段(segment) )等內(nèi)容。

最后,似乎有點(diǎn)問(wèn)題,文章只講了Ogg文件結(jié)構(gòu)和頁(yè)頭部數(shù)據(jù),并沒有解析各個(gè)段的內(nèi)容。因?yàn)槎蔚膬?nèi)容是根據(jù)編碼不同而變化的,需要再了解跟編碼相關(guān)的文檔如:opus音頻編解碼器的Ogg封裝。這些內(nèi)容后面單獨(dú)去分析。

這兩天發(fā)現(xiàn)了查看RFC文檔的一個(gè)網(wǎng)址:https://datatracker.ietf.org/,只需要搜索想看的RFC文檔,基本都可以搜到。
https://datatracker.ietf.org/doc/rfc7845/,顯示格式是標(biāo)題欄在上面;
https://datatracker.ietf.org/doc/html/rfc7845/,顯示格式是標(biāo)題欄在側(cè)邊,個(gè)人比較喜歡這個(gè)風(fēng)格。

【音視頻 | Ogg】Ogg封裝格式詳解——包含Ogg封裝過(guò)程、數(shù)據(jù)包(packet)、頁(yè)(page)、段(segment)等,音視頻基礎(chǔ),音視頻,Ogg,Ogg封裝格式,Ogg封裝過(guò)程,libogg
如果文章有幫助的話,點(diǎn)贊??、收藏?,支持一波,謝謝 ??????

參考文檔:
rfc3533:https://datatracker.ietf.org/doc/html/rfc3533
Opus從入門到精通(五)OggOpus封裝器全解析:https://juejin.cn/post/6844904016254599175
https://www.cnblogs.com/dylancao/p/8303418.html
https://blog.csdn.net/zyx4843/article/details/51439279文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-740874.html

到了這里,關(guān)于【音視頻 | Ogg】Ogg封裝格式詳解——包含Ogg封裝過(guò)程、數(shù)據(jù)包(packet)、頁(yè)(page)、段(segment)等的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 音視頻——封裝格式原理

    音視頻——封裝格式原理

    視頻解碼基礎(chǔ) 一、封裝格式 ? 我們播放的視頻文件一般都是用一種 封裝格式 封裝起來(lái)的,封裝格式的作用是什么呢?一般視頻文件里不光有視頻,還有音頻,封裝格式的作用就是把視頻和音頻打包起來(lái)。 所以我們先要 解封裝格式 ,看有哪些視頻流和哪些音頻流,此時(shí)的

    2024年02月15日
    瀏覽(32)
  • 【音視頻開發(fā)】FFmpeg轉(zhuǎn)換與封裝 I - MP4格式

    【音視頻開發(fā)】FFmpeg轉(zhuǎn)換與封裝 I - MP4格式

    1 FFmpeg轉(zhuǎn)換與封裝 1.1 MP4格式轉(zhuǎn)換 1.1.1 MP4格式標(biāo)準(zhǔn) ????????FFmpeg支持的媒體封裝格式具有多樣性與全面性,與此, 我們還可以使用FFmpeg來(lái)對(duì)媒體格式進(jìn)行轉(zhuǎn)換與封裝 。 在互聯(lián)網(wǎng)常見的格式中,跨平臺(tái)最好的應(yīng)該是 MP4 文件,因?yàn)?MP4 文件既可以在PC 平臺(tái)的Flashplayer中播放,

    2024年02月08日
    瀏覽(35)
  • 【FFmpeg】ffmpeg 命令行參數(shù) ⑤ ( 使用 ffmpeg 命令提取 音視頻 數(shù)據(jù) | 保留封裝格式 | 保留編碼格式 | 重新編碼 )

    【FFmpeg】ffmpeg 命令行參數(shù) ⑤ ( 使用 ffmpeg 命令提取 音視頻 數(shù)據(jù) | 保留封裝格式 | 保留編碼格式 | 重新編碼 )

    使用 ffmpeg 命令 從 視頻數(shù)據(jù) 中 提取 音頻數(shù)據(jù) / 視頻數(shù)據(jù) 保留封裝格式 , 封裝格式 指的就是 封裝 視頻數(shù)據(jù) 的 容器 ; 一個(gè) mp4 格式的視頻 , 其 封裝容器 就是 mp4 容器 , 其中 封裝了 h.264 格式的視頻數(shù)據(jù) 和 aac 格式的 音頻數(shù)據(jù) ; 執(zhí)行 命令 , 從 input.mp4 輸入文件中 , 提取 音頻

    2024年03月23日
    瀏覽(65)
  • FFmpeg入門詳解之19:音視頻封裝原理簡(jiǎn)介

    什么是數(shù)據(jù)封裝和解封裝? 數(shù)據(jù)封裝(baiData Encapsulation) ,籠統(tǒng)地講,就是把業(yè)務(wù)數(shù)據(jù)映射到du某個(gè)封裝協(xié)議zhi的凈dao荷中,然后填充對(duì)應(yīng)協(xié)議的包頭,形成封裝協(xié)議的數(shù)據(jù)包,并完成速率適配。 解封裝 ,就是封裝的逆過(guò)程,拆解協(xié)議包,處理包頭中的信息,取出凈荷中的業(yè)

    2023年04月09日
    瀏覽(32)
  • 【音視頻|PCM】PCM格式詳解

    【音視頻|PCM】PCM格式詳解

    ??博客主頁(yè)??:??https://blog.csdn.net/wkd_007?? ??博客內(nèi)容??:??嵌入式開發(fā)、Linux、C語(yǔ)言、C++、數(shù)據(jù)結(jié)構(gòu)、音視頻?? ??本文內(nèi)容??:??介紹數(shù)字音頻的PCM格式?? ??金句分享??:??子曰:君子不器。 ——《論語(yǔ)·為政篇》。意思是,君子不應(yīng)像器具那樣,只有一種用

    2024年02月08日
    瀏覽(19)
  • 【FFmpeg】ffmpeg 命令行參數(shù) ⑧ ( 使用 ffmpeg 轉(zhuǎn)換封裝格式 | 音視頻編解碼器參數(shù)設(shè)置 | 視頻 幀率 / 碼率 / 分辨率 設(shè)置 | 音頻 碼率 / 采樣率 設(shè)置 )

    【FFmpeg】ffmpeg 命令行參數(shù) ⑧ ( 使用 ffmpeg 轉(zhuǎn)換封裝格式 | 音視頻編解碼器參數(shù)設(shè)置 | 視頻 幀率 / 碼率 / 分辨率 設(shè)置 | 音頻 碼率 / 采樣率 設(shè)置 )

    音視頻 文件 從 采樣 - 處理 - 得到原始數(shù)據(jù)幀隊(duì)列 - 音視頻編碼 - 音視頻包隊(duì)列 - 格式封裝 的過(guò)程如下 : 封裝格式 參考 【音視頻原理】音視頻 “ 采樣 - 編碼 - 封裝 過(guò)程 “ 和 “ 解封裝 - 解碼 - 播放 過(guò)程 “ 分析 ( 視頻采集處理流程 | 音頻采集處理流程 | 音視頻文件解封裝

    2024年04月17日
    瀏覽(101)
  • 【音視頻 | Ogg】libogg庫(kù)詳細(xì)介紹以及使用——附帶libogg庫(kù)解析.opus文件的C源碼

    【音視頻 | Ogg】libogg庫(kù)詳細(xì)介紹以及使用——附帶libogg庫(kù)解析.opus文件的C源碼

    ??博客主頁(yè)??:??https://blog.csdn.net/wkd_007?? ??博客內(nèi)容??:??嵌入式開發(fā)、Linux、C語(yǔ)言、C++、數(shù)據(jù)結(jié)構(gòu)、音視頻?? ??本文內(nèi)容??:??介紹libogg庫(kù),并給出ligogg庫(kù)使用的例子?? ??金句分享??:??子曰:不患人之不己知,患不知人也。——《論語(yǔ)·學(xué)而篇》。意思是,

    2024年02月05日
    瀏覽(23)
  • 音視頻 ffmpeg命令轉(zhuǎn)封裝

    保持編碼格式: 改變編碼格式: 修改幀率: 修改視頻碼率: 修改視頻碼率: 修改音頻碼率: 修改音視頻碼率: 修改視頻分辨率: 修改音頻采樣率: 推薦一個(gè)零聲學(xué)院項(xiàng)目課,個(gè)人覺得老師講得不錯(cuò),分享給大家: 零聲白金學(xué)習(xí)卡(含基礎(chǔ)架構(gòu)/高性能存儲(chǔ)/golang云原生/音

    2024年02月10日
    瀏覽(32)
  • Qt之基于QMediaPlayer的音視頻播放器(支持常見音視頻格式)

    Qt之基于QMediaPlayer的音視頻播放器(支持常見音視頻格式)

    Qt自帶了一個(gè)Media Player的例子,如下圖所示: 但是運(yùn)行這個(gè)例子機(jī)會(huì)發(fā)現(xiàn),連最基本的MP4格式視頻都播放不了。因?yàn)镼MediaPlayer是個(gè)殼(也可以叫框架),依賴本地解碼器,視頻這塊默認(rèn)基本上就播放個(gè)MP4,甚至連MP4都不能播放,如果要支持其他格式需要下載k-lite或者LAVFilter

    2024年02月02日
    瀏覽(31)
  • 音視頻——視頻流H264編碼格式

    音視頻——視頻流H264編碼格式

    我們了解了什么是宏快,宏快作為壓縮視頻的最小的一部分,需要被組織,然后在網(wǎng)絡(luò)之間做相互傳輸。 H264更深層次 —》宏塊 太淺了 ? 如果單純的用 宏快 來(lái)發(fā)送數(shù)據(jù)是 雜亂無(wú)章 的,就好像在沒有 集裝箱 出現(xiàn)之前,貨物總是隨意被堆放到船上。 上貨(編碼),下貨是非

    2024年02月15日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包