用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. Memento 备忘录 快照模式 MD

    备忘录模式 简介 在不破坏封装的前提下,捕获一个对象的[内部状态],并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态. 角色: 发起人Originator:要被备份的成员,它提供 ...

  2. C# 音频操作系统项目总结

    此项目需求是针对.wav格式音频进行操作,转换成相应的.mp3格式的音频文件,对音频进行切割,最后以需求的形式输出,此篇会回顾运用到的一些知识点. 1.MDI子窗口的建立: 首先一个窗体能够创建多个M ...

  3. NYOJ-61 传纸条(一)

    传纸条(一) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...

  4. GoLang中如何使用多参数属性传参

    我们常常因为传入的参数不确定而头疼不已,golang 为我们提供了接入多值参数用于解决这个问题.但是一般我们直接写已知代码即所有的值都知道一个一个塞进去就好了,但是绝大部分我们是得到用户的大量输入想通 ...

  5. 怎样在Ubuntu中修改默认程序

    这个新手指南会向你展示如何在 Ubuntu Linux 中修改默认程序.对于我来说,安装 VLC 多媒体播放器是安装完 Ubuntu 16.04 该做的事中最先做的几件事之一.为了能够使我双击一个视频 ...

  6. Linux kernel模块管理相关详解

    Linux内核模块化设计 1. Linux内核设计:单内核.模块化(动态装载和卸载) (1) Linux:单内核设计,但充分借鉴了微内核体系的设计的优点:为内核引入了模块化机制:(2) 内核的组成部分 ...

  7. JavaScript Event Delegation, and event.target vs. event.currentTarget

    原文:https://medium.com/@florenceliang/javascript-event-delegation-and-event-target-vs-event-currentta ...

  8. @SuppressLint("NewApi")和@TargetApi()的区别

    在Android代码中,我们有时会使用比我们在AndroidManifest中设置的android:minSdkVersion版本更高的方法,此时编译器会提示警告, 解决方法是在方法上加上@Suppr ...

  9. Eclipse里如何配制项目在tomcat中启动

    首先,在Eclipse中新建一个Hello工程,Workspace的位置在c:/eclipse/workspace,所以hello工程的位置就是在%Workspace%/hello/这个文件夹中.  ...

  10. more命令(转)

    原文:http://www.cnblogs.com/peida/archive/2012/11/02/2750588.html more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示 ...