OGG格式总结

来源:互联网 发布:淘宝怎么申请原图保护 编辑:程序博客网 时间:2024/06/01 10:38

收集了部分资料,加上个人的一些理解,总结出一篇关于OGG格式的文档,仅用于个人学习。如果不当,请指出。

2 What is OGG

       Ogg是一种container,或者说是一种封装格式,这种封装格式可以提供一些error检错,seek等功能,其实就相当于一种类似TCP传输的同步功能。Ogg本身并不限制audiovideo的编码格式。目前对Audio而言,应用比较广泛的是Vorbis编码格式,例如.ogg文件就是只带vorbis音频的文件。

       我的理解:以vorbis为例,编解码大致按如下过程:

       编码过程:将audio codec输出的packets换分成一个个segments,然后将这些segments放到一个个page中去,多个page就构成了OGG的逻辑流。类似,多个逻辑流就组成了OGG的物理比特流。

       解码过程:接收到OGG比特流以后,要先分割一个个page,然后从page中提取segments,然后将这些segments组合成packet,最后再送到audio decode去解。

2.1 OGG比特流的组织结构

       Ogg逻辑流以页(page)为单位组织链接成物理流,如图所示:

 

1  Ogg 文件的组织形式

    1中的文件链接了两个物理流,ABC三个逻辑流组成一个物理流,逻辑流D单独是一个物理流。一个物理流中的所有逻辑流的bos_page都必须在物理位置上相邻,如图3所示*A**B**C*三个bos_page的位置。

    bosbeginning of stream;    eosend of stream

    映射到Ogg格式的媒体(vorbis音频,Theora视频)有相关详细定义,这些定义使得这些媒体之间有更具体的约束关系。Ogg本身并没详细说明多个并发媒体流之间的时间关系,这需要并发媒体流在映射到Ogg格式的时刻来指定,通常他们之间的交错关系是按他们产生的时间先后顺序来排列。

2.2 Ogg page 页结构

每个页之间相互独立,都包含了各自应有的信息,页的大小是可变的,通常为4K8KB,最大值不能超过65307bytes27255255*255=65307)。

每个pagepage header以及page payload组成;页头部格式如图2


2 Ogg页头部结构

capture_pattern:模式捕获域,4个字节,表示页的开始,其作用是分离Ogg封装格式还原媒体编码时识别新页的作用,它包含了四个幻数(ASCII字符集):

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

stream_structure_version:1个字节表示当前Ogg文件格式的版本,目前为0

header_type_flag:头部类型标识1个字节。标识当前页具体类型。其设置分三种情况:

       怎么来区别当前这个page属于哪个逻辑流?

    *  bit 0x01  若已设置,页包含的媒体编码数据于前一页同属于一个逻辑流的同一packet。若未设置,本页是一个新的packet

    *  bit 0x02   设置,表示逻辑流的第一个页bos。未设,不是第一个页。

    *  bit 0x04   设置,表示逻辑流的最后一页eos。未设,不是最后一页。

granule_position:8个字节(字节6-字节13),包含了媒体编码相关参数信息。对于音频流,包含了到本页为止逻辑流在PCM中采样编码的总次数。对于视频流,包含了逻辑流到本页为止视频帧编码的总次数。其值若为-1,则说明到此页为止,逻辑流的packet还未结束。

bitstream_serial_number:流序列号,4字节,表示本页所属逻辑流与其他逻辑流相区别的序号。回答(3)的问题,用来区别本页属于哪个逻辑流

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

segment_table:逻辑流中的每个packet每个segment长度的取值(lacing values,除了每个packet的最后一个segment小于255外,其它segment都为255),这些值以segment出现的先后顺序依次排列。此域的字节数为number_page_segments域所表示的数字(即在0255之间)。由于都是用1 bytes表示,所以有多少个segmentsegment_table就占用多少个字节。lacing value是表示最后一个segment,最后可能不足255bytes

byte     value

 27       0xff (255)

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

      n-1      0xff (255)

n        0x00-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长度之和净载荷长度

2.3  Ogg封装处理过程

    (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的设置规定来表示。

如果packet本身小于4k,也是占用一个page,其实浪费了page内部的很多剩余空间。

是否有优化的可能性:)

(4)多个已被页格式封装好的逻辑流(如语音、文本、图片、音频、视频等)按应用要求的时序关系合成物理流。

audio codecàpacketsà分割packetssegments,填入到oggpage单位中。

2.4  Ogg文件的映射与逆映射

Ogg文件格式封装好压缩编码媒体流可用于存储(磁盘文件)或直接传输(TCP或管道),这是因为Ogg比特流格式提供了封装/同步、差错同步捕获、寻找标记以及其它足够的信息使得这种分散开的数据能够完全地还原为封装之前的具有包边界“packet”形式的压缩编码媒体流,恢复到这种原来媒体流就具有的包边界形式不需要依赖于针对压缩编码的解码器。也就是说Ogg映射与逆映射和媒体流的压缩编码、解码具有相对独立性。


3  Ogg封装流程示意图

    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

2.5 OGG常用术语

       Block:对应一个Page

       Segments:Page内部的unit,一个Segments最大为255字节,每个Page最多包含255segment

       Page:组成OGG比特流的基本单元;

       OGG逻辑流:由一路audio或者video packets组成的pages

       OGG比特流:由多个逻辑流组成。

2.6 OGG API的使用

       关于解码部分,待补充。

2.7 参考资料

       1 http://www.xuezi123.com/lunwen/jisuanji/169.htm

       2 官网http://www.xiph.org/ogg/doc/

0 0
原创粉丝点击