一、什么是HTTP Dynamic Streaming

使用传统的HTTP协议进行在线播放叫做“渐进下载”,所有的视频内容从头到尾必须从服务器传输到客户端,用户只能在传输完的视频长度中选择播放点,而不能自定义播放点及传输点,比如我们在看视频的时候是边下边看,没下载完则看不了,而且也不能绕到视频后面的片段。当视频观看完毕之后,在浏览器的缓存中会存在一个视频文件。

而使用RTMP协议进行传输的数据包叫做“流”(如Flash Media Server),它能够让视频内容分割成多个数据包并源源不断从服务器端传输到客户端,客户端可以在视频内容任意一个点开始请求传输,而不用关心该点之前的内容是否已经传输。这样我们看视频的时候可以在任意一个地方开始观看,点到哪里就从哪里开始下载,观看完毕之后在客户端不会有缓存文件。

两种协议各有各的优缺点,比如http协议在第二次观看视频的时候会直接使用缓存文件进行播放,速度也比较快,而RTMP协议必须保持源源不断送出“流”,同时本地也无缓存。

而HTTP Dynamic Streaming则是对两种协议的优点进行了一个组合,达到了两个协议取长补短的服务平台。其通过对来自RTMP端的“流”进行包装处理,转化成HTTP“流”提供给客户端解析,用户再也不用下载整个文件,同时又能使用HTTP协议进行快速观看视频。

架构图:

 

工作模式:

HTTP Dynamic Streaming有两种工作模式,一种是On-demand模式,直接对文件进行“流”处理,把单个文件分离成N个片段,用户跳到相应的片段,则传输该片段,用户没请求该片段,则不传输(貌似能达到节省带宽的作用);一种是live模式,也就是所谓的直播,这里需要FMS的支持,FMS通过把直播流传递给HTTP Dynamic Streaming,然后进行包装处理,传递给客户端,此模式可以应用在视频会议,视频聊天室,网络直播等应用中,HTTP Dynamic Streaming的主要作用也在这个模式中体现。

二、原理分析

用过Flash Media Server(简称:FMS)的技术人员都知道FMS的工作原理,而HTTP Dynamic Streaming(简称:HDS)的实际效果则是工作在FMS计算结果上的,从架构图上不难看出,无论是On-demand模式或live模式,多多少少都会依赖FMS,比如On-demand模式,FLV文件必须通过FILE PACKAGER进行转码得到".f4f",".f4m",".bootstrap"等文件才能够提供给“HTTP ORIGIN MODULE”处理,而一般线上的环境的视频文件何止千千万万!再说效率是否达到要求还很难说。而live模式中LIVE PACKAGER能够把来自RTMP的“流”直接生成所需要的文件,提供给“HTTP ORIGIN MODULE”处理,但依然也是得有FMS的支持才行。

实际的工作流程是这样的:

On-demand:      FLV /F4V(目前只支持两种格式)------>File Packager------->(.f4f/.f4m/.f4x/..bootstrap/.drmmeta)------->Apache-------->HTTP ORIGIN MODULE-------->客户端播放器(需支持HTTP流)

Live:      FLV /F4V(目前只支持两种格式)------->FMS(Using RTMP)------->Live Packager------->(.f4f/.f4m/.f4x/..bootstrap/.drmmeta)------->Apache-------->HTTP ORIGIN MODULE-------->客户端播放器(需支持HTTP流)

相关模块:

File Packager:一个命令行工具,它可以按照需求把多媒体文件形成流碎片并把碎片写进\.f4f文件。文件包装机是一种离线工具。同时也支持Flash Access验证访问的需求。

Live Packager:该工具只针对HDS,同时集成在FMS(version 3.8以上)。它可以实时测量RTMP流(live),并将之转化成新的\.f4f文件,满足实时性要求。内置的apache服务器使用HTTP ORIGIN MODULE对生成的文件进行解析,然后提供出HTTP流。

HTTP ORIGIN MODULE:HDS的重要组成部分,其为apache的一个modules,负责对(.f4f/.f4m/.f4x/..bootstrap/.drmmeta)等文件进行解析,然后转换成HTTP流输出。

OSMF Player:一个开源的播放器,建立在Open Source Media Framework(OSMF)的框架上,支持HTTP流,要求Flash player 10.1或以上

相关文件描述:

.f4f:Packager的输出文件,它来自源多媒体文件的输出,为其中的一个或多个片段,其中片段可以由一个或多个“流”组成,可以理解为HTTP流中的源文件

.f4m:Packager的输出文件,它记录了源多媒体文件的编码率,分辨率等信息,同时定义了每个流的大小

.f4x:索引文件,定义关键帧等

.bootstrap:它将告诉apache及其中的模块如何去读取./f4f文件,可以理解为引导文件,引导信息来自于.f4m文件,但是也可以额外指定其它信息来源(--external-bootstrap)

.drmmeta:用于保存加密的信息,需要使用(--external-bootstrap)来引用进来

从上面的一些模块及重要文件描述可以具体了解到各个环节的工作及原理,具体也可以解释到HDS是怎样配合Flash Access Server来做播放认证,把具体的文件或RTMP流转换成HTTP流的工作过程,但同时要注意一点,播放器必须支持读取HTTP流,比如OSMF Player.

三、性能分析

扯到性能这个话题,我感到非常蛋疼,FMS的最低要求是4G内存,还得奔腾4以上的CPU,一开服务跑一段时间,内存基本吃光,而且不会释放,一般线上的服务器都是8G内存左右,CPU当然不用说了,所以我们运维人员做优化的空间非常小,比如优化单个流的大小,降低视频文件的码率,提高系统的I/O等等,这些都是以更高级的配置换取更好的性能(难怪人家说做视频烧钱,钱都烧在设备里面了)。回到HDS,那么这个最低要求肯定要比FMS高(虽然官网表明跟FMS一样),你要是想跑的顺点的话,那你只能在这个基础上翻一倍的硬件质量了,尤其是内存和硬盘速度方面的要求,服务器要不断从内存中读取RTMP的流,然后写成本地文件,高并发的情况下,内存和硬盘的负载是非常大的。但用户对流畅性要求比较高的时候,减小单个流的大小是一个不错的选择,但这个也是以提高CPU负载为代价的,流变小了,流的个数也多了,那么也增加了IO的负担。。。。当然这个只是理论上的推测,因为没有实际的情况来做测试,假如有人有条件做个测试,可以交流一下。

总体来说,HDS让流媒体更加扩展开来,让更多的环境都能够通过HTTP实现流播放,而抛弃了RTMP的束缚之后,在一些应用的开发上也减少了很多限制。而采用HTTP流的方式,对于一些非验证性的业务(如免费视频分享)有了更好的选择,不用死磕RTMP了,同时加上APACHE,对于视频的缓存方面有了强有力的支持,感觉性能会提高很多(包括动态控制带宽)。至于还可以在哪些环境中应用,目前接触不多,还有待了解!

四、相关下载地址

服务器模块  - 让Apache支持HTTP动态流
    http://www.adobe.com/go/httpdynamicstreaming_bits
OSMF播放器  - 支持HTTP动态流的播放器
    http://www.osmf.com/downloads/OSFMPlayer_zeri2.zip
HDS帮助在线手册
    http://help.adobe.com/en_US/HTTPStreaming/1.0/Using/index.html

部分内容从adobe官方手册翻译而来,如有错误欢迎指出;欢迎转载,转载请注明出处!

五、与HTTP Live Streaming比较

与APPLE家的HTTP Live Streaming差不多,主要异同如下:

1、文件切片采用MP4的格式而非ts格式;
2、索引在APPLE家是foo.m3u8文件,Adobe家是manifest文件;
3、Adobe家除了支持APPLE家支持的H.264/AAC之外还支持VP6/MP3编码;
4、不同于APPLE家,内容保护通过Flash Access Server来实现;
5、通过Adobe AIR可达范围更广(Mac OS、Windows、Linux都可以),但目前显然过不了APPLE家 iOS的审核;
6、两家同样都支持点播和直播;
7、Adobe家提供了一个全套的解决框架“Open Source Media Framework”。
8、HTTP Dynamic Streaming作为Adobe自家RTMP的补充。它自己的优点就不提了。相较RTMP之下它拥有:更低的延时、更短的载入时间、动态缓冲和基于流的加密。

HDS协议介绍的更多相关文章

  1. TCP/IP 协议介绍

    转自http://blog.jobbole.com/104886/ 一.TCP/IP 协议介绍 在介绍 HTTP 协议之前,先简单说一下TCP/IP协议的相关内容.TCP/IP协议是分层的,从底层至应 ...

  2. 第二章 ZAB协议介绍

    ZAB ( ZooKeeper Atomic Broadcast , ZooKeeper 原子消息广播协议)是zookeeper数据一致性的核心算法. ZAB 协议并不像 Paxos 算法那样,是一种 ...

  3. JSON-RPC轻量级远程调用协议介绍及使用

    这个项目能够帮助开发人员利用Java编程语言轻松实现JSON-RPC远程调用.jsonrpc4j使用Jackson类库实现Java对象与JSON对象之间的相互转换.jsonrpc4j包含一个JSON- ...

  4. [转]流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)

    [转]流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls) http://blog.csdn.net/tttyd/article/details/12032357 RTP       ...

  5. Python基础教程之udp和tcp协议介绍

    Python基础教程之udp和tcp协议介绍 UDP介绍 UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议.UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但 ...

  6. 常用音频协议介绍&&有关音频编码的知识与技术参数

    (转载)常用音频协议介绍 会议电视常用音频协议介绍及对比白皮书 一.数字化音频原理:声音其实是一种能量波,因此也有频率和振幅的特征,频率对应于时间轴线,振幅对应于电平轴线.通常人耳可以听到的频率在20 ...

  7. 各种开源协议介绍 BSD、Apache Licence、GPL V2 、GPL V3 、LGPL、MIT_转

    转自:各种开源协议介绍 BSD.Apache Licence.GPL V2 .GPL V3 .LGPL.MIT 现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的 ...

  8. OSPF协议介绍及配置 (上)

    OSPF协议介绍及配置 (上) 一.OSPF概述 回顾一下距离矢量路由协议的工作原理:运行距离矢量路由协议的路由器周期性的泛洪自己的路由表,通过路由的交互,每台路由器都从相邻的路由器学习到路由,并且加 ...

  9. VRRP协议介绍--转

    http://www.cnblogs.com/jony413/articles/2697404.html VRRP协议介绍 参考资料: RFC 3768 1. 前言 VRRP(Virtual Rout ...

随机推荐

  1. 关于启动php-fpm失败的解决办法

    当我执行 sudo lnmp php-fpm restart会出现如下错误 Starting php-fpm /usr/local/php/sbin/php-fpm: error while load ...

  2. 从头学pytorch(三) 线性回归

    关于什么是线性回归,不多做介绍了.可以参考我以前的博客https://www.cnblogs.com/sdu20112013/p/10186516.html 实现线性回归 分为以下几个部分: 生成数据 ...

  3. Kubernetes Clusters

    1. 创建集群 Kubernetes集群  Kubernetes协调一个高可用的计算机集群,作为一个单独的单元来一起工作.有了这种抽象,在Kubernetes中你就可以将容器化的应用程序部署到集群中, ...

  4. Python3 collections模块的使用

    collections 介绍 collections是Python内建的一个集合模块,提供了许多有用的集合类和方法. 可以把它理解为一个容器,里面提供Python标准内建容器 dict , list  ...

  5. windows10 powershell上切换至cmd

    前言 在windows10 上是遇到了坑,因为出现了这样的情况!不要说什么盗版,公司买的正版呢. 上图是powershell,下图是 cmd,然后我同样使用powershell 与 cmd,查询nod ...

  6. (Go) 1. go环境配置

    第一步: 下载配置环境 转载: https://www.liwenzhou.com/posts/Go/go_menu/ 1.下载地址: https://golang.google.cn/dl/ 2.安 ...

  7. python实现上传文件到linux指定目录

    今天接到一个小需求,就是想在windows环境下,上传压缩文件到linux指定的目录位置并且解压出来,然后我想了一下,这个可以用python试试写下. 环境:1.linux操作系统一台2.window ...

  8. 【题解】P4137 Rmq Problem(莫队)

    [题解]P4137 Rmq Problem(莫队) 其实这道题根本就不用离散化! 因为显然有\(mex\)值是\(\le 2\times 10^5\)的,所以对于大于\(2\times 10^5\)的 ...

  9. 【一起学源码-微服务】Nexflix Eureka 源码十三:Eureka源码解读完结撒花篇~!

    前言 想说的话 [一起学源码-微服务-Netflix Eureka]专栏到这里就已经全部结束了. 实话实说,从最开始Eureka Server和Eureka Client初始化的流程还是一脸闷逼,到现 ...

  10. Jenkins构建Vue项目

    一.Jenkins Job相关配置 二.发布脚本 [root@pdata-nps05 nps]# cat nps_web-page.sh #!/bin/sh USER_IP=172.168.168.1 ...