OGG是一个自由且开放标准的多媒体容器文件格式,由Xiph Org基金会所维护。OGG格式并不受到软体专利的限制,并设计用於有效率地串流媒体和处理高品质的数位多媒体。一般说到OGG,都是指的Ogg Vorbis,只包含音频压缩格式Vorbis的压缩文件格式。其实,OGG不仅仅只能包含Vorbis格式,它可以包含视频格式。因此,为了区分只包含音频格式的文件格式,产生了一种新的文件格式OGV,这种格式既包含音频格式,也包含视频格式。但是OGV文件格式的压缩方法和OGG是一样的,可以采用同一种方式进行解析。

为了说明简单,下面统称OGG。

1、OGG/OGV文件结构

首先介绍一下几个相关的概念:
(1)Packet:Packet一个解码单元,或者是一帧数据。
(2)Segment:Segment是由Packet分割而成,一个Segment最多只包含255格式bytes。Segment没有Header。
(3)Page:Page是OGG/OGV文件格式的基本组成单元,是对Segment的封装。给一个或者几个连续的Segments添加一个Page Header就构成了一个Page。

下面看一下OGG/OGV的文件格式,如下图所示:

OGG/OGV文件就是由一个个的Page组成的。在解析的时候,通过Page的Header标记(“OggS”)将Page解析出来。下面看一些Page的Header结构,如下图所示。

(1)需要详细说明一下Header Type这个field。这个变量用来标识一个Page的类型。可以设置3种数值。

0x01:设置,说明该page和前面的一个page属于同一个packet;如果不设置,说明该page属于一个新的packet。

0x02:设置,说明该page是该stream的第一个page,如果不设置,说明不是。

0x04:设置,说明该page是该stream的最后一个page,如果不设置,说明不是。

(2)一个Page Header占用的字节数是不固定的,主要是因为Segment Table的长度不固定。因此,Page Header占用的字节数为:27 + Seg Numbers。

(3)Granule Position的值如果为-1,说明,该page不是当前packet的最后一个page。

OGG/OGV的封装格式比较简单。不过到这里,会有一个疑问,解码的时候是以packet为单位的,那么解析出pages之后,该如何获得packets呢?了解了OGG/OGV文件格式的封装过程之后,这个问题就比较简单了。

2、OGG/OGV文件封装过程

OGG/OGV文件格式的封装主要分为四个过程:

第一、从编码器获得Packets;

第二:将Packets分割成Segments;

第三:将Segments打包成Pages;

第四:将不同stream的pages组合在一起从而获得OGG/OGV文件。对于只含有一个stream的文件,这个过程可以没有。

封装过程如下图所示。

Packets分割成Segments之后,由于Segment的最大长度只能为255,而且一个Segment不能包含两个Packet中的数据,因此,如果某个Segment的长度小于255,这个Segment就是Packet的最后一个Segment。有一种特殊的情况,那就是Segment的长度为0。如果一个Packet的长度正好是255的整数倍,那么就会用一个长度为0的Segment作为与下一个Packet的分界。以图中的seg_5为例,它是packet_1和packet_2的分界,它的长度必须小于255,包括0。

图中只是给出了一个比较简单的情况。在真正深入到OGG/OGV文件中去之后才发现,Packets和Pages的关系还是比较复杂的。图中的情况是一个Packet包含在一个或者多个Pages中,而一个Page只涉及到一个Packet的数据。实际的情况是,一个Page可能涉及到多个Packets的数据,而且还有可能不是整个Packet的数据。举个例子,还是上图中的Packets和Segments,只是Pages重新打包。例如:

page_1:packet_1的seg_1、seg_2、seg_3、seg_4

page_2:packet_1的seg_5和packet_2的seg_1

page_3:packet_2的seg_2、seg_3和packet_3的seg_1、seg_2

因此,在解析OGG/OGV文件的时候,就需要做相应的处理。

3、OGG/OGV文件Header信息

OGG/OGV文件是由Pages组成的,因此,与文件、stream有关的信息,也是保存在Pages中的,这些Pages一般放在文件的开始位置。那么,如何判断Pages中放的Header信息呢?这个其实比较简单,可以通过Page的Header之后的几个字节来判断。这几个字节不仅可以判断Page中的数据是否为Header信息,还可以判断Header信息的类型。这几个字节是以ASCII的形式存在的,比如:“\001virbis、“\200theora”、“fishead”等等。OGG/OGV文件包含的Header的信息类型比较多,关于各个Header的类型、结构、解析方法等,可以去参考一下ffmpeg。

对于只包含vorbis音频格式的OGG文件,包含的Header一般比较少。而在OGV文件中,就比较多了。

OGG/OGV文件格式解析相关推荐

  1. Android init.rc文件格式解析

    /****************************************************************************** Android init.rc文件格式解 ...

  2. 【Android 逆向】Android 逆向方法 ( 静态逆向解析 | 函数调用分析 | 动态运行跟踪 | 运行日志分析 | 文件格式解析 | 敏感信息分析 | 网络信息监控 | 环境伪装模拟 )

    文章目录 一.Android 逆向方法 1.静态逆向解析 2.函数调用分析 3.动态运行跟踪 4.运行日志分析 5.文件格式解析 6.敏感信息分析 7.网络信息监控 8.软件动态调试 9.环境伪装模拟 ...

  3. gcc 删除elf_ELF文件格式解析器 原理 + 代码

    本文为看雪论坛精华文章 看雪论坛作者ID:菜鸟m号 附件链接:[原创] ELF文件格式解析器 原理 + 代码 写在前面: 读<Linux二进制>,发现作者对 ELF文件格式部分并没有做详细 ...

  4. cfile清空文件内容_编译-链接-加载 :ELF文件格式解析

    摘要:对于C++的初学者,经常在程序的编译或者加载过程中遇到很多错误,类似undefined reference to ... 和 GLIBCXX_3.4.20 not found 等.这些错误都涉及 ...

  5. mp4文件格式解析(一)

    原文地址:mp4文件格式解析(一)作者:可下人间 目前MP4的概念被炒得很火,也很乱.最开始MP4指的是音频(MP3的升级版),即MPEG-2 AAC标准.随后MP4概念被转移到视频上,对应的是MPE ...

  6. QuickTime文件格式解析

    QuickTime文件格式解析 Peter Lee 2008-06-14 一.简介 QuickTime是Apple公司开发的一套完整的多媒体平台架构,可以用来进行多种媒体的创建,生产,和分发,并为这一 ...

  7. elf section类型_ELF文件格式解析

    ELF文件格式解析 ELF(Executable and Linking Format) 1) 可重定位的对象文件(Relocatable file) 2) 可执行的对象文件(Executable f ...

  8. .lnk文件格式解析

    .lnk文件格式解析 由于.lnk文件提供丰富的调用方式,因此在研究该文件类型格式的基础的可以发现有很多字段可以被恶意利用.下面是一个.lnk文件格式的通用结构,也就 说.lnk文件是由这样不同的节组 ...

  9. fastq与fasta文件格式解析

    fastq与fasta文件格式解析 一.fasta格式 二.fastq格式 2.1 格式说明 2.2 碱基质量计算 2.3 Quality Score简化 三.二代测序的fastq文件格式介绍 四.补 ...

最新文章

  1. Java 异常处理中对于 finally 的一些思考
  2. Python中制作词云的WordCloud参数详解
  3. 单例设计模式-容器单例
  4. oracle修改asm参数文件,学习笔记:Oracle RAC参数文件管理 修改创建asm中的spfile文件...
  5. 让 .Net 更方便的导入导出Excel
  6. (12)python 的列表我从没想过会那么好用
  7. 爬虫的单线程+多任务异步协程:asyncio 3.6
  8. SQL数据旋转的问题
  9. 关于Python常见功能使用的博客收藏
  10. KMP模式匹配算法程序(Python,C++,C)
  11. 全网AI和机器学习资源大合集(研究机构、视频、博客、书籍...)
  12. Java不适合于作为主要编程教学语言 -- 孟岩
  13. eplan好看的电缆图表_EPLAN电缆图表模板
  14. 微信小程序最新富文本编辑器使用功能实例教程
  15. 苹果ios8_一款苹果手机上目前体验还不错的免费小说软件,支持一键缓存
  16. win10 uwp 自定义控件初始化
  17. 『每周译Go』并发安全的集中式指针管理设施
  18. python自学爬虫要多久_自学python爬虫需要多久
  19. QA——性能优化(一)
  20. MySQL——IN的用法详解

热门文章

  1. 159.Vue实现个人博客(七)【Vue2.0-路由参数】 2019.03.15
  2. 快速免费对接快递鸟圆通快递单号查询api接口
  3. 做好自媒体需要具备的几个心态?!
  4. 数字孪生城市,智慧城市可视化技术解决方案案例
  5. 计算机组老师颁奖词,优秀教研团队颁奖词
  6. 计算机对外访问端口受限,打开445端口提示拒绝访问(445端口访问受限原因和解决法)...
  7. 新仙女木事件和农耕文明_后农业文明的排列
  8. Think Python 2e 中文版
  9. 互联网晚报 | 9月15日 星期三 | iPhone 13正式发布;天猫双11正式启动商家报名;华为推出鸿蒙矿山操作系统“矿鸿”...
  10. cordova ios升级插件