OGG流媒体文件格式分析

2023-11-05

摘自:http://www.studa.net/yingyong/080505/16283240.html

摘  要   流媒体文件格式在流媒体系统中占有重要地位,设计合理的文件格式是提高流媒体服务器工作效率最直接和最有效的办法。该文在剖析常用流媒体系统和文件格式的基础上,特别地对美国xiph.org基金会的开源流媒体工程Ogg文件格式子项目做了深入的分析,指出Ogg格式对媒体编码数据的存储读取和传输具有简洁性,Ogg格式的映射与逆映射与媒体编码数据具有相对独立性,能够有效提高流媒体服务器的工作效率。

     关键词     流媒体;OGG文件格式;流服务器效率
1 引言
     流媒体是指在Internet/Intranet中使用流式传输技术的连续时基媒体,如音频、视频等多媒体文件。文件格式和传输协议是流媒体应用的主要技术。从不同的角度看,流媒体数据有三种格式:压缩格式、文件格式、发布格式。其中压缩格式描述了流媒体文件中媒体数据的编码、解码方式;流媒体文件格式是指服务器端待传输的流媒体组织形式,文件格式为数据交换提供了标准化的方式;流媒体发布格式是一种呈现给客户端的媒体安排方式。本文所讨论的格式是指第二种:流媒体文件格式。特别地分析了一种开源流媒体文件格式:Ogg。它是美国xiph.org基金会开发的开源流媒体工程的一个子项目,它是应其开源音/视频媒体压缩编码格式Vorbis/Theora等的存储与传输需要而设计的。
    本文在研究和分析已有流媒体系统的基础上,结合在研发新的流媒体系统中的经验和教训,对流媒体文件格式做系统和深入的剖析,旨在深入理解流媒体系统和找到提高流媒体系统工作效率的方法。

2 流媒体文件格式分析

2.1 文件格式在流媒体系统中的重要性

     一个简化的流媒体系统由流媒体服务器、客户端和传输 网络组成,流媒体系统的核心是流媒体服务器。随着流媒体技术研究的深入和流媒体应用的扩展,如何提高流媒体系统的工作效率,主要指标体现为如何提高服务器并发媒体流的数量,这是一个被广泛关注的课题。它取决于服务器处理每个流的效率,决定了一个服务器能够同时为多少客户服务,其成果不但具有理论价值,更具有极大的 经济价值。 
    图1的圆圈内标出了影响流媒体系统性能的一些主要因素。如果对其中每个因素仔细分析判断,可以发现对于一个现有的流媒体服务器而言,能有效提高其效率的手段并不多。例如:提升客户端、服务器端的硬件配置,只能获得性能提高,工作效率没有得到提高;实时传输、控制协议是人们经过多年的大量应用实践 总结,由IETF因特网工程任务组确认的媒体流传输共同标准,是必须遵守的标准,是无法轻易改变的;节目源的质量、压缩方式等因素对于服务器而言是不可预知或者是不可控制的。那么在这些客观因素无法改变的情况下,优化流媒体文件格式为提高流媒体服务器的工作效率提供了可能。
    流媒体文件格式能够对服务器的工作效率产生影响是由流服务器工作方式的特点决定的。流服务器的主要工作任务是通过直播或点播的方式向用户提供流媒体内容,它输入磁盘上存储的流媒体文件,然后进行实时传输协议封装后再通过 IP网络输出给客户端。简言之,其工作流程为3 步:读取、封装、发送。由于每发送一个媒体流都需要启动一个流程,并且所有流程都需要实时进行,可见当一个流服务器并发几千个流时,每个流程工作效率的细小区别都会对服务器工作效率造成很大的影响。

 图1  简化的流媒体系统结构及其影响因素
    每个工作流程的输入是流媒体文件,输出是媒体数据包。输入、输出数据的内容是没有改变的,都是多媒体压缩码流,两者之间只有格式的不同,所以从数据流角度来看,服务器的主要工作其实是一个格式转换的过程。由于媒体数据包的格式是由传输协议事先确定的,那么流媒体文件格式是否能够方便服务器读取、封装就决定了服务器的工作量。

2.2  流媒体文件格式的分析与比较

    流媒体文件在流媒体系统中具有重要地位, 文献[2]分析了具有代表性的QuickTime电影文件(mov)和 Microsoft Media Server的电影文件(asf),对其文件格式和相关环节做了深入剖析。发现这些文件格式对服务器工作效率存在如下负面影响:
    (1)磁盘控制器访问吞吐量低。每次封装一个媒体数据包需要读取一帧数据,一般每帧大小为1K左右,每秒需要25帧,这造成对磁盘频繁访问,吞吐量低。
    (2)对于QuickTime Mov文件格式,媒体数据没有经过预处理,服务器每发一个包都需要从hint轨中获得打包时需要的相关参数,实时读取媒体数据、封装、发送,对CPU占用率很大。
    (3)对于Microsoft Asf文件格式,媒体数据在Packet中时已经是mms包的半成品,服务器节省了截取媒体流的时间,但仍然需要服务器选择媒体流来组织mms包。并且,Packet中的数据不全是需要发送的数据,浪费了内存空间和磁盘IO时间。  
    文献[3]提出了一种新的流媒体文件格式NMF,该格式具有如下基本结构(如图2所示)和特点:

图2 NMF文件结构
    NMF流媒体文件由头文件和体文件构成。头文件主要包含文件描述、媒体描述、流描述等必要的信息;体文件包含全部的媒体数据。一个NMF由一个头文件和若干个体文件构成,同一媒体源不同的流(不同的传输协议或不同的码速率)存放在不同的体文件中,此结构用来实现多码速率切换/智能流技术和兼容现有的流媒体播放器。头文件和体文件的功能划分原则是:当服务器和客户建立连接时(在发送媒体数据之前),只需要从头文件中读数据;当服务器和客户建立连接后,只需要从文件体中读取媒体数据。这样,服务器中各个模块间耦合减少,效率提高。由于头文件和体文件的相对独立,使文件具有很强的可扩展性,并且使得利用硬件进行封装、发送也成为可能。
    NMF的核心思想就是充分利用预处理过程,将原始媒体文件组织成方便服务器处理的格式,减少实时封装和发送时的工作量,同时增加文件结构的兼容性和可扩展性,以提高流服务器的工作效率,增加并发流数量。

3  Ogg 文件格式结构

3.1 文件格式在流媒体系统中的重要性

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

图3   Ogg 文件的组织形式
    图3中的文件链接了两个物理流,A、B和C三个逻辑流组成一个物理流,逻辑流D单独是一个物理流。一个物理流中的所有逻辑流的bos_page都必须在物理位置上相邻,如图3所示*A*、*B*、*C*三个bos_page的位置。
    bos:beginning of stream;    eos:end of stream
    映射到Ogg格式的媒体(如vorbis音频,Theora视频)有相关详细定义,这些定义使得这些媒体之间有更具体的约束关系。Ogg 本身并没详细说明多个并发媒体流之间的时间关系,这需要并发媒体流在映射到Ogg格式的时刻来指定,通常他们之间的交错关系是按他们产生的时间先后顺序来排列。

3.2 Ogg page 页结构

    每个页之间相互独立,都包含了各自应有的信息,页的大小是可变的,通常为4K-8KB,最大值不能超过65307bytes(27+255+255*255=65307)。页头部格式如图4。
    页头部各字段域详细说明参见文献[4]:(小端字节序列格式LSB)。
    ⑴ capture_pattern: 模式捕获域,4个字节,表示页的开始,其作用是分离Ogg封装格式还原媒体编码时识别新页的作用,它包含了四个幻数(ASCII字符集):
0x4f 'O'    0x67 'g'    0x67 'g'     0x53 'S'
   ⑵ stream_structure_version:1个字节,表示当前Ogg文件格式的版本,目前为0。

图4 Ogg页头部结构
    ⑶ header_type_flag:头部类型标识,1个字节。标识当前页具体类型。其设置分三种情况:
    *  bit 0x01  若已设置,页包含的媒体编码数据于前一页同属于一个逻辑流的同一packet。若未设置,本页是一个新的packet。
    *  bit 0x02   设置,表示逻辑流的第一个页bos。未设,不是第一个页。
    *  bit 0x04   设置,表示逻辑流的最后一页eos。未设,不是最后一页。
    ⑷ granule_position:8个字节(字节6-字节13),包含了媒体编码相关参数信息。对于音频流,包含了到本页为止逻辑流在PCM中采样编码的总次数。对于视频流,包含了逻辑流到本页为止视频帧编码的总次数。其值若为-1,则说明到此页为止,逻辑流的packet还未结束。
    ⑸ bitstream_serial_number:流序列号,4字节,表示本页所属逻辑流与其他逻辑流相区别的序号。
    ⑹ 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_table:逻辑流中的每个packet每个segment长度的取值(lacing values,除了每个packet的最后一个segment小于255外,其它segment都为255),这些值以segment出现的先后顺序依次排列。此域的字节数为number_page_segments域所表示的数字(即在0-255之间)。
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长度之和(净载荷长度)。

 3.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的设置规定来表示。
    (4)多个已被页格式封装好的逻辑流(如语音、文本、图片、音频、视频等)按应用要求的时序关系合成物理流。

3.4  Ogg文件的映射与逆映射

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

图5  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。

4 结束语    

    Ogg格式是在吸收其它流媒体文件格式优点的基础上针对具有“packet”包边界形式的媒体流而制定的利于其存储和传输的开源流媒体文件格式,在icecast流服务器的传输中得到了很好的应用;根据icecast官方网站公布其测试结果,在GB主干网的条件下对Oggvorbis音频传输的客户端并发流可达14000个。更为重要的是,作为流媒体技术的核心环节,大多数流媒体文件格式至今仍没有完全公开,且受专利保护。要在流媒体技术和应用飞速 发展的今天占得一席之地,遵从GNU/GPL协定,走开源之路,发展不受知识产权约束的流媒体文件格式是紧追先进流媒体技术的较佳选择。

参考文献

    [1] 李向阳,卞德森,流媒体及其应用技术[J]. 广播与电视技术, 2001,28(9):76-85
    [2]马杰,田金文. 流媒体技术及其文件格式[J], 计算机工程与应用,2003.23 P49-52.
    [3]马杰,田金文. 一种新的流媒体文件格式[J]. 计算机工程与 科学,Vol1 26, No17, 2004.
    [4] Walleij, L.. The application/ogg Media Type, RFC 3534, May 2003.
    [5] Pfeiffer, S.. The Ogg Encapsulation Format Version 0. RFC 3533, May 2003.
    [6] http://www.xiph.org/downloads/libogg
    [7] http://www.icecast.org/loadtest1.php
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OGG流媒体文件格式分析 的相关文章

  • 数据结构笔记(C语言版)

    一 绪论 程序 数据结构 算法 1 基本的数据结构 线性结构 线性表 栈和队列 串 数组和广义表 非线性结构 树 图 用计算机解题一个问题的步骤 具体问题抽象为数学模型 设计算法 编程 调试 运行 数据结构是一门研究非数值计算的程序设计中计
  • [Hive SQL] 实现分组排序、分组topN

    举个场景例子 我们要计算app内在每小时区间内访问量前2的服务 根据访问日志处理完后的数据集如下所示 visit hour service name visit cnt 2021062401 A 421 2021062401 B 710 2
  • python实现简易万年历_Python编程——万年历

    2017年五月份日历 万年历这个题目几乎是不论学哪种编程语言必要尝试的一个小知识 综合了循环 逻辑关系判断等各编程语言的基础知识 今天我们一起用Python实现简单的万年历功能 查看某年各个月份日历和查看确定月份日历 网上大概浏览了一部分代

随机推荐

  • C++从0到1(5):循环结构

    目录 1 while循环 2 do while循环 3 for循环 4 嵌套循环 1 while循环 作用 满足循环条件 执行循环语句 语法 while 循环条件 循环语句 循环条件为真 就执行循环语句 include
  • Maven一定要会的这几个知识!

    一 Maven概念 Maven是一个项目管理和整合工具 Maven为开发者提供了一套完整的构建生命周期框架 开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置 因为Maven使用了一个标准的目录结构和一个默认的构建生命周期 若有多个
  • 初识Nacos

    目录 1 Nacos介绍 1 1四大功能 1 2微服务中配置文件的问题 1 3配置中心解决了什么 1 4业界常见的配置中心 1 5解决不同环境相同配置的问题 1 6不同微服务之间相同配置的共享 2 Nacos Config 动态刷新原理 2
  • 使用ImageMagick批量转换图片格式

    需求 需要将1000张 DCM后缀结尾的图片文件转换为常见的jpg格式 解决 windows下载安装 http www imagemagick org script download php 将ImageMagick安装完成后 确保在命令行
  • QT下assimp库的模型加载

    Assimp库概述 一个非常流行的模型导入库是Assimp 它是Open Asset Import Library 开放的资产导入库 的缩写 Assimp能够导入很多种不同的模型文件格式 并也能够导出部分的格式 它会将所有的模型数据加载至A
  • 云服务器:Linux宝塔面板如何部署node服务

    前情 有自己的服务器 已经安装了宝塔面板 也安装了node js 在本地编写了一个node程序 如何要挂载到阿里云服务器中运行 解决 将本地node文件上传至服务器中www目录下 node modules可以不用上传 运行node程序 np
  • 网络基础之OSI七层模型与TCP/IP五层模型

    OSI七层模型及功能概述 一 OSI七层模型 二 七层模型的功能概述 1物理层 2数据链路层 3网络层 4传输层 5会话层 6表示层 7应用层 三 TCP IP五层模型的组成 四 五层模型中的协议族组成 五 数据封装与解封装过程 六 设备与
  • Transformer论文及源码笔记——Attention Is All You Need

    Transformer论文及源码笔记 Attention Is All You Need 综述 介绍 代码实现 编码模块 解码模块 综述 论文题目 Attention Is All You Need 时间会议 Advances in Neu
  • R语言作业--第六章判别分析

    目录 思考题4 原题目 贝叶斯判别的基本思想是什么 练习题第3题 以舒张期血压和讯将胆固醇含量预测被检查者是否患冠心病 测得15名冠心病人和16名健康人的舒张压 X1及血浆胆固醇含量X2 结果如表6 4 练习题第4题 对于A股市场2009年
  • 并查集平摊代价分析

    并查集平摊代价分析 1 并查集链表 Linked list representation of disjoint sets 1 1 最糙的链表 链表的每个结点有三个域 分别是head rep tail head是个指针 指向这个集合的第一个
  • GnuTLS recv error (-110): The TLS connection was non-properly terminated 解决(linux)

    原理是重新编译安装git 在linux终端按照下面命令一步一步执行即可 sudo apt get install build essential fakeroot dpkg dev y sudo apt get build dep git
  • 小程序开发完整教程

    微信使用的开发语言和文件很 特殊 小程序所使用的程序文件类型大致分为以下几种 WXML WeiXin Mark Language 微信标记语言 WXSS WeiXin Style Sheet 微信样式表 JS Java 小程序的主体 在语言
  • js断点和调试学习总结3

    使用Chrome调试JavaScript的断点设置和调试技巧 你是怎么调试 JavaScript 程序的 最原始的方法是用 alert 在页面上打印内容 稍微改进一点的方 法是用 console log 在 JavaScript 控制台上输
  • 插入方法(Insert Methods)

    进入MongoDB中文手册 4 2版本 目录 MongoDB提供了以下将文档插入到集合中的方法 方法 说明 db collection insertOne 将单个文档插入集合中 db collection insertMany 将多个 文档
  • 单元测试时间机器

    没有单元测试 您怎么称呼重构 任何人 是 这是一个技巧问题 不是吗 没有单元测试的重构不称为重构 这称为更改代码 甚至可以称其为破坏代码 随手添加测试 当您需要更改未经测试的代码时 添加单元测试很有用 您实际上可以添加两种类型 一个明显的用
  • STM32全国研讨会:且看Python 和OpenMV如何在 STM32 MCU上运行AI 2020-09-15 07:10 预计 24 分钟读完

    What is the state of machine learning at the edge today What tools can help engineers collect data and run inferences Wh
  • Rust学习笔记(三)——注释

    Rust学习笔记 三 注释 单行注释 多行注释 和大多数高级语言一样 Rust同样支持单行注释和多行注释 单行注释 单行注释是 或 开头的注释内容 Rust会将 或 到其后的第一个换行符之间的内容作为注释内容 所不同的是 以三个反斜杠 开头
  • 【安装教程】夜神模拟器+抓包工具mitmproxy

    夜神模拟器官网下载 应用商城搜索 小红书 下载软件即可 python 安装 mitmproxy 1 安装Microsoft Visual buildtools 链接 https pan baidu com s 1GyLNOOydBoOtNB
  • class from quick

    原文链接 http www jianshu com p 9587fffc7d8f 创建一个类 lua 定义名为 Shape 的基础类 local Shape class Shape ctor 是类的构造函数 在调用 Shape new 创建
  • OGG流媒体文件格式分析

    摘自 http www studa net yingyong 080505 16283240 html 摘 要 流媒体文件格式在流媒体系统中占有重要地位 设计合理的文件格式是提高流媒体服务器工作效率最直接和最有效的办法 该文在剖析常用流媒体