用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. pymysql模块用法

    python关于mysql的API--pymysql模块 pymsql是Python中操作MySQL的模块,其使用方法和py2的MySQLdb几乎相同. 模块安装 1 pip install pymy ...

  2. 通过小实例谈谈javascript的间隔调用和延时调用

    用 setInterval方法可以以指定的间隔实现循环调用函数,直到clearInterval方法取消循环 用clearInterval方法取消循环时,必须将setInterval方法的调用赋值给一个 ...

  3. 【系统】supervisor支持多进程

    [program:deployworker] directory = /etc/ansible/easyAnsible/app/deploy/ command = python Deploy.py p ...

  4. URAL 1807

    题目大意:给出一个正整数n(n为合数),求n的一个划分(a1,a2,...,ak,...)(k>=2).使得其在存在最大的最大公约数之下,存在最大的最小公倍数. KB     64bit IO ...

  5. 使用(function() {}).call(this);包裹代码有什么好处,什么时候应该这样做?

    转自:http://segmentfault.com/q/1010000002519489 1.严格模式下函数调用的 this 并不会默认成为全局对象. 使用 func.call(this) 确保函数 ...

  6. Javascript游戏,街头霸王

    在线演示 本地下载 街头霸王,有没有记起点什么?我想起了那个有颗大槐树的老院子,还有一台小霸王和一个儿时的伙伴.

  7. cocos lua 加密与解密 混淆 (版本号cocos3.4)

    cocos luacompile cocos luacompile Overview Usage Available Arguments Samples Overview Compile the .l ...

  8. listView下拉刷新加载数据

    这个下拉效果在网上最早的例子恐怕就是Johan Nilsson的实现,http://johannilsson.com/2011/03/13/android-pull-to-refresh-update ...

  9. Asp.Net 之 <%%>相关内联代码块用法

    1.<%@ ... %> 用来添加命名空间引用,如:<%@ import namespace="system.data"> 2.<% ... %> ...

  10. 2.6.33中关于at91sam9260的i2c controller驱动的问题

    在为at91sam9260移植2.6.33内核的I2C时,直接用driver/bus/i2c-at91.c这个iic的adapter驱动是不能用的,而且在makemenuconfig时,在device ...