用HTTP协议传输媒体文件 学习
用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协议传输媒体文件 学习的更多相关文章
- 用c++开发基于tcp协议的文件上传功能
用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学 ...
- [转] 用协议分析工具学习TCP/IP
一.前言 目前,网络的速度发展非常快,学习网络的人也越来越多,稍有网络常识的人都知道TCP/IP协议是网络的基础,是Internet的语言,可以说没有TCP/IP协议就没有互联网的今天.目前号称搞网的 ...
- 基于BT协议的文件分发系统
基于BT协议的文件分发系统构成: 1.一个Web服务器:保存着种子文件 2.一个种子文件:保存共享文件的一些信息(文件名,文件大小 ,Tracker服务器地址,torrent为后缀) ...
- python调用Moxa PCOMM Lite通过串口Ymodem协议发送文件
本文采用python 2.7编写. 经过长期搜寻,终于找到了Moxa PCOMM Lite.调用PCOMM.DLL可以非常方便的通过串口的Xmodem.Ymodem.Zmodem等协议传输文件,而无需 ...
- PHP操作XML文件学习笔记
原文:PHP操作XML文件学习笔记 XML文件属于标签语言,可以通过自定义标签存储数据,其主要作用也是作为存储数据. 对于XML的操作包括遍历,生成,修改,删除等其他类似的操作.PHP对于XML的操作 ...
- Python文件学习
Python文件学习 文章 Python文件学习 open函数 基本的用法模式:file_object=open('',access_mode='r',buffering=-1) 其中access_m ...
- vsftpd-基于ftp协议的文件传输服务器软件
第一部分:在Linux上部署vsftpd服务 1. vsftpd简介 1.1 vsftpd是什么? ftp(File Transfer Protocol)文件传输协议.(实现不同操作系统之间文件的传输 ...
- Delphi/XE2 使用TIdHttp控件下载Https协议服务器文件[转]
之前的一篇博文详细描述了使用TIdhttp控件下载http协议的文件,在我项目的使用过程中发现对于下载Https协议中的文件与Http协议的文件不同,毕竟Https在HTTP协议基础上增加了SSL协议 ...
- python第三方库——xlrd和xlwt操作Excel文件学习
python第三方库——xlrd和xlwt操作Excel文件学习 1安装: C:\Users\Lenovo>pip install xlwtCollecting xlwt Downloadin ...
随机推荐
- 远程视频监控之应用篇(mjpg-streamer)
这篇文章将主要结合源码介绍mjpg-streamer,使小伙伴们了解视频监控的实现. 一.移植 tar xvf mjpg-streamer-r63.tar.gz cd mjpg-streamer-r6 ...
- Android视频播放-SurfaceView和Mediaplayer
好几天没写博客了,处理了一点个人私事加上平时加班,基本上时间不充裕,上篇文章讲了一下用Mediaplayer来播放音乐,这次就讲讲使用Mediaplayer来和SurfaceView配合播放一个视频流 ...
- Insert Interval leetcode java
题目: Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if nec ...
- Proxy 代理模式 动态代理 CGLIB
代理的基本概念 几个英文单词: proxy [ˈprɒksi] n. 代理服务器:代表权:代理人,代替物:委托书: invoke [ɪnˈvəʊk] vt. 乞灵,祈求:提出或授引-以支持或证明:召鬼 ...
- MD5 SHA1 哈希 签名 碰撞 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Linq-分页查询
var list = from s in db.t_address select s; & userid != null) { list = list.Where(v => v.user ...
- 【Javascript Demo】防止按钮在短时间内被多次点击
如果一个按钮可以在短时间内多次点击,那么有可能会被用户恶意点击,为防止这种情况,可以设定一定时间内只能点击一次,其他时间禁止点击按钮. 1.效果如下: 2.代码如下: <div> ...
- shell综合
既可恶又不得不注意的地方: 1.if 与[ 之间必须有空格, 2.[ ]与判断条件之间也必须有空格, 3.]与; 之间不能有空格, 4.变量赋值的时候,等号两边不能有空格, 调试:sh -x xxx. ...
- 带"叉叉"的GridView
由于需要用到“删除图片”的功能,需要写这样一个小demo: 对之前博文的修改 发现imageView监听点击事件 效果实在不敢恭维,因此换个方式:设置Touch的监听函数, 下面的Demo没有改过来哈 ...
- 微信小程序 - 实现购物车结算
示例源码下载:小程序-实现购物车结算