流媒体技术|视频直播技术随笔

前言
昨天看到几个传统APP的功能菜单中也新增了直播功能,仔细观察现在手机上90%的应用增加了直播功能,感慨流媒体功能已遍布人们生活中的每个角落,所性今天就来仔细聊一聊我所了解的视频直播技术。当然视频直播领域博大精深,我了解的也只是冰山一角。
分类
纵观当今社会上使用的视频直播功能,从应用角度上进行分类,应该可以分为娱乐性直播和实时性直播,如:斗鱼、熊猫、抖音等属于娱乐性直播,如:视频会议、教育直播等属于实时性直播

  1. 娱乐性直播主要有音频,视频,聊天,打赏等功能。
  2. 实时性直播除了具有音频,视频,聊天,打赏功能外,一般还包括 文档共享、桌面共享、白板共享、批注等功能。
技术
音视频直播技术,我们最先想到的是音频技术和视频技术。 其实音频技术和视频技术它们的大体处理流程都是差不多的。一般都分为六大步: 采集、处理、编码、传输、解码、播放。在企业应用系统中对于实时性要求不高的产品可以使用RTMP, 对于实时性比较高的必须使用UDP,一般会选用RUDP(可靠性UDP),既可以保证传输速度,又可以防止丢包。
处理
1. 采集。 对于音频来说采集到的数据是PCM格式,视频数据采集的格式是YUV格式。
音频采集 音频采集和编码主要面临的挑战在于:延时敏感、卡顿敏感、噪声消除(Denoise)、回声消除(AEC)、静音检测(VAD)和各种混音算法等。
在音频采集阶段,参考的主要技术参数有 :
? 采样率(samplerate):采样就是把模拟信号数字化的过程,采样频率越高,记录这一段音频信号所用的数据量就越大,同时音频质量也就越高。
? 位宽:每一个采样点都需要用一个数值来表示大小,这个数值的数据类型大小可以是:4bit、8bit、16bit、32bit 等等,位数越多,表示得就越精细,声音质量自然就越好,而数据量也会成倍增大。我们在音频采样过程中常用的位宽是 8bit 或者 16bit。
? 声道数(channels):由于音频的采集和播放是可以叠加的,因此,可以同时从多个音频源采集声音,并分别输出到不同的扬声器,故声道数一般表示声音录制时的音源数量或回放时相应的扬声器数量。声道数为 1 和 2 分别称为单声道和双声道,是比较常见的声道参数。
? 音频帧(frame):音频跟视频很不一样,视频每一帧就是一张图像,而音频数据是流式的,本身没有明确的一帧帧的概念,在实际的应用中,为了音频算法处理/传输的方便,一般约定俗成取 2.5ms~60ms 为单位的数据量为一帧音频。这个时间被称之为“采样时间”,其长度没有特别的标准,它是根据编解码器和具体应用的需求来决定的。
根据以上定义,我们可以计算一下一帧音频帧的大小。假设某音频信号是采样率为 8kHz、双通道、位宽为 16bit,20ms 一帧,则一帧音频数据的大小为:
size = 8000 x 2 x 16bit x 0.02s = 5120 bit = 640 byte
图像采集 图像采集的图片结果组合成一组连续播放的动画,即构成视频中可肉眼观看的内容。图像的采集过程主要由摄像头等设备拍摄成 YUV 编码的原始数据,然后经过编码压缩成 H.264 等格式的数据分发出去。常见的视频封装格式有:MP4、3GP、AVI、MKV、WMV、MPG、VOB、FLV、SWF、MOV、RMVB 和 WebM 等。
图像由于其直观感受最强并且体积也比较大,构成了一个视频内容的主要部分。图像采集和编码面临的主要挑战在于:设备兼容性差、延时敏感、卡顿敏感以及各种对图像的处理操作如美颜和水印等。
在图像采集阶段,参考的主要技术参数有:
? 图像传输格式:通用影像传输格式(Common Intermediate Format)是视讯会议(video conference)中常使用的影像传输格式。
? 图像格式:通常采用 YUV 格式存储原始数据信息,其中包含用 8 位表示的黑白图像灰度值,以及可由 RGB 三种色彩组合成的彩色图像。
? 传输通道:正常情况下视频的拍摄只需 1 路通道,随着 VR 和 AR 技术的日渐成熟,为了拍摄一个完整的 360° 视频,可能需要通过不同角度拍摄,然后经过多通道传输后合成。
? 分辨率:随着设备屏幕尺寸的日益增多,视频采集过程中原始视频分辨率起着越来越重要的作用,后续处理环节中使用的所有视频分辨率的定义都以原始视频分辨率为基础。视频采集卡能支持的最大点阵反映了其分辨率的性能。
? 采样频率:采样频率反映了采集卡处理图像的速度和能力。在进行高度图像采集时,需要注意采集卡的采样频率是否满足要求。采样率越高,图像质量越高,同时保存这些图像信息的数据量也越大。
2. 处理 视频或者音频完成采集之后得到原始数据,为了增强一些现场效果或者加上一些额外的效果,我们一般会在将其编码压缩前进行处理,比如打上时间戳或者公司 Logo 的水印,祛斑美颜和声音混淆等处理。
如上图所示,处理环节中分为音频和视频处理,音频处理中具体包含混音、降噪和声音特效等处理,视频处理中包含美颜、水印、以及各种自定义滤镜等处理.
实际上,互动直播的主要技术难点在于:
技术难点 1)低延迟互动: 保证主播和互动观众之间能够实时互动,两者之间就像电话沟通,因此必须保证两者能在秒级以内听到对方的声音,看到对方的视频;
2)音画同步: 互动直播中对音画同步的需求和单向直播中类似,只不过互动直播中的延迟要求更高,必须保证在音视频秒级传输情况下的秒级同步。
3)音视频实时合成: 其他观众需要实时观看到对话结果,因此需要在客户端或者服务端将画面和声音实时合成,然后以低成本高品质的方式传输观众端。
在视频和电话会议领域,目前比较成熟的方案是使用思科或者 WebEx 的方案,但这些商用的方案一不开源,二比较封闭,三成本比较高。对于互动人数比较少的互动直播,目前市场上比较成熟的方案是使用基于 WebRTC 的实时通讯方案。
常见视频处理 1. 美颜 美颜的主要原理是通过「磨皮+美白」来达到整体美颜的效果。磨皮的技术术语是「去噪」,也即对图像中的噪点进行去除或者模糊化处理,常见的去噪算法有均值模糊、高斯模糊和中值滤波等。当然, 由于脸部的每个部位不尽相同,脸上的雀斑可能呈现出眼睛黑点的样子,对整张图像进行「去噪」处理的时候不需要将眼睛也去掉,因此这个环节中也涉及到人脸和皮肤检测技术。
2.水印 水印是图片和视频内容中常见的功能之一,它可用于简单是版权保护,或者进行广告设置。处于监管的需求,国家相关部门也规定视频直播过程中必须打上水印,同时直播的视频必须录制存储下来保存一定的时间,并在录制的视频上打上水印。
视频水印包括播放器水印和视频内嵌水印两种方式可供选择,对于播放器水印来说,如果没有有效的防盗措施,对于没有播放鉴权的推流,客户端拿到直播流之后可以在任何一个不带水印的播放器里面播放,因此也就失去了视频保护的能力。综合考虑云端录制对于水印的需求,我们一般会选择「视频内嵌水印」的方式打水印。
3. 编码。 ? 数据采集完成之后,需要对数据进行压缩编码。音视频使用的压缩技术称为有损压缩技术,常用的编码格式有speex, AAC, OPUS, G.711等。现在比较常用的是AAC,一是它音质比较好,二是RTMP对AAC支持的比较好。对于视频编码格式有H.264, H.265, VP8, VP9等,目常基本上都是使用H.264。原始视频数据存储空间大,一个 1080P 的 7 s 视频需要 817 MB。原始视频数据传输占用带宽大,10 Mbps 的带宽传输上述 7 s 视频需要 11 分钟
而经过 H.264 编码压缩之后,视频大小只有 708 k ,10 Mbps 的带宽仅仅需要 500 ms ,可以满足实时传输的需求,所以从视频采集传感器采集来的原始视频势必要经过视频编码。
软编码:使用CPU进行编码
硬编码:使用非CPU进行编码,如显卡GPU、专用的DSP、FPGA、ASIC芯片等
基本原理 原始视频编码核心思想就是去除冗余信息:
? 空间冗余:图像相邻像素之间有较强的相关性
? 时间冗余:视频序列的相邻图像之间内容相似
? 编码冗余:不同像素值出现的概率不同
? 视觉冗余:人的视觉系统对某些细节不敏感
? 知识冗余:规律性的结构可由先验知识和背景知识得到
编码器 1) H.264 H.264/AVC是一种视频标准。与旧标准相比,它能够在更低带宽下提供优质视频(换言之,只有 MPEG-2,H.263 或 MPEG-4 第 2 部分的一半带宽或更少),也不增加太多设计复杂度使得无法实现或实现成本过高。另一目的是提供足够的灵活性以在各种应用、网络及系统中使用,包括高、低带宽,高、低视频分辨率,广播,DVD 存储,RTP/IP 网络,以及 ITU-T 多媒体电话系统。
2) H.265 高效率视频编码(High Efficiency Video Coding,简称 HEVC)是一种视频压缩标准,被视为是 ITU-T H.264/MPEG-4 AVC 标准的继任者。2004 年开始由 ISO/IEC Moving Picture Experts Group(MPEG)和 ITU-T Video Coding Experts Group(VCEG)作为 ISO/IEC 23008-2 MPEG-H Part 2 或称作 ITU-T H.265 开始制定。第一版的 HEVC/H.265 视频压缩标准在 2013 年 4 月 13 日被接受为国际电信联盟(ITU-T)的正式标准。HEVC 被认为不仅提升视频质量,同时也能达到 H.264/MPEG-4 AVC 两倍之压缩率(等同于同样画面质量下比特率减少了 50%),可支持 4K 分辨率甚至到超高清电视(UHDTV),最高分辨率可达到 8192×4320(8K 分辨率)。
3) VP8 VP8 是一个开放的视频压缩格式,最早由 On2 Technologies 开发,随后由 Google 发布。同时 Google 也发布了 VP8 编码的类库:libvpx,以 BSD 授权条款的方式发行,随后也附加了专利使用权。而在经过一些争论之后,最终 VP8 的授权确认为一个开放源代码授权。
目前支持 VP8 的网页浏览器有 Opera、Firefox 和 Chrome。
4) VP9 VP9 的开发从 2011 年第三季开始,目标是在同画质下,比 VP8 编码减少 50% 的文件大小,另一个目标则是要在编码效率上超越 HEVC 编码。
5) FFmpeg 谈到视频编码相关内容就不得不提一个伟大的软件包 - FFmpeg。
FFmpeg 是一个自由软件,可以运行音频和视频多种格式的录影、转换、流功能,包含了 libavcodec -这是一个用于多个项目中音频和视频的解码器库,以及 libavformat -一个音频与视频格式转换库。
FFmpeg 录屏
ffmpeg -f avfoundation -list_devices true -i “”
FFmpeg 视频转换成 gif
ffmpeg -ss 10 -t 10 -i tutu.mp4 -s 80x60 tutu.gif
##-ss 指从 10s 开始转码,-t 指转换 10s 的视频 -s
FFmpeg 录制屏幕并直播
推送屏幕录制到 nignx-rtmp
ffmpeg -y -loglevel warning -f avfoundation -i 2 -r 30 -s 480x320 -threads 2 -vcodec libx264 -f flv rtmp://127.0.0.1/live/test
用 ffplay 播放
ffplay rtmp://127.0.0.1/live/test
封装 AVI 它的英文全称为 Audio Video Interleaved ,即音频视频交错格式。它于 1992 年被 Microsoft 公司推出。这种视频格式的优点是图像质量好。由于无损 AVI 可以保存 alpha 通道,经常被我们使用。缺点太多,体积过于庞大,而且更加糟糕的是压缩标准不统一,最普遍的现象就是高版本 Windows 媒体播放器播放不了采用早期编码编辑的 AVI 格式视频,而低版本 Windows 媒体播放器又播放不了采用最新编码编辑的 AVI 格式视频,所以我们在进行一些 AVI 格式的视频播放时常会出现由于视频编码问题而造成的视频不能播放或即使能够播放,但存在不能调节播放进度和播放时只有声音没有图像等一些莫名其妙的问题。
DV-AVI 后缀为 .avi)
DV 的英文全称是 Digital Video Format ,是由索尼、松下、JVC 等多家厂商联合提出的一种家用数字视频格式。数字摄像机就是使用这种格式记录视频数据的。它可以通过电脑的 IEEE 1394 端口传输视频数据到电脑,也可以将电脑中编辑好的的视频数据回录到数码摄像机中。这种视频格式的文件扩展名也是 AVI。电视台采用录像带记录模拟信号,通过 EDIUS 由IEEE 1394端口采集卡从录像带中采集出来的视频就是这种格式。
MOV QuickTime File Format 格式(后缀为 .mov): 美国 Apple 公司开发的一种视频格式,默认的播放器是苹果的 QuickTime。具有较高的压缩比率和较完美的视频清晰度等特点,并可以保存 alpha 通道。
MPEG (文件后缀可以是 .mpg .mpeg .mpe .dat .vob .asf .3gp .mp4等) : 它的英文全称为 Moving Picture Experts Group,即运动图像专家组格式,该专家组建于 1988 年,专门负责为 CD 建立视频和音频标准,而成员都是为视频、音频及系统领域的技术专家。MPEG 文件格式是运动图像压缩算法的国际标准。MPEG 格式目前有三个压缩标准,分别是 MPEG-1、MPEG-2、和 MPEG-4 。MPEG-1、MPEG-2 目前已经使用较少,着重介绍 MPEG-4,其制定于 1998 年,MPEG-4 是为了播放流式媒体的高质量视频而专门设计的,以求使用最少的数据获得最佳的图像质量。目前 MPEG-4 最有吸引力的地方在于它能够保存接近于 DVD 画质的小体积视频文件。
WMV WMV 格式(后缀为.wmv .asf): 它的英文全称为 Windows Media Video,也是微软推出的一种采用独立编码方式并且可以直接在网上实时观看视频节目的文件压缩格式。WMV 格式的主要优点包括:本地或网络回放,丰富的流间关系以及扩展性等。WMV 格式需要在网站上播放,需要安装 Windows Media Player( 简称 WMP),很不方便,现在已经几乎没有网站采用了。
RMVB Real Video 格式(后缀为 .rm .rmvb): Real Networks 公司所制定的音频视频压缩规范称为Real Media。用户可以使用 RealPlayer 根据不同的网络传输速率制定出不同的压缩比率,从而实现在低速率的网络上进行影像数据实时传送和播放。RMVB 格式:这是一种由 RM 视频格式升级延伸出的新视频格式,当然性能上有很大的提升。RMVB 视频也是有着较明显的优势,一部大小为 700 MB 左右的 DVD 影片,如果将其转录成同样品质的 RMVB 格式,其个头最多也就 400 MB 左右。大家可能注意到了,以前在网络上下载电影和视频的时候,经常接触到 RMVB 格式,但是随着时代的发展这种格式被越来越多的更优秀的格式替代,著名的人人影视字幕组在 2013 年已经宣布不再压制 RMVB 格式视频。
FLV Flash Video 格式(后缀为 .flv):由 Adobe Flash 延伸出来的的一种流行网络视频封装格式。随着视频网站的丰富,这个格式已经非常普及。
MKV Matroska 格式(后缀为 .mkv):是一种新的多媒体封装格式,这个封装格式可把多种不同编码的视频及 16 条或以上不同格式的音频和语言不同的字幕封装到一个 Matroska Media 档内。它也是其中一种开放源代码的多媒体封装格式。Matroska 同时还可以提供非常好的交互功能,而且比 MPEG 的方便、强大。
MPEG2-TS MPEG2-TS 格式 (后缀为 .ts)(Transport Stream「传输流」;又称 MTS、TS)是一种传输和存储包含音效、视频与通信协议各种数据的标准格式,用于数字电视广播系统,如 DVB、ATSC、IPTV 等等。MPEG2-TS 定义于 MPEG-2 第一部分,系统(即原来之 ISO/IEC 标准 13818-1 或 ITU-T Rec. H.222.0)。Media Player Classic、VLC 多媒体播放器等软件可以直接播放 MPEG-TS 文件。
目前,我们在流媒体传输,尤其是直播中主要采用的就是 FLV 和 MPEG2-TS 格式,分别用于 RTMP/HTTP-FLV 和 HLS 协议。
4. 传输。 数据压缩完之后通过网络传输。对于娱乐性直播平台一般都使用RTMP协议进行数据的传输,RTMP是在TCP之上的网络协议。对于实时互动直播则必须使用UDP进行数据传输。 UDP数据的传输速度上比TCP有天然的优势。RTMP是Adobe公司发明一种传输协议,目前所有的技术架构网络对RTMP的支持是非常好的,但它的问题就是延迟性比较大。使用RTMP造成延迟主要有两个方面原因,一是RTMP网络协议由于是基于TCP协议的,本身延迟就比UDP大,另一方面是技术架构造成的。技术架构首先从顶级结点接收数据,然后以树状形式分发到端结点,这个过程链条比较长,导致整体的延迟非常大。而且延迟时间不固定,有可能某段时间延迟3?5秒,也有可能过一段时间延迟就达到了30秒这都是有可能的。
1. RTP RTP全名是Real-time Transport Protocol(实时传输协议)。它是IETF提出的一个标准, RTP用来为IP网上的语音、图像、传真等多种需要实时传输的多媒体数据提供端到端的实时传输服务。RTP为Internet上端到端的实时传输提供时间信息和流同步,但并不保证服务质量,服务质量由RTCP来提供。RTP用于在单播或多播网络中传送实时数据。
它们典型的应用场合有如下几个。
简单的多播音频会议。语音通信通过一个多播地址和一对端口来实现。一个用于音频数据(RTP),另一个用于控制包(RTCP)。
音频和视频会议。如果在一次会议中同时使用了音频和视频会议,这两种媒体将分别在不同的RTP会话中传送,每一个会话使用不同的传输地址(IP地址+端口)。如果一个用户同时使用了两个会话,则每个会话对应的RTCP包都使用规范化名字CNAME(Canonical Name)。与会者可以根据RTCP包中的CNAME来获取相关联的音频和视频,然后根据RTCP包中的计时信息(Network time protocol)来实现音频和视频的同步。
翻译器和混合器。翻译器和混合器都是RTP级的中继系统。翻译器用在通过IP多播不能直接到达的用户区,例如发送者和接收者之间存在防火墙。当与会者能接收的音频编码格式不一样,比如有一个与会者通过一条低速链路接入到高速会议,这时就要使用混合器。在进入音频数据格式需要变化的网络前,混合器将来自一个源或多个源的音频包进行重构,并把重构后的多个音频合并,采用另一种音频编码进行编码后,再转发这个新的RTP包。从一个混合器出来的所有数据包要用混合器作为它们的同步源(SSRC,见RTP的封装)来识别,可以通过贡献源列表(CSRC表,见RTP的封装)可以确认谈话者。
2. RTSP RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学、网景和RealNetworks公司提交的IETF RFC标准。该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。HTTP与RTSP相比,HTTP请求由客户机发出,服务器作出响应; 使用RTSP时,客户机和服务器都可以发出请求,即RTSP可以是双向的。RTSP是用来控制声音或影像的多媒体串流协议,并允许同时多个串流需求控制,传输时所用的网络通讯协定并不在其定义的范围内,服务器端可以自行选择使用TCP或UDP来传送串流内容,它的语法和运作跟HTTP 1.1类似,但并不特别强调时间同步,所以比较能容忍网络延迟。而前面提到的允许同时多个串流需求控制(Multicast),除了可以降低服务器端的网络用量,更进而支持多方视讯会议(Video Conference)。因为与HTTP1.1的运作方式相似,所以代理服务器〈Proxy〉的快取功能〈Cache〉也同样适用于RTSP,并因RTSP具有重新导向功能,可视实际负载情况来转换提供服务的服务器,以避免过大的负载集中于同一服务器而造成延迟。
3. RTCP RTCP:RTP 控制协议 (RTCP:RTP Control Protocol)
RTCP 提供数据分发质量反馈信息,这是 RTP 作为传输协议的部分功能并且它涉及到了其它传输协议的流控制和拥塞控制。
RTCP 为 RTP 源携带一个持久性传输层标识符,称为规范名或 CNAME。由于一发现冲突或程序重启时, SSRC 标识符会随之改变,所以接收方需要 CNAME 来跟踪每一个参与者。同时接收方还要求 CNAME 能够与一组相关 RTP 会话中来自于给定参与者的多重数据流相关联,例如同步视频和音频。
上述前两个功能要求所有的参与者都要发送 RTCP 包,因此必须控制速率以便 RTP 按比例增加大量的参与者。通过每一个参与者发送各自的控制包给其它所有参与者,每一个参与者能够独立观察到参与者数量,该数量可用来计算控制包的发送速率。
OPTIONAL 功能用于传送最少会话控制信息,例如在用户界面显示参与者标识。这对于"松散受控"会话(在没有成员控制或阐述协商的情况下,参与者可以加入或退出该会话)是非常有用的。
上述功能 1 - 3 适用于所有环境,尤其是 IP 组播环境。RTP 应用程序设计者应该避免设计只能工作于单播模式并且不能增加到大量数量的机制。在某些情况下如单向链接中,不可能有来自接收方的反馈,所以 RTCP 的传输就可能由发送方和接收方分别独立控制。
4. RTMP RTMP 是 Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。该协议基于 TCP,是一个协议族,包括 RTMP 基本协议及 RTMPT/RTMPS/RTMPE 等多种变种。RTMP 是一种设计用来进行实时数据通信的网络协议,主要用来在 Flash/AIR 平台和支持 RTMP 协议的流媒体/交互服务器之间进行音视频和数据通信。支持该协议的软件包括 Adobe Media Server/Ultrant Media Server/red5 等。主要广泛应用于低延时直播,也是编码器和服务器对接的实际标准协议,在PC(Flash)上有最佳观看体验和最佳稳定性。
优点
? CDN 支持良好,主流的 CDN 厂商都支持
? 协议简单,在各平台上实现容易
缺点
? 基于 TCP ,传输成本高,在弱网环境丢包率高的情况下问题显著
? 不支持浏览器推送
? Adobe 私有协议,Adobe 已经不再更新
5. WebRTC WebRTC,名称源自网页即时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的 API。它于 2011 年 6 月 1 日开源并在 Google、Mozilla、Opera 支持下被纳入万维网联盟的 W3C 推荐标准。
优点
? W3C 标准,主流浏览器支持程度高
? Google 在背后支撑,并在各平台有参考实现
? 底层基于 SRTP 和 UDP,弱网情况优化空间大
? 可以实现点对点通信,通信双方延时低
缺点
? ICE,STUN,TURN 传统 CDN 没有类似的服务提供
6. RUDP 可靠用户数据报协议(RUDP)是一种基于可靠数据协议,用于传输 IP 网络间的电话信号。它允许独立配置每个连接属性,这样在不同的平台可以同时实施不同传输需求下的协议。
7. HLS HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议。是苹果公司QuickTime X和iPhone软件系统的一部分。 它的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的extended M3U (m3u8)playlist文件,用于寻找可用的媒体流。HLS只请求基本的HTTP报文,与实时传输协议(RTP)不同,HLS可以穿过任何允许HTTP数据通过的防火墙或者代理服务器。它也很容易使用内容分发网络来传输媒体流。
5. 解码 就是将对编码数据做反向操作。如音频是AAC编码,则它再解为PCM格式数据。视频是H.264再解为YUV数据。
6. 播放。 【流媒体技术|视频直播技术随笔】对于音频直接将PCM数据放入到音频驱动缓冲驱,驱动程序就会将音频播放出来。对于视频一般会通过 opengl利用 GPU进行图像渲染。

    推荐阅读