写点什么

音视频 & 流媒体的原理以及基础入门知识

  • 2022 年 4 月 09 日
  • 本文字数:9575 字

    阅读完需:约 31 分钟

音视频&流媒体的原理以及基础入门知识

流媒体背景

当下,音视频、流媒体已经无处不在,直播已经火了几年,在后续的时间里面,人们聊天已经不仅仅满足与文字、而是更多的在于“类面对面”交流,能够实时感知对方的表情、动作。为此,有必要跟紧时代潮流,好好梳理梳理流媒体这门功课。

流媒体是什么?流媒体就是指采用流式传输技术在网络上连续实时播放的媒体格式,如音频、视频或多媒体文件。流媒体技术也称流式媒体技术。那么音视频就是流媒体的核心。


音视频常见术语定义规范

音视频组成

一个完整的视频文件,包括音频、视频和基础元信息,我们常见的视频文件如 mp4、mov、flv、avi、rmvb 等视频文件,就是一个容器的封装,里面包含了音频和视频两部分,并且都是通过一些特定的编码算法,进行编码压缩过后的。

H264、Xvid 等就是视频编码格式,MP3、AAC 等就是音频编码格式。例如:将一个 Xvid 视频编码文件和一个 MP3 音频编码文件按 AVI 封装标准封装以后,就得到一个 AVI 后缀的视频文件。

因此,视频转换需要设置的本质就是

  • 设置需要的视频编码

  • 设置需要的音频编码

  • 选择需要的容器封装

一个完整的视频转换设置都至少包括了上面 3 个步骤。

编码格式

音频编码格式

音频编码格式有如下

  • AAC

  • AMR

  • PCM

  • ogg(ogg vorbis 音频)

  • AC3(DVD 专用音频编码)

  • DTS(DVD 专用音频编码)

  • APE(monkey’s 音频)

  • AU(sun 格式)

  • WMA


音频编码方案之间音质比较(AAC,MP3,WMA 等)结果: AAC+ > MP3PRO > AAC> RealAudio > WMA > MP3

目前最常见的音频格式有 Mp3、AC-3、ACC,MP3 最广泛的支持最多,AC-3 是杜比公司的技术,ACC 是 MPEG-4 中的音频标准,ACC 是目前比较先进和具有优势的技术。对应入门,知道有这几种最常见的音频格式足以。

视频编码格式

视频编码标准有两大系统: MPEG 和 ITU-T,国际上制定视频编解码技术的组织有两个,一个是“国际电联(ITU-T)”,它制定的标准有 H.261、H.263、H.263+、H.264 等,另一个是“国际标准化组织(ISO)”它制定的标准有 MPEG-1、MPEG-2、MPEG-4 等。

常见编码格式有:

  • Xvid(MPEG4)

  • H264 (目前最常用编码格式)

  • H263

  • MPEG1,MPEG2

  • AC-1

  • RM,RMVB

  • H.265(目前用的不够多)

目前最常见的视频编码方式的大致性能排序基本是: MPEG-1/-2 < WMV/7/8 < RM/RMVB < Xvid/Divx < AVC/H.264(由低到高,可能不完全准确)。

在 H.265 出来之前,H264 是压缩率最高的视频压缩格式,其优势有:

  • 低码率(Low Bit Rate):和 MPEG2 和 MPEG4 ASP 等压缩技术相比,在同等图像质量下,采用 H.264 技术压缩后的数据量只有 MPEG2 的 1/8,MPEG4 的 1/3。

  • 高质量的图象 :H.264 能提供连续、流畅的高质量图象(DVD 质量)。

  • 容错能力强 :H.264 提供了解决在不稳定网络环境下容易发生的丢包等错误的必要工具。

  • 网络适应性强 :H.264 提供了网络抽象层(Network Abstraction Layer),使得 H.264 的文件能容易地在不同网络上传输(例如互联网,CDMA,GPRS,WCDMA,CDMA2000 等)。

H.264 最大的优势是具有很高的数据压缩比率,在同等图像质量的条件下,H.264 的压缩比是 MPEG-2 的 2 倍以上,是 MPEG-4 的 1.5~2 倍。举个例子,原始文件的大小如果为 88GB,采用 MPEG-2 压缩标准压缩后变成 3.5GB,压缩比为 25∶1,而采用 H.264 压缩标准压缩后变为 879MB,从 88GB 到 879MB,H.264 的压缩比达到惊人的 102∶1。低码率(Low Bit Rate)对 H.264 的高的压缩比起到了重要的作用,和 MPEG-2 和 MPEG-4 ASP 等压缩技术相比,H.264 压缩技术将大大节省用户的下载时间和数据流量收费。尤其值得一提的是,H.264 在具有高压缩比的同时还拥有高质量流畅的图像,正因为如此,经过 H.264 压缩的视频数据,在网络传输过程中所需要的带宽更少,也更加经济。

目前这些常见的视频编码格式实际上都属于有损压缩,包括 H264 和 H265,也是有损编码,有损编码才能在质量得以保证的前提下得到更高的压缩率和更小体积

存储封装格式

目前市面常见的存储封装格式有如下:

  • AVI (.avi)

  • ASF(.asf)

  • WMV (.wmv)

  • QuickTime ( .mov)

  • MPEG (.mpg / .mpeg)

  • MP4 (.mp4)

  • m2ts (.m2ts / .mts )

  • Matroska (.mkv / .mks / .mka )

  • RM ( .rm / .rmvb)

  • TS/PS

AVI : 可用 MPEG-2, DIVX, XVID, WMV3, WMV4, AC-1, H.264

WMV : 可用 WMV3, WMV4, AC-1

RM/RMVB : 可用 RV40, RV50, RV60, RM8, RM9, RM10

MOV : 可用 MPEG-2, MPEG4-ASP(XVID), H.264

MKV : 所有

视频码率、帧率、分辨率


码率

码流(Data Rate)是指视频文件在单位时间内使用的数据流量,也叫码率或码流率,通俗一点的理解就是取样率,是视频编码中画面质量控制中最重要的部分,一般我们用的单位是 kb/s 或者 Mb/s。一般来说同样分辨率下,视频文件的码流越大,压缩比就越小,画面质量就越高。码流越大,说明单位时间内采样率越大,数据流,精度就越高,处理出来的文件就越接近原始文件,图像质量越好,画质越清晰,要求播放设备的解码能力也越高。

当然,码率越大,文件体积也越大,其计算公式是文件体积=时间 X 码率/8。例如,网络上常见的一部 90 分钟 1Mbps 码率的 720P RMVB 文件,其体积就=5400 秒×1Mbps/8=675MB。

通常来说,一个视频文件包括了画面(视频)及声音(音频),例如一个 RMVB 的视频文件,里面包含了视频信息和音频信息,音频及视频都有各自不同的采样方式和比特率,也就是说,同一个视频文件音频和视频的比特率并不是一样的。而我们所说的一个视频文件码流率大小,一般是指视频文件中音频及视频信息码流率的总和。


帧率

帧率也称为 FPS(Frames Per Second)- - - 帧/秒。是指每秒钟刷新的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次。越高的帧速率可以得到更流畅、更逼真的动画。每秒钟帧数(FPS)越多,所显示的动作就会越流畅。

关于帧率有如下几个基础数据:

  • 帧率越高,cpu 消耗就高

  • 秀场视频直播,一般帧率 20fps

  • 普通视频直播,一般帧率 15fps


分辨率

视频分辨率是指视频成像产品所成图像的大小或尺寸。常见的视像分辨率有 352×288,176×144,640×480,1024×768。在成像的两组数字中,前者为图片长度,后者为图片的宽度,两者相乘得出的是图片的像素,长宽比一般为 4:3.

480P : 640 x 480 个像素点

720P : 1280 x 720 个像素点

1080P : 1920 x 1080 个像素点

然后还需要关注每个像素点的存储格式,每个像素点占用的字节大小。

图像存储格式 yuv

一幅彩色图像的基本要素是什么?

1、宽:一行有多少个像素点。

2、高:一列有多少个像素点,一帧有多少行

3、YUV 格式还是 RGB 格式?

4、一行多少个字节??

5、图像大小是多少?

6、图像的分辨率多少?

说白了,一幅图像包括的基本东西就是二进制数据,其容量大小实质即为二进制数据的多少。一幅 1920x1080 像素的 YUV422 的图像,大小是 1920X1080X2=4147200(十进制),也就是 3.95M 大小。这个大小跟多少个像素点和数据的存储格式有关。

YUV 与像素的关系:

YUV 格式,与我们熟知的 RGB 类似,YUV 也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有 UV 信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV 不像 RGB 那样要求三个独立的视频信号同时传输,所以用 YUV 方式传送占用极少的频宽。

YUV 格式有两大类:planar 和 packed。对于 planar 的 YUV 格式,先连续存储所有像素点的 Y,紧接着存储所有像素点的 U,随后是所有像素点的 V。对于 packed 的 YUV 格式,每个像素点的 Y,U,V 是连续交替存储的。

YUV,分为三个分量,“Y”表示明亮度(Luminance 或 Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance 或 Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

YUV 是利用一个亮度(Y)、两个色差(U,V)来代替传统的 RGB 三原色来压缩图像。传统的 RGB 三原色使用红绿蓝三原色表示一个像素,每种原色占用一个字节(8bit),因此一个像素用 RGB 表示则需要 8 * 3=24bit。

如果使用 YUV 表示这个像素,假设 YUV 的采样率为:4:2:0,即每一个像素对于亮度 Y 的采样频率为 1,对于色差 U 和 V,则是每相邻的两个像素各取一个 U 和 V。对于单个的像素来说,色差 U 和 V 的采样频率为亮度的一半。如有三个相邻的像素,如果用 RGB 三原色表示,则共需要占用:8 * 3 * 3 = 72bits;如果采用 YUV(4:2:0)表示,则只需要占用:8 * 3(Y)+ 8* 3 * 0.5(U)+ 8 * 3 * 0.5(V)= 36bits。只需原来一半的空间,就可以表示原来的图像,数据率压缩了一倍,而图像的效果基本没发生变化。

那么,具体 yuv 格式所占用的字节数要怎么算呢 ?

YUV 图像格式的内存大小

  • 4:4:4 表示色度值(UV)没有减少采样。即 Y,U,V 各占一个字节,加上 Alpha 通道一个字节,总共占 4 字节.这个格式其实就是 24bpp 的 RGB 格式了。

  • 4:2:2 表示 UV 分量采样减半,比如第一个像素采样 Y,U,第二个像素采样 Y,V,依次类推,这样每个点占用 2 个字节.二个像素组成一个宏像素.

  • 需要占用的内存:w * h * 2

  • 4:2:0 这种采样并不意味着只有 Y,Cb 而没有 Cr 分量,这里的 0 说的 U,V 分量隔行才采样一次。比如第一行采样 4:2:0 ,第二行采样 4:0:2 ,依次类推...在这种采样方式下,每一个像素占用 16bits 或 10bits 空间.

  • 内存则是:yyyyyyyyuuvv

  • 需要占用的内存:w * h * 3 / 2

  • 4:1:1 可以参考 4:2:2 分量,是进一步压缩,每隔四个点才采一次 U 和 V 分量。一般是第 1 点采 Y,U,第 2 点采 Y,第 3 点采 YV,第 4 点采 Y,依次类推。

帧率、码率与分辨率之间关系

码率和帧率没有半毛钱关系

码率关系着带宽、文件体积

帧率关系着画面流畅度和 cpu 消耗

分辨率关系着图像尺寸和清晰度


一个视频文件的大小为 5.86M,播放时长为 3 分 7 秒

  • 1,该文件对应的码率就是

  • 5.86 * 1024 * 1024 * 8 / (3 * 60 + 7) = 262872.95657754bps

  • 2,10M 独享带宽能支撑的同时在线人数

  • 10 * 1024 * 1024 / 262872.95657754 = 39.889078498294

  • 3, 支撑 1000 人同时在线的系统最少需要的带宽数为

  • 262872 * 1000 / (1024 * 1024) = 250.69427490234M


10min,流量消耗 41587KB

41587/10*60 = 69KB/s = 69 * 8 Kb/s = 532Kb/s

那么得到码率就是 532Kb/s


输出文件大小公式

一个音频编码率为 128Kbps,视频编码率为 800Kbps 的文件,其总编码率为 928Kbps,意思是经过编码后的数据每秒钟需要用 928K 比特来表示。

文件大小公式:

(音频编码率(KBit 为单位)/8 + 视频编码率(KBit 为单位)/8)× 影片总长度(秒为单位)= 文件大小(MB 为单位)


一帧图像大小

一帧图像原始大小 = 宽像素 * 长像素 ,当然要考虑数据格式,因为数据格式不一样,大小写也不相同,一般数据采用 rgb、yuv 格式,如 rgb32、yuv420、yuv422 等。最常用的应当属于 yuv420。 因此,计算公式为:

文件的字节数 = 图像分辨率 * 图像量化位数/8

图像分辨率 = X 方向的像素数 * Y 方向的像素数

图像量化数 = 二进制颜色位数

  • RGB24 每帧的大小是

size=width×heigth×3 Bit

  • RGB32 每帧的大小是

size=width×heigth×4

  • YUV420 每帧的大小是

size=width×heigth×1.5 Bit

举例说明,对于一个 1024*768 的图像实际的 YUV422 数据流大小就为:1024 *768 * 2 = 1572864bit

音频采样率、位数

1、声道数:声道数是音频传输的重要指标,现在主要有单声道和双声道之分。双声道又称为立体声,在硬件中要占两条线路,音质、音色好, 但立体声数字化后所占空间比单声道多一倍。

2、量化位数: 量化位是对模拟音频信号的幅度轴进行数字化,它决定了模拟信号数字化以后的动态范围。由于计算机按字节运算,一般的量化位数为 8 位和 16 位。量化位越高,信号的动态范围越大,数字化后的音频信号就越可能接近原始信号,但所需要的存储空间也越大。

3、采样率:也称为采样速度或者采样频率,定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。采样率是指将模拟信号转换成数字信号时的采样频率,也就是单位时间内采样多少点。一个采样点数据有多少个比特。比特率是指每秒传送的比特(bit)数。单位为 bps(Bit Per Second),比特率越高,传送的数据越大,音质越好.

采样率的选择应该遵循奈奎斯特(Harry Nyquist)采样理论( 如果对某一模拟信号进行采样,则采样后可还原的最高信号频率只有采样频率的一半,或者说只要采样频率高于输入信号最高频率的两倍,就能从采样信号系列重构原始信号 )。根据该采样理论, CD 激光唱盘采样频率为 44kHz,可记录的最高音频为 22kHz,这样的音质与原始声音相差无几,也就是我们常说的超级高保真音质。通信系统中数字电话的采用频率通常为 8kHz,与原 4k 带宽声音一致的。

比特率(音频) = 采样率 x 采用位数 x 声道数.

以电话为例,每秒 3000 次取样,每个取样是 7 比特,那么电话的比特率是 21000。 而 CD 是每秒 44100 次取样,两个声道,每个取样是 13 位 PCM 编码,所以 CD 的比特率是 44100213=1146600,也就是说 CD 每秒的数据量大约是 144KB,而一张 CD 的容量是 74 分等于 4440 秒,就是 639360KB=640MB。

I 帧、P 帧、B 帧、IDR 帧

I 帧:帧内编码帧

I 帧特点:

  1. 它是一个全帧压缩编码帧。它将全帧图像信息进行 JPEG 压缩编码及传输;

  2. 解码时仅用 I 帧的数据就可重构完整图像;

  3. I 帧描述了图像背景和运动主体的详情;

  4. I 帧不需要参考其他画面而生成;

  5. I 帧是 P 帧和 B 帧的参考帧(其质量直接影响到同组中以后各帧的质量);

  6. I 帧是帧组 GOP 的基础帧(第一帧),在一组中只有一个 I 帧;

  7. I 帧不需要考虑运动矢量;

  8. I 帧所占数据的信息量比较大。


P 帧:前向预测编码帧


P 帧的预测与重构:P 帧是以 I 帧为参考帧,在 I 帧中找出 P 帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从 I 帧中找出 P 帧“某点”的预测值并与差值相加以得到 P 帧“某点”样值,从而可得到完整的 P 帧。又称 predictive-frame,通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧


P 帧特点:

  1. P 帧是 I 帧后面相隔 1~2 帧的编码帧;

  2. P 帧采用运动补偿的方法传送它与前面的 I 或 P 帧的差值及运动矢量(预测误差);

  3. 解码时必须将 I 帧中的预测值与预测误差求和后才能重构完整的 P 帧图像;

  4. P 帧属于前向预测的帧间编码。它只参考前面最靠近它的 I 帧或 P 帧;

  5. P 帧可以是其后面 P 帧的参考帧,也可以是其前后的 B 帧的参考帧;

  6. 由于 P 帧是参考帧,它可能造成解码错误的扩散;

  7. 由于是差值传送,P 帧的压缩比较高。


B 帧:双向预测内插编码帧。


B 帧的预测与重构:B 帧以前面的 I 或 P 帧和后面的 P 帧为参考帧,“找出”B 帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到 B 帧“某点”样值,从而可得到完整的 B 帧。 又称 bi-directional interpolated prediction frame,既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧


B 帧特点:


  1. B 帧是由前面的 I 或 P 帧和后面的 P 帧来进行预测的;

  2. B 帧传送的是它与前面的 I 或 P 帧和后面的 P 帧之间的预测误差及运动矢量;

  3. B 帧是双向预测编码帧;

  4. B 帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确;

  5. B 帧不是参考帧,不会造成解码错误的扩散。


IDR 帧

IDR(Instantaneous Decoding Refresh)--即时解码刷新。

I 和 IDR 帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码中为了方便,要首个 I 帧和其他 I 帧区别开,所以才把第一个首个 I 帧叫 IDR,这样就方便控制编码和解码流程。IDR 帧的作用是立刻刷新,使错误不致传播,从 IDR 帧开始,重新算一个新的序列开始编码。而 I 帧不具有随机访问的能力,这个功能是由 IDR 承担。IDR 会导致 DPB(DecodedPictureBuffer 参考帧列表——这是关键所在)清空,而 I 不会。IDR 图像一定是 I 图像,但 I 图像不一定是 IDR 图像。一个序列中可以有很多的 I 图像,I 图像之后的图像可以引用 I 图像之间的图像做运动参考。一个序列中可以有很多的 I 图像,I 图像之后的图象可以引用 I 图像之间的图像做运动参考。

对于 IDR 帧来说,在 IDR 帧之后的所有帧都不能引用任何 IDR 帧之前的帧的内容,与此相反,对于普通的 I-帧来说,位于其之后的 B-和 P-帧可以引用位于普通 I-帧之前的 I-帧。从随机存取的视频流中,播放器永远可以从一个 IDR 帧播放,因为在它之后没有任何帧引用之前的帧。但是,不能在一个没有 IDR 帧的视频中从任意点开始播放,因为后面的帧总是会引用前面的帧。


小结


I 帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面).

P 帧表示的是这一帧跟之前的一个关键帧(或 P 帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P 帧没有完整画面数据,只有与前一帧的画面差别的数据).

B 帧是双向差别帧,也就是 B 帧记录的是本帧与前后帧的差别,换言之,要解码 B 帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B 帧压缩率高,但是解码时 CPU 会比较累~。

PTS:Presentation Time Stamp。PTS 主要用于度量解码后的视频帧什么时候被显示出来

DTS:Decode Time Stamp。DTS 主要是标识读入内存中的 bit 流在什么时候开始送入解码器中进行解码。

DTS 主要用于视频的解码,在解码阶段使用.PTS 主要用于视频的同步和输出.在 display 的时候使用.在没有 B frame 的情况下.DTS 和 PTS 的输出顺序是一样的.

GOP

两个 I frame 之间形成一个 GOP,在 x264 中同时可以通过参数来设定 bf 的大小,即:I 和 p 或者两个 P 之间 B 的数量。如果有 B frame 存在的情况下一个 GOP 的最后一个 frame 一定是 P.

一般平均来说,I 的压缩率是 7(跟 JPG 差不多),P 是 20,B 可以达到 50,可见使用 B 帧能节省大量空间,节省出来的空间可以用来保存多一些 I 帧,这样在相同码率下,可以提供更好的画质。在码率不变的前提下,GOP 值越大,P、B 帧的数量会越多,平均每个 I、P、B 帧所占用的字节数就越多,也就更容易获取较好的图像质量;Reference 越大,B 帧的数量越多,同理也更容易获得较好的图像质量。

如果一个 GOP 里面丢了 I 帧,那么后面的 P 帧、B 帧也将会无用武之地,因此必须丢掉,但是一般策略会保证 I 帧不丢(如通过 tcp 协议保证) ,如果采用 UDP,那么也会有更多的策略来保证 I 帧正确传输。


编解码

硬编解码

通过硬件实现编解码,减轻 CPU 计算的负担,如 GPU 等

软编解码

如 H264、H265、MPEG-4 等编解码算法,更消耗 CPU

数据优化

数据优化和编解码算法息息相关,一般而言

视频帧大小

  • 一般 I 帧的压缩率是 7,P 帧是 20,B 帧可以达到 50 (数据不精确)

  • P 帧大概是 3~4KB (480P, 1200k 码率, baseline profile)

音频帧大小

  • (采样频率(Hz)* 采样位数(bit)* 声道数)/ 8

  • 48000hz 大概经过 AAC 压缩后,应该是 12KB/s 左右

流媒体传输协议

常用的流媒体协议主要有 HTTP 渐进下载和基于 RTSP/RTP 的实时流媒体协议,这二种基本是完全不同的东西

CDN 直播中常用的流媒体协议包括 RTMP,HLS,HTTP FLV

RTP,RTCP

实时传输协议(Real-time Transport Protocol),RTP 协议常用于流媒体系统(配合 RTCP 协议),视频会议和一键通系统(配合 H.323 或 SIP),使它成为 IP 电话产业的技术基础。RTP 协议和 RTP 控制协议 RTCP 一起使用,而且它是建立在 UDP 协议上的。

实时传输控制协议(Real-time Transport Control Protocol 或 RTP Control Protocol 或简写 RTCP)是实时传输协议的一个姐妹协议。RTCP 为 RTP 媒体流提供信道外控制。RTCP 本身并不传输数据,但和 RTP 一起协作将多媒体数据打包和发送。RTCP 定期在流多媒体会话参加者之间传输控制数据。RTCP 的主要功能是为 RTP 所提供的服务质量提供反馈。

RTSP+RTP 经常用于 IPTV 领域。因为其采用 UDP 传输视音频,支持组播,效率较高。但其缺点是网络不好的情况下可能会丢包,影响视频观看质量。


小结


RTMP

RTMP(Real Time Messaging Protocol)实时消息传送协议是 Adobe Systems 公司为 Flash 播放器和服务器之间音频、视频和数据传输 开发的开放协议。

它有三种变种:

  • 工作在 TCP 之上的明文协议,使用端口 1935;

  • RTMPT 封装在 HTTP 请求之中,可穿越防火墙;

  • RTMPS 类似 RTMPT,但使用的是 HTTPS 连接;

总结: RTMP 协议基于 TCP 来实现,每个时刻的数据,收到后立刻转发,一般延迟在 1-3s 左右


HLS

HTTP Live Streaming(HLS)是苹果公司(Apple Inc.)实现的基于 HTTP 的流媒体传输协议,可实现流媒体的直播和点播。HLS 点播,基本上就是常见的分段 HTTP 点播,不同在于,它的分段非常小。基本原理就是将视频或流切分成小片(TS), 并建立索引(M3U8).

相对于常见的流媒体直播协议,例如 RTMP 协议、RTSP 协议、MMS 协议等,HLS 直播最大的不同在于,直播客户端获取到的,并不是一个完整的数据流。HLS 协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件(MPEG-TS 格式),而客户端则不断的下载并播放这些小文件,因为服务器端总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。由此可见,基本上可以认为,HLS 是以点播的技术方式来实现直播。由于数据通过 HTTP 协议传输,所以完全不用考虑防火墙或者代理的问题,而且分段文件的时长很短,客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。不过 HLS 的这种技术特点,决定了它的延迟一般总是会高于普通的流媒体直播协议。

总结: HLS 协议基于 HTTP 短连接来实现,集合一段时间数据,生成 ts 切片文件,然后更新 m3u8(HTTP Live Streaming 直播的索引文件),一般延迟会大于 10s


HTTP-FLV

HTTP-FLV 基于 HTTP 长连接,通 RTMP 一样,每个时刻的数据,收到后立刻转发,只不过使用的是 HTTP 协议,一般延迟在 1-3s


CDN

CDN 架构设计比较复杂。不同的 CDN 厂商,也在对其架构进行不断的优化,所以架构不能统一而论。这里只是对一些基本的架构进行简单的剖析。

CDN 主要包含:源站、缓存服务器、智能 DNS、客户端等几个主要组成部分。

源站:是指发布内容的原始站点。添加、删除和更改网站的文件,都是在源站上进行的;另外缓存服务器所抓取的对象也全部来自于源站。对于直播来说,源站为主播客户端。

缓存服务器:是直接提供给用户访问的站点资源,由一台或数台服务器组成;当用户发起访问时,他的访问请求被智能 DNS 定位到离他较近的缓存服务器。如果用户所请求的内容刚好在缓存里面,则直接把内容返还给用户;如果访问所需的内容没有被缓存,则缓存服务器向邻近的缓存服务器或直接向源站抓取内容,然后再返还给用户。

智能 DNS:是整个 CDN 技术的核心,它主要根据用户的来源,以及当前缓存服务器的负载情况等,将其访问请求指向离用户比较近且负载较小的缓存服务器。通过智能 DNS 解析,让用户访问同服务商下、负载较小的服务器,可以消除网络访问慢的问题,达到加速作用。

客户端:即发起访问的普通用户。对于直播来说,就是观众客户端。

弱网优化

弱网优化的策略包括如下:

  • 播放器 Buffer

  • 丢帧策略 (优先丢 P 帧,其次 I 帧,最后音频)

  • 自适应码率算法

  • 双向链路优化

  • 音频 FEC 冗余算法(20%丢包率)


丢帧

在弱网情况下,为了达到更好的体验,可能会采取丢帧的策略,但是丢帧,怎么丢呢?丢音频帧还是视频帧呢 ? 因为视频帧比较大,并且视频帧前后是有关联的;音频帧很小,关键是音频帧是连续采样的,丢了音频帧,那声音就会明显出现瑕疵。为此,一般的丢帧策略是丢视频帧


自适应码率

在弱网情况下,另外一种靠谱的策略是自适应码率算法,通过设置码率降级为多个档次,这样,当网络不好的情况下,通过降低码率进行预测,如果码率降低后,还不够 buffer 缓冲,那么继续降低一个档次,是一个循环探测的过程,如果再次降级一个档次后,发现 buffer 缓冲足够了,那么说明当前网络能够适应这个码率,因此就会采取当前码率。同理,升档也是一样的。但是这个属于厂商的核心算法,


实时聊天的挑战

简单估算一下大概的网络延时。众所周知,光在真空中的速度约为 300,000km/s,而在其他介质中光 速会大大降低,所以在普通光纤中,工程上一般认为传输速度是 200,000km/s。从现实上来说,可以参考如下:

实时聊天的挑战主要在于以下几点:

  • 实时性: 600ms 以内

  • 网络的不对称性

  • 距离

常见问题和解决方案

  • 出现花屏、绿屏问题

采集问题、编解码问题、声网传输丢帧问题

  • 声画不同步

采集问题,或者公有云 SDK 问题

  • 画面有时候有点糊

弱网,码率的自适应

  • 有声音没有画面

弱网,触发了丢帧策略

  • 画面播放有时候卡顿

CPU 消耗过高导致卡顿,比如 AR 模块

弱网

  • 网络连接不上

弱网

或者代码有 Bug,或者公有云 SDK 有 Bug

  • 出现马赛克现象?

是否类似花屏 ?

  • TODO

其他常见指标 和 问题解决方案


发布于: 刚刚阅读数: 2
用户头像

还未添加个人签名 2022.04.06 加入

还未添加个人简介

评论

发布
暂无评论
音视频&流媒体的原理以及基础入门知识_Linux_玩转音视频技术_InfoQ写作平台