ogg格式解析

        最近的任务是做ogg的demux,一直在研究ogg格式,积累了一些资料和知识,在这里做一记录。

ogg是一种多媒体容器,可以包含很多种音视频格式,他是xiph提供的免费开源的音视频格式,官网可以看看http://www.xiph.org/

        大家可能所见的.ogg的文件大都ogg的vorbis音频格式,是一种效果和MP3相媲美的音频,我最初接触ogg的时候,以为是纯音频,看过官网的介绍发现他是一个很强大的容器结构,xiph提供的免费的视频Theora和音频vorbis都是开源免费的,都包含在ogg的容器中,此外ogg也能包含很多其他音视频,如:flac,MP3等,大家可以看看我官网链接,便豁然开朗。

<一>ogg的标准容器格式

       ogg是以页(page)为单位将逻辑流组织链接起来,每个页都有pageheader和pagedata。页头中有如下的定义:

       1>页标识:ASCII字符,0x4f  'O'   0x67  'g'   0x67  'g'  0x53 'S',4个字节大小,它标识着一个页的开始。

       2>版本id:一般当前版本默认为0,1个字节

       3> 类型标识:标识当前的页的类型,1个字节

              0x01:本页媒体编码数据与前一页属于同一个逻辑流的同一个packet,若此位没有设,表示本页是以一个新的packet开始的;

              0x02:表示该页为逻辑流的第一页,bos标识,如果此位未设置,那表示不是第一页;

              0x04:表示该页位逻辑流的最后一页,eos标识,如果此位未设置,那表示本页不是最后一页。

      4>granule_position:媒体编码相关的参数信息,8个字节,对于音频流来说,它存储着到本页为止逻辑流在PCM输出中采样码的数目,可以由它来算得时间戳。对于视频流来说,它存储着到本页为止视频帧编码的数目。若此值为-1,那表示截止到本页,逻辑流的packet未结束。(小端)

      5> serial_number:当前页中的流的id,4个字节,它是区分本页所属逻辑流与其他逻辑流的序号,我们可以通过这个值来划分流。(小端)

      6>page_seguence_number:本页在逻辑流的序号,4个字节

      7>CRC_cbecksum:循环冗余效验码效验,4个字节,用来效验每页的有效性。

      8>number_page_segments:给定本页在segment_table域中出现的segement个数,1个字节

      9>segment_table:从字面看它就是一个表,表示着每个segment的长度,取值范围是0~255

          由segment可以得到packet的值,每个packet的大小是以最后一个不等于255的segment结束的,从页头中的segment_table可以得到每个packet长度,举例:如果一组segment依次顺序为FF 45 FF FFFF 40 FF 5 FF FF FF 66,那么第一个packet的长度为255+69 = 324,第二个packet大小829,同理。

        页头基本上就是由上述的参数组成,由此我们可以得到页头的长度和整个页的长度:

       header_size  = 27+number_page_segments ;(byet)

       page_size = header_size +segment_table中每个segment的大小;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值