直播技术协议介绍

2019-12-03 16:32:13 浏览数 (1)

本文作者:IMWeb eden 原文出处:IMWeb社区 未经同意,禁止转载

目前web前端采用的直播技术一般分为以下几类:rtp/rtcp、rtmp、http-flv、hls。下面介绍不同协议

RTP/RTCP

RTP 全称Real-Time Transport Protocol,用于媒体数据传输,RTCP用于配合RTP传输一些控制信息。RTP协议默认是基于UDP协议传输数据的, 延迟低可以做到毫秒级别。RTP协议在视频监控、视频会议、IP电话上有广泛应用。

在web平台通过webRTC通过RTP/RTCP协议实现媒体实时通信,webRTC是google开源的一项技术,并推广为w3c标准的前端的媒体数据传输方案,使得web简单的支持端到端音视频通信,webRTC包括是音视频采集,编码,传输一套整体方案。对于web开发者媒体采集、编码和传输基本透明实现,只需要调用部分API即可实现端到端的通信,直播领域一般浏览器对端都是一台服务器。

目前主流浏览器最新版本都基本支持,但是不同的平台和浏览器支持情况不尽相同,所以一般都会有后面几种降级方案。

rtmp

RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,是Adobe公司的私有流媒体传输协议,一般传输的音视频格式是flv、f4v

web上通过flash播放器播放,pc端支持基本大多数浏览器都支持,但是移动端几乎都不支持,不过flash由于安全和性能问题将会逐渐被淘汰,并且主流浏览器默认都禁用flash播放器。

受协议本身建连耗时(RTMP握手,TCP握手),网络抖动的丢包重传耗时,编码器关键帧距离设置、播放器缓冲区大小设置这几方面因素影响,延迟能做到2s-5s,

http-flv

flv是一种音视频视频封装格式,全称是Flash Video,是一种流媒体格式,可以通过flash播放器播放,除了通过flash播放,在h5通知js操作媒体数据,完全不使用falsh 来播放flv格式视频,业界有开源的项目flv.js实现了通过h5播放flv视频的库

该协议同样可以做到秒级延迟 和rtmp协议不相上下,并且使用http请求获取数据,减少了握手损失(应用层协议握手)

同样http传输层协议是tcp,和rtmp一样都会遇到网络状况不好引起重传导致卡顿。

关于flv音视频格式

总体上讲flv 文件分为两部分,包括文件头(file header)和文件体(file body),文件体是由一系列tag组成,每个tag可以是不同类型的数据包括:音频、视频、描述数据。文件头包括了标示信息,是否有音视频数据等信息

不同的tag包括的信息不同:

  • 音频tag: 头部包括了音频编码信息、采样频率、精度、音频类型,音频数据
  • 视频tag: 头部包括了帧类型、视频编码类型,视频数据
  • Script tag 包含了flv视频和音频的元数据信息,诸如:duration,width,height,videodatarate,framerate等信息

文件结构如下:

关于flv.js

flv.js是B站的开源项目。它解析flv文件后给原生HTML5 Video标签播放音视频数据,使得浏览器在不使用Flash的情况下播放FLV文件。优点:性能较好,支持大多数主流浏览器(ios目前不支持),延迟低。

关于Media Source Extensions,该API支持js直接操作媒体数据,给video和audio标签动态构建媒体数据,这就是的我们可以通过http、WebSocket获取媒体数据,然后动态添加到video、audio标签播放。

hls

全称HTTP Live Streaming, 是苹果提出了流媒体播放协议。

工作原理是把流分成一个个小的基于HTTP的TS文件,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的extended M3U (m3u8) playlist文件,包含了可下载的TS文件列表或者二级m3u8文件,以及控制信息。

还可以通过二级.m3u8文件实现多码率控制,不同网络状况可以选择不同码率的视频源。

由于苹果公司的影响力hls在移动端的支持情况较好,但是延迟较高5s-20s级别的延迟,对于直播影响是比较大的。当然可以缩短.m3u8列表的长度和单个TS文件的大小来降低延迟, 极致来说可以缩减列表长度为1,1秒内容的m3u8文件,但是极易受网络波动影响造成卡顿。

关于ts文件

ts文件是传输流文件,视频编码主要格式h264/mpeg4,音频ACC/MP3

ts文件分为三层:ts层Transport Stream、pes层 Packet Elemental Stream、es层 Elementary Stream。

es层就是音视频数据 pes层是在音视频数据上加了时间戳等对数据帧的说明信息 ts层就是在pes层加入数据流的识别和传输必须的信息

由于基于http因此容易穿透防火墙或代理服务器一般来说防火墙都不会禁用http协议,底层传输协议tcp。

为何基于RTP/UDP的协议做到延迟最优?

UDP:单个数据报,不用建立连接,简单,不可靠,会丢包,会乱序

TCP:流式,需要建立连接,复杂,可靠 ,有序

在实时音视频场景,不需要可靠连接,更多的是需要实时,因此不需要重传机制,网络抖动丢失部分数据完全不重要,总体的连贯性、实时性得到保证。而TCP是可靠连接,会有重传机制,如果网络拥塞回导致数据不可达会重传,后面的数据就需要排队,增加延迟。

0 人点赞