??博客主頁(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
是一個(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
意指一種文件格式,可以納入各式各樣自由和開放源代碼的編解碼器,包含音效、視頻、文字(像字幕)與元數(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 基礎(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é)束。
?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封裝過(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 文件結(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ù)組成。
頁(yè)面頭部(page header)中的9個(gè)字段具有以下含義:
-
1、capture_pattern:表示頁(yè)面開始的4字節(jié)字段。它包含4個(gè)字符:
O
、g
、g
、S
。它可以幫助解碼器找到頁(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è)
- bit 0x01
-
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ù):
- 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ù):
- 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
:
- 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
:
- 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文件的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;
}
??六、總結(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)格。
如果文章有幫助的話,點(diǎn)贊??、收藏?,支持一波,謝謝 ??????文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-740874.html
參考文檔:
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)!