这里将会从最最基础的知识点说起,如果感觉太基础可以直接跳过
- 字节和比特的关系:
1B=8b 1KB=1024B 1M=1024KB 1GB=1024MB
- 比特率:每秒传送的比特,单位为bps(bit per second),用来计算信息的传递速度。也叫 码率
下面是个国际单位制下的各种比特率单位:(注意换算比)
| 国际单位 | 单位 | 值 | 简写 |
|---|---|---|---|
| 千比特每秒 | kbit/s | 10^3 | kbps |
| 兆比特每秒 | Mbit/s | 10^6 | Mbps |
| 吉比特每秒 | Gbit/s | 10^9 | Gbps |
| 太比特每秒 | Tbit/s | 10^12 | Tbps |
- 编码:windows平台通常使用UTF-16编码,而macOS平台通常使用UTF-32编码。
- 网络协议:网络上传递的二进制数据是分层的。比如TCP/IP四层网络协议和OSI七层网络协议。网络协议分层是在应用层数据包前面,附加多个协议头,如下图所示(括号内为所占字节数):
为了区分每个物理层的网卡设备,在链路层,为每个网卡定义了一个MAC地址,也叫网卡的物理地址。MAC地址通常是6字节,前3字节为厂商标识,后3字节为该厂商的设备标识。由此,可以通过MAC地址确定出是属于哪个厂商和设备。
上图中一个MAC头有14字节,就是包含了两个相互连接的主机,前6个字节为目的MAC地址,后6个字节为自身MAC地址,最后2字节用来表示使用的上层协议类型。
- IP地址和MAC地址互查:在windows上使用命令
arp -a;在macOS/UNIX上使用arp -n; - UDP协议:只能保证数据包能发出,但不保证对方能准确收到。在这其中会有丢包和被攻击的可能,效率高但安全性和可靠性可能有问题。它只有8个字节,如下所示:
| 字段 | 长度(单位字节) | 含义 |
|---|---|---|
| 源端口 | 2 | Big-Endian方式 |
| 目的端口 | 2 | Big-Endian方式 |
| 报文长度 | 2 | 报文长度必须小于65535 |
| 校验和 | 2 | 报文每个字节取反相加得到的和 |
- TCP协议:面向连接的、可靠的、基于字节流的传输层协议。它能保证对方一定能收到包,可靠性很高,但传输效率相对来说不高,因为传输的内容和做的功课多了。它有20个字节,前两个字节表示源端口,第3和第4字节表示目的端口。
为了确保对方一定能收到数据包,做了以下3件事:
1. 给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认消息
2. 在一定时间内没有得到确认回复,就会超时重发
3. 如果重发后还是没有回应,则会将等待时间翻倍,然后再重发。(在Linux下,默认重试次数为5次,重试的间隔时间从1s开始每次都翻倍,5次的重试时间间隔为1s, 2s, 4s, 8s, 16s,总共31s,第5次发出后还要等32s才知道第5次也超时了,所以,总共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 63s,TCP才会断开这个连接。)
- RGB颜色:分为红(red,R)、绿(greeen,G)和蓝(blue,B)3个分量进行表示。任何一个颜色都是一个RGB三元组。每个分量使用8bit表示,最小值为0,最大值为255。
- YUV颜色:分为Y亮度(灰度值)、U色度和V浓度。使用YUV颜色编码最大的好处就是可以降低占用的存储空间和节省带宽。原因在于视觉对于亮度的敏感远大于色度和浓度,可以适当的减少色度和浓度,以此来使用不同的压缩策略。
- RGB和YUV互换:
- 分辨率:即图像大小,用长和宽表示,单位是像素。普通屏常用4:3,宽屏常用16:9。
| 规格 | 分辨率 | 宽高比 |
|---|---|---|
| 4K | 4096 x 2160 | 16 : 9 |
| 2k | 2560 x 1440 | 16 : 9 |
| 1080P | 1920 x 1080 | 16 : 9 |
| 720P | 1280 x 720 | 16 : 9 |
| NTSC | 760 x 480 | 16 : 9 |
| PAL | 720 x 576 | 4 : 3 |
| VGA | 640 x 480 | 4: 3 |
12:帧率:以帧为单位的图像连续出现在显示器上的频率,简单来说就是一秒之内图片在你眼前划过数量的多少。一般限制在120fps之内。
13:重复帧检测 :用于降低帧率,将重复帧去除,降低宽带。检测重复帧可用以下方法:
- 通过 memcmp函数 函数,直接比较前后两帧Y分量的内存,结果为0则为重复帧。
- 计算前后两帧的 海明距离, 距离为0时判断为重复帧。
- 计算前后两帧Y分量的均方误差MSE,当MSE为0则为重复帧。
- 帧率控制:当采集输出的帧率与所需的帧率不同时,可进行丢帧处理。首先给定每个帧输入时间戳,和一个所需的帧率,然后根据帧率计算出下一帧的时间戳。
- 视频帧类型:在视频编码中,有不同类型的帧,这些帧按照一定的顺序组织成GOP(group of picture)。
- I帧:一种关键帧,也叫独立帧。是视频序列中独立编码的帧,不依赖于其他帧进行解码。每个 I帧 都是一个完整的图像帧,可以独立显示。
- P帧:是预测帧,通过参考之前的一个或多个帧进行编码。利用运动估计和运动补偿来预测当前帧的内容。P帧比I帧具有更高的压缩效率。
- B帧:双向预测帧,通过参考前后两个帧来进行编码,具有最高的压缩效率。
- 视频格式:以下是一些常见的视频简述和差异
| 名称 | 编码方式 | 压缩效率 | 功能支持 | 适用场景 |
|---|---|---|---|---|
| MPEG-2 | 基于离散余弦变换(DTC)的压缩算法 | 相对较高,适用于广播,DVD和有线电视等应用 | 支持多个音频和视频流、多角度、字幕等功能 | 广播、DVD、数字电视等 |
| MPEG-4 Part2 | 基于离散余弦变换(DTC)的压缩算法,支持更高级的压缩技术 | 比MPEG-2更高,适用于互联网和媒体流应用 | 支持更高级的视频编码功能,如对象提取、透明视频等 | 互联网视频、流媒体、移动视频等 |
| H.264/MPEG-4 AVC | 基于离散余弦变换(DTC)的压缩算法,引入更多的编码技术和优化 | 比MPEG-4 Part2提供更高的压缩技术,同时能保持较好的视频质量 | 支持更多的编码功能和高级技术,如运动估计、自适应量化、多帧参考等 | 互联网视频、流媒体、蓝光光盘、数字电视等 |
| H.265/HEVC | 基于离散余弦变换(DTC)和离散正弦变换(DST)的压缩算法,引入更多的编码技术和优化 | 达到H.264/MPEG-4 AVC两倍压缩率,可以实现更小的文件和更高的视频质量 | 支持更多的编码功能和高级技术,如运动补偿、运动向量预测、取样自适应偏移等 | 支持4K清晰度,甚至到超高清电视(UHDTV),最高清晰度可达到8192×4320(8K清晰度) |
| VP9 | Google开发的开源视频编码技术 | 在相同的压缩质量下,相对于H.265/HEVC 有更高的压缩率 | VP9最高可支持 65536×65536的分辨率,相对而言H.265(HEVC)只支持到8192x4320 | 互联网视频、流媒体视频等 |
- 音频采样率:采样是指将时间连续的模拟信号变成时间离散的数字信号,采样的频率就是采样率。注意:只有当采样率为最高音频频率的两倍,才不会出现信息丢失的情况。常见的设备采样率如下:
| 设备 | 采样率 |
|---|---|
| 电话 | 8000 Hz |
| AM调幅广播 | 11025Hz |
| FM调幅广播 | 22050Hz 24000Hz |
| 音频CD、VCD和MP3 | 44100Hz |
| 数字电视、DVD和电影 | 48000Hz |
- 音频格式:以下是一些常见的音频简述和差异
| 名称 | 压缩率 | 使用场景 |
|---|---|---|
| MP3 | 有损压缩,对人类听觉不重要的数据来达到压缩效果。比特率范围通常在128 - 320kbps | 具有广泛的兼容性,能适应几乎所有平台和设备 |
| AAC | 有损压缩,在相同的比特率之下,相较于MP3通常可以达到更好的声音质量 | 适用于音乐、广播和视频等 |
| FLAC | 无损压缩,压缩后不会有任何音质损失。压缩效率为 50% - 70%,且压缩后还可以完全还原原始音频信号 | 适用于音乐制作、无损音乐播放器等 |
| ALAC(Apple Lossless Audio Codec) | 苹果公司出品,无损音频压缩。非压缩音频格式(WAV、AIFF)压缩至原先容量的40%至60%左右,编解码速度很快 | 常用于 Apple设备和 iTunes中 |
| OGG | 开源免费的有损压缩格式,相比于MP3和AAC,提供更好的音频质量和更小的文件大小 | 常用于在线流媒体和音乐存储 |
- 音画同步:音频和视频的播放应该是同步的,不然就会出现听觉和视觉上的感官差异,影响观看体验。有以下三个标准:
- 无法察觉音频和视频有区别的的时间戳差值在 -100ms 和 + 25ms 之间
- 能够察觉音频滞后了 100ms 以上 或者 超前了 25ms 以上
- 不能接受音频滞后了 185ms 以上 或者 超前了 90ms 以上
当然,也有常见的四种方式来解决不同的问题,1)硬件同步;2)软件同步;3)使用时间戳标记;4)使用缓存
到这里就简单介绍完了与音视频有关联的知识点了。这些知识点可能用不上,但应该了解一下。当出现问题时,这些知识点可能会给你提供一些思路和方法。
下一章节开始正式入门 webrtc。