视频容器
视频容器(又称视频文件格式)就是用来装载多媒体数据流(包含:视频流、音频流和字幕流)的文件格式
,一般包含:文件头部分(说明多媒体数据符合的编码格式及规范信息)、索引部分、媒体数据部分。
常见的视频容器有:
FLV
flash video 流媒体文件格式,是随着Flash MX的推出发展而来的网络视频封装格式。具有如下特点:
文件体积小,清晰的FLV视频1分钟在1MB左右,是普通文件体积的1/3
再加上CPU占有率低
提供数字版本保护功能
解决了视频文件导入Flash后,导出的SWF文件体积庞大问题
FLV的文件构成
Tag Header由11字节组成:
1:Tag的类型:音频(0x08),视频(0x09),Script Data(0x12)
2-4:表示一个无符号24位整型数值,表示当前Tag Data的大小;
5-7:无符号24位整型数值,当前Tag的开始时间戳(单位为ms)
8:为时间戳的扩展字节,当前24位不够用时,该字节作为最高位,将时间戳扩展为32位无符号整数
9-11:表示Stream ID,总是0
音频Tag Data:第一个字节是音频流信息,接着是音频流数据,其中第一个字节中信息有:
4位 表音频编码格式
2位 表示采样率
1位 采样的长度(0: 8bit/1: 16bit),压缩过的都1
1位 音频类型(0: Mono/1: Stereo)
视频Tag Data:第一个字节也是视频流信息(4bit表示帧类型、4bit表示编码类型),接着是视频流数据。
Script Data:是flv的第一个Tag,仅有一个,用于存放flv中存放媒体流的总体信息,包括时长、创建时间等,数据都是以:数据类型 [数据长度] 数据
格式出现
FLV在H.264的视频规格或是AAC的音源规格都达到功能极限,为了克服这个格式上的限制,F4V
于是诞生。F4V是基于ISO base media file format(MPEG-4 Part 12)定制的,支持视频类型为H.264,图片类型为GIF、PNG、JPEG,音频类型为AAC、MP3。由于MPEG-4 Part 14 (即MP4规范)也是对MPEG-4 Part 12的扩展,直接分析MP4的文件结构。
参考
FLV文件格式解析
FLV and F4V File Format Specification
mp4
mp4是一种符合MPEG-4 part 14规范的文件格式,文件扩展名为.mp4,以存储数字音频及数字视频为主。该标准是对MPEG-4 part 12的扩展。 1998年2月11日,国际标准组织(IS0)认可QuickTime(苹果支持的视频文件格式MOV)档案格式作为MPEG-4标准的基础。所以两种文件格式大致相同。
MP4的文件结构:
MP4文件中的所有数据都装在box(QuickTime中为atom)中,由若干个box组成。每个box有类型和长度,可以将理解为一个数据对象块。box中可以包含另外一个box,这种box称为container box。
一个MP4文件首先会有且只有一个“ftyp”类型的box,作为MP4格式的标志并包含关于文件的一些信息;
有且只有一个“moov”类型的box(Movie Box),包含了媒体的metadata信息;
MP4文件的媒体数据包含在多个“mdat”类型的box中。
在流媒体应用场景,不能预先保存关于整个流数据的metadata信息,且预先保存的metadata越少获取到数据越快。所以上面的文件组合方式就不太适用于流媒体。然而MPEG-4 标准允许以fragmented方式组合mdat box 以及其metadata (moof box),结构如下图所示:
参考
mp4文件格式解析
MPEG HomePage
QuickTime File Format Specification
MPEG-4 part 12
MPEG-4 part 14
TS
MPEG2-TS(Transport Stream“传输流”;又称MTS、TS)是一种传输和存储包含音效、视频与通信协议各种数据的标准格式,多用于数字电视广播系统。在传输中Packet是最基本单位,由 Header 和 Payload 组成,固定长度为188个字节,但是后面有可能会追加一些验证字节,所以packets的长度有可能变为192、204或者208Byte的长度。Packet结构如图所示
终端接收到的视频数据其实是一段段的码流,根据处理阶段可以分成以下几个类型:
TS流(Transport stream):传输流,将具有共同时间基准或独立时间基准的一个或多个PES组合而成的单一数据流,用于数据传输。
PES流(Packetized elementary stream):把基本码流ES分割成段,并加上相应头打包成形的打包基本码流。
ES流(Elementary stream):基本码流,不分段的音频、视频或其他信息的连续码流。
参考
解析TS格式
MPEG-2 Data Structures
其它视频容器格式还有:mkv、vob、 avi、asf、3gp、mov、rm、rvm、rmvb、vob 等
ps:目前我们项目中使用的ExoPlayer,支持的视频容器有
ps支持文件格式并不代表能播放视频。
因为Exoplayer采用的是硬解码方式,视频能否播放取决于当前系统是否支持该视频编码方式。
视频编码格式
通俗的讲就是音视频数据的压缩标准,主要作用于将视频像素数据(RGB,YUV等)、音频PCM数据压缩成视频码流、音频码流等。每种视频容器对兼容的编码格式有所限制,基于Matroska(开源的多媒体封装规范)实现的mkv容器,可以把多种不同编码的音视频封装到一个容器里。
MPEG系列
(由ISO[国际标准组织机构]下属的MPEG[运动图象专家组]开发 )视频编码方面主要是Mpeg1(vcd用的就是它)、Mpeg2(DVD使用)、Mpeg4(的DVDRIP使用的都是它的变种,如:divx,xvid等)、Mpeg4 AVC(正热门);
音频编码方面主要是MPEG Audio Layer 1/2、MPEG Audio Layer 3(大名鼎鼎的mp3)、MPEG-2 AAC 、MPEG-4 AAC等等。注意:DVD音频没有采用Mpeg的。
H.26X系列
(由ITU[国际电传视讯联盟]主导,侧重网络传输,注意:只是视频编码)
包括H.261、H.262、H.263、H.263+、H.263++、H.264、H.265
其它
RealNetworks公司的:RealVideo (rm、rvm、rmvb 容器支持的编码方式)
SMPTE 系统列:VC-1(基于Windows Media Video 9压缩技术的视频压缩标准、 VC-2 VC-3、 VC-5
开放媒体联盟:AV1(AOMedia Video 1,是一个开放,免专利的视频编码格式,由google 推出的 VP9延展、WebM视频容器支持的编码)
AVS(Audio Video coding Standard),即数字音视频编解码技术标准,为中国第二代信源编码标准
。
目前最新视频编码:AV1 \ H265\ AVS的对比:
AV1 :延展VP9(目前好像还是VP9使用的比较多),开放、免专利,但是硬件支持有限,需要纯软件实现编解码,现有技术有定的瓶颈。
H265: 旨在有限带宽下传输更高质量的网络视频,使在线播放1080p的全高清视频、4K和8K超高清视频成为可能;且硬件支持比较广泛。(缺点收费)
AVS 国产
更多详情信息参考:
视频编码
视频传输
首先得了解几个概念:
视频流:服务器在向用户传输视频文件时,不是一次将文件整体发送出去,将一连串的媒体数据压缩后,经过网络分段发送数据,使得数据包得以像流水一样发送,每一段都是独立可播的小片断。
下面将介绍视频传输相关的几个常用协议:
RTP/RTCP/RTSP
RTSP:实时流协议(Real Time Streaming Protocol)
应用层协议,RTSP提供了一个可供扩展的框架,它的意义在于使得实时流媒体数据的受控和点播变得可能,提供DESCRIBE,SETUP,PLAY,PAUSE,TEARDOWN,OPTIONS等方法,本身并不传输数据,基于面向无连接的传输协议UDP。
RTP:实时传输协议(Real-time Transport Protocol)
应用层网络传输协议,对流媒体数据进行封包并实现媒体流的实时传输,每一个RTP数据报都由头部(Header)和负载(Payload)两个部分组成,其中头部前12个字节的含义是固定的,而负载则可以是音频或者视频数据。与控制协议RTCP一起使用,而且它是创建在UDP协议上的。该协议直接传输视频流不再需要容器进行封装。
RTCP :实时传输控制协议(Real-time Transport Control Protocol)
和RTP一起协作将多媒体数据打包和发送。RTCP定期在流多媒体会话参加者之间传输控制数据。RTCP的主要功能是为RTP所提供的服务质量 提供反馈。
RTSP发起/终结流媒体、RTP传输流媒体数据 、RTCP对RTP进行控制、同步
其它的实时流传输协议还有:RTMP(Adobe公司提出基于TCP实时消息传输应用层协议)、MMS(微软提出的一种串流媒体传送协议,传递和接收Windows Media服务器中.asf文件)
HLS - HTTP live streaming
苹果公司实现的基于HTTP的流媒体传输协议,可实现直播和点播,相对于RTMP其它有较高的延迟。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。HTML5可以直接打开播放。
获取视频流程是如下图所示:
其中index文件是包含元数据的extended M3U (m3u8) 文件。如果视频具备有不同带宽切换则会有二级:主index文件中包含子index文件的下载地址,子index文件包含视频流 MPEG-TS 文件的下载地址。m3u8是个文本文件,其中标签定义可参考HTTP Live Streaming
点播VOD实现:首先下载index文件,再根据不同带宽获取子index文件地址,下载子index文件,再根据其中记录的视频流地址下载视频文件,进行解码播放。如果不切换码率,m3u8 文件只需要下载一次,且二级index中包含所有的ts文件下载地址。
Live 实现:实时生成 m3u8 和 ts 文件, 在点播放的基础上更新二级index文件。
其它基于HTTP实现的自适应串流技术有:
MPEG-DASH 是基于HTTP的自适应串流方案中的唯一国际标准,与具体编码无关,仅是作为一个标准
HDS(Adobe HTTP Dynamic Streaming,切片文件格式为 FLV/F4V/MP4,索引文件为f4m,同时支持直播和时移)
MSS(Microsoft Smooth Streaming,切片格式为 mp4,索引文件为ism/ismc)
目前我们项目中使用的ExoPlayer 提供了
DASH
(DashMediaSource)
SmoothStreaming (SsMediaSource),HLS
(HlsMediaSource)` and regular media files (ExtractorMediaSource)
实时传输协议 vs HTTP 自适应流
有些实时传输协议被许多公司防火墙拒绝,而HTTP可以作为一个普通的文件通过;流传输协议适合于大数据量、高可用性的流,如直播事件、长事件或大型文,可实时对流进行一些操作,如暂停、快进等
HTTP 自适应流 适合于较小的数据传输和交互,只能在分片文件流下载完成后,本地模拟暂停、快进操作,并非真正的实时流。
ps:我们现在播放预告片就是使用HTTP渐进式下载,依赖是HTTP渐进式下载技术。以MP4文件举例,只有在下载到媒体的元信息(Moov box)才能开始播放,Moov box中有媒体数据的索引表及开始位置,通过HTTP的range 字段获取我需要的媒体数据。如果Moov atom 放在最后,则需要下载全部文件内容才能开始播放。