用HTTP协议传输媒体文件可以分两个阶段,第一个阶段是Progressive Download(渐进式下载方式)阶段,第二个阶段是HTTP streaming(HTTP流化)阶段。其中,第一个阶段可以看成第二个阶段的前身。

  • Progressive Download

  渐进式下载是一种顺序流式传输,它是一种简单的从HTTP WEB服务器进行文件下载的方式,其中“渐进”指的是用户可以一边下载一边播放,而不需将整个媒体文件下载完毕再播放。在渐进式下载中,客户端用户发送HTTP请求流媒体文件,服务器收到请求之后通过HTTP响应发送媒体文件给客户端用户。客户端与服务器交互过程如图:

从严格意义上讲,这种下载方式不是真正的流式传输,所以它也称为“伪流媒体”,主要原因是它与普通文件下载方式没有本质的区别,不支持实时的流媒体传输,当用户停止播放它仍然继续下载,直到整个媒体文件下载完毕或者播放界面被关闭,下载的媒体文件会被保存在客户端的磁盘上。

  • HTTP streaming

  HTTP流化技术的主要思想是在服务器端将多码率的媒体文件分割成一个个小的媒体切片,客户端通过HTTP请求一个个小的媒体切片,服务器收到请求通过HTTP响应发送媒体切片。服务器和客户端交互的过程中,可以由客户端或服务器实时检测网络带宽情况,随时可以切换媒体切片的质量级别(不同码率对应不同质量级别)。保证播放的连续性和流畅性,提升用户体验

采用HTTP协议作为流媒体传输的协议栈,主要分成网络层、传输层和应用层。

在HTTP流化方式中,一个媒体文件有多种码率的版本(可以砸服务器端动态产生也可以静态存储),其中高码率对应较高质量级别,反之亦然。服务器实现媒体文件的切片、容器格式封装等等之后,在服务器和客户端交互的过程中,根据宽带资源的变化,动态的在不同质量级别的媒体文件切片之间切换,这种切换的发起者可以是服务器或者客户端,即有服务器控制的自适应策略和客户端控制的自适应策略。

  • 网络部署

  HTTP流化技术在网络部署中不需要假设专有的流媒体服务器,使用标准的HTTP WEB服务器即可,便于大规模部署,而且,因为采用HTTP协议,HTTP流化能很好的支持防火墙的穿越与NAT的转换。

  • 流媒体编码格式

  数字化的音频和视频信息携带着大量的数据量,而数据量又是网络传输的敏感因素,因此,在进行网络传输之前,需要对音频和视频进行必要的压缩编码,降低网络传输的压力,目前主流的基于HTTP流化的流媒体技术中,一般采用H.264+AAC的视频和音频编码组合。

H.264的编码分为两层,视频编码层VCL(video coding layer)和网络提取层NAL(network abstraction layer).视频编码层负责对视频数据的编解码,包括运动估计、熵编码等内容;网络提取层负责将编码后的数据进行封装,方便视频数据在异构网络上传输。网络提取层的引入,使得H.264视频编码格式的媒体文件具有较强的网络适应性,能容易地在不同网络上传输。

  • 流媒体文件的容器格式

  我们一般说流媒体文件格式或者其后缀名指的就是文件的容器格式,如MP4格式。对于一种容器格式, 可以包含多种不同的轨道,每个轨道可以是压缩编码后的视频、音频或者文本等信息。容器的作用是把压缩编码后的视频和音频数据放在同一个文件的不同轨道,添加一些信息方便同时回放,并且将数据尽可能紧凑的排布。

  容器格式一般应包含三个部分:

  Header:标记文件类型,音视频码流等基本属性信息。

  Index:索引表,视频frame对应的offset,size,timestamp等信息。

  Stream:音视频裸数据。

  有些容器格式(如AVI)可能没有索引表,但在需要的时候要根据其他信息找到offset和size等信息,自己建立索引表。

  MP4文件格式是个十分开放的容器,几乎可以用来描述所有的媒体结构。MP4容器中的媒体格式描述与媒体数据时分开的,并且媒体数据的组织也很自由,不一定要按照时间顺序排列。

图中给出了MP4容器格式的一些主要box,可以看出,MP4容器格式是一种逐级嵌套的容器格式。MP4容器格式由若干个box组成,每个box有类型和长度,可以填充不同的信息或者数据。box可以理解为俄数据对象块,有些box中可以包含其他box,这种box称为contained box。标准的box开头的四个字节(32位)为box size,该大小包括box header 和box body整个box的大小。size 后面紧跟的32位为box type,一般是四个字符,如“ftyp"、”moov"等,每个box都有固定的格式和需要填充的信息。其中ftyp box有且只有一个,不能被其他box包含。该box应该被放在文件的最开始,指示该MP4文件应用的相关信息。moov box同样只有一个,一般情况下,“moov"会紧随"ftyp"出现,一般情况下,moov中会包含1个mvhd和若干个trak。其中mvhd为header box,一般作为moov的第一个子box出现(对于其他container box来说,header box都应作为首个子box出现),trak必须包含一个tkhd和一个mdiz,此外还有很多可选的box.

在所有的box中,填充信息和数据比较多且比较重要的box为stbl box(sample table box),该box包含了sample所有时间和位置的信息,以及sample的编码信息等,是MP4最复杂的box,可以含有stsd,stts,stsz等下一级box.

stsd(sample description box):该box必不可少,包含了数据类型信息和编码的信息,例如:音视频的编码方式、视频的宽和高、音频的声道。

stts(Time to Sample Box):存储了sample的时长信息,描述了sample时序的映射关系,我们通过它可以找到任何时间的sample.

stsz(sample size box): 包含了每个sample的大小信息。

以上box都 属于容器格式的索引表部分,在MP4容器格式中,音视频的裸数据在mdat box中存储。

H.264编码视频流是由一个个NAL(network abstraction Layer)单元组成的,同城一帧视频数据封装在一个或多个NAL单元。

  • 流媒体文件切片

  • 流媒体文件切片

  • 容器格式转换

  • 自适应算法的两种模式

  • HTTP层自适应算法

用HTTP协议传输媒体文件 学习的更多相关文章

  1. 用c++开发基于tcp协议的文件上传功能

    用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学 ...

  2. [转] 用协议分析工具学习TCP/IP

    一.前言 目前,网络的速度发展非常快,学习网络的人也越来越多,稍有网络常识的人都知道TCP/IP协议是网络的基础,是Internet的语言,可以说没有TCP/IP协议就没有互联网的今天.目前号称搞网的 ...

  3. 基于BT协议的文件分发系统

    基于BT协议的文件分发系统构成:    1.一个Web服务器:保存着种子文件    2.一个种子文件:保存共享文件的一些信息(文件名,文件大小    ,Tracker服务器地址,torrent为后缀) ...

  4. python调用Moxa PCOMM Lite通过串口Ymodem协议发送文件

    本文采用python 2.7编写. 经过长期搜寻,终于找到了Moxa PCOMM Lite.调用PCOMM.DLL可以非常方便的通过串口的Xmodem.Ymodem.Zmodem等协议传输文件,而无需 ...

  5. PHP操作XML文件学习笔记

    原文:PHP操作XML文件学习笔记 XML文件属于标签语言,可以通过自定义标签存储数据,其主要作用也是作为存储数据. 对于XML的操作包括遍历,生成,修改,删除等其他类似的操作.PHP对于XML的操作 ...

  6. Python文件学习

    Python文件学习 文章 Python文件学习 open函数 基本的用法模式:file_object=open('',access_mode='r',buffering=-1) 其中access_m ...

  7. vsftpd-基于ftp协议的文件传输服务器软件

    第一部分:在Linux上部署vsftpd服务 1. vsftpd简介 1.1 vsftpd是什么? ftp(File Transfer Protocol)文件传输协议.(实现不同操作系统之间文件的传输 ...

  8. Delphi/XE2 使用TIdHttp控件下载Https协议服务器文件[转]

    之前的一篇博文详细描述了使用TIdhttp控件下载http协议的文件,在我项目的使用过程中发现对于下载Https协议中的文件与Http协议的文件不同,毕竟Https在HTTP协议基础上增加了SSL协议 ...

  9. python第三方库——xlrd和xlwt操作Excel文件学习

    python第三方库——xlrd和xlwt操作Excel文件学习 1安装: C:\Users\Lenovo>pip install xlwtCollecting xlwt  Downloadin ...

随机推荐

  1. Informatica 常用组件Lookup之四 查找组件

    在映射中配置查找转换时,请定义以下组件: 查找源 端口 属性 条件 元数据扩展 查找源         您可以使用平面文件或关系表作为查找源.创建查找转换时,您可以从以下位置导入查找源: 资料库中的任 ...

  2. 局域网Cesium离线影像及瓦片影像地图加载【转】

    http://www.mamicode.com/info-detail-2161992.html 1.Cesium简介 优点: cesium展示地图数据效果比较好,解析2D地图各种不同服务类型的数据源 ...

  3. xUtils框架的使用详解

    一.xUtils简介 xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受 ...

  4. MongoDB学习笔记(二)--Capped集合 && GridFS存储文件

    Capped集合                                                            Capped集合的大小是固定的,如果空间都被用完了,新添加的对象 ...

  5. 在Ubuntu 桌面版 12.04 LTS配置sftp

    第一步:检查vsftpd是否安装了 root@hy-Aspire-SA10:~# rpm -qa|grep vsftpd 没有输出,说明没安装. 第二步:安装vsftpd root@hy-Aspire ...

  6. SqlServer 之 系统视图

    一.了解系统视图 1. 系统视图:从名字上看就知道,就是存放一些sqlserver系统的一些信息. 2. 存在位置: 下面截图看看,从截图中你可以看到,不管是“系统数据库”还是“用户数据库”都是有这些 ...

  7. Platinum UPnP

    http://www.plutinosoft.com/platinum http://blog.csdn.net/lancees/article/details/9178385 Note that P ...

  8. uni - 条件渲染

    vue官方文档和uni官方同步:https://cn.vuejs.org/v2/guide/conditional.html 1.多次切换建议使用v-show(始终保存在BOM) 2.因为if是惰性判 ...

  9. Linux用户、组帐号和权限(学习笔记九)

    一.用户分类 超级用户:root 普通用户:由超级用户和管理员创建,一般只在自己的目录中有完全的权限 程序用户: 二.用户账号管理 常用命令: useradd:添加用户 userdel:删除用户 pa ...

  10. JDBC的简单操作

    JDBC是一组能够执行SQL语句的API 由于传统的数据库操作方式需要程序员掌握各个不同的数据库的API,极其不便 因此java定义了JDBC这一标准的接口和类,为程序员操作数据库提供了统一的方式 J ...