音视频/流媒体快问快答
1. 视频加工的流程是什么?
[模拟信号]
采样(RGB/YUV)
量化(丢弃一些不敏感数据)
编码-音频(编码方式:mp3,AAC)
编码-视频(编码方式:H.264,H.265,时间冗余、空间冗余处理)
VCL流程:划分宏块(I/P/B宏块)→片→片组→帧
[数字信号]
编码-信息(指视频H.264的外面一层)
NAL流程:构造NAL单元(带有首部和数据的待传输包)→AU(一帧全部的NALU总称,携带帧边界,用于帧分隔)
封装(各节目流包装到一起,音频+视频+字幕+同步,HLS-TS)
传输(传输:RTP,RTMP,HLS,质量保证:RTCP,控制:RTSP,资源预留:RSVP)
2. RGB、YUV、YCbCr分别是什么意思?
是不同的像素表达方式。RGB:用Red、Green、Blue光的三原色表达一个像素;YUV:Y代表亮度,UV代表色度;YCbCr:是YUV的一种演化,表达方式不同含义与YUV相同。
转化方式:
RGB-->YUV
Y = 0.299 R + 0.587 G + 0.114 B
U = -0.1687 R - 0.3313 G + 0.5 B + 128
V = 0.5 R - 0.4187 G - 0.0813 B + 128
YUV-->RGB
R = Y + 1.402 (V-128)
G= Y - 0.34414 (U-128) - 0.71414 (V-128)
B= Y + 1.772 (U-128)
RGB-->YCbCr
Y=0.299R+0.587G+0.114B
Cb=0.564(B-Y)
Cr=0.713(R-Y)
YCbCr-->RGB
R=Y+1.402Cr
G=Y-0.344Cb-0.714Cr
B=Y+1.772Cb
3. RGB888,RGB565,RGB16,RGB24,RGB32是什么关系?
RGB565=RGB16,用2个字节保存像素信息,之所以G是6是因为绿色的波长和视感细胞波长重叠较多,人眼视感细胞>>视觉细胞,对光暗感知更敏感
RGB888=RGB24=全采样,3个字节保存像素信息
RGB32,本质上和RGB24一样,多了一个字节用于保存透明度,在4k等播放时使用
4. YUV444,YUV422,YUV420区别是什么?
4:4:4表示完全采样;
4:2:2表示水平2:1采样,垂直完全采样。
4:2:0表示水平2:1采样,垂直2:1采样。
5. RGB和YUV的关系?
完全采样RGB24和YUV444


YUV422

YUV420

6. 为什么要编码?
以播放1080P影片1小时为例,如果不进行编码,全采样的一帧影片需要3(字节,RGB888)*1920*1080=6220800字节≈6MB,电影帧率通常为24fps(每秒绘制的画面数),仅视频就有6MB/fps*24fps*3600s=500GB。传输需要的带宽(码率)=帧率*每帧数据量=24fps*6MB=144MB/s,一般达到这样的下行速度是不可能的。所以要通过编码,舍弃一些冗余的数据。
7. 冗余的类型有哪些?
1. 空间冗余☆:图像相邻像素之间有较强的相关性
2. 时间冗余☆:视频序列的相邻图像之间内容相似
3. 编码冗余:不同编码值出现的概率不同
4. 视觉冗余:人的视觉系统对某些细节不敏感
5. 知识冗余:规律性的结构可由先验知识和背景知识得到
6. 结构冗余:某些图片中固定存在的分布模式
8. 冗余的处理方法有哪些?
a) 空间冗余:利用帧内预测,熵编码(JPEG用的是Huffman编码和算术编码,H.264用的是CAVLC和CABAC)将相关的像素组成宏块,形成I帧。
b) 时间冗余:采用帧间编码进行运动估计和补偿,参考前帧形成P帧,参考前后帧形成B帧。
c) 其他:量化,使用更粗糙的数据降低精度,去除一些不敏感信息。
9. 简述H.264编码原理
H.264的编码目标是:(1)高视频压缩比;(2)良好的网络亲和性。
为此,H.264将功能分为2层,视频编码层(VCL,Video Coding Layer),和网络提取层(NAL,Network Abstraction Layer)。
VCL层,进行视频的数据切分和编码,划分宏块(I/P/B宏块)à片à片组à帧,使用CAVLC or CABAC无损熵编码;
NAL层,进行网络传输优化相关封装,形成带有传输错误、重要性、类型标志的NAL单元(NALU),和含有一帧全部NALU及帧间分隔的AU。
10. H.264和H.265的区别是什么?
H.265本质是改善码流、编码质量、延时和算法复杂度之间的关系,达到最优化设置。
(1)在架构上将H.264的帧内预测、帧间编码、转换、量化、去区块滤波器、熵编码整合为编码单位、预测单位、转换单位。
(2)宏块大小由H.264固定的16×16调整为最小8×8最大64×64,对图像进行有重点的编码,降低了整体的码率。
(3)H.265的帧内预测模式支持33种,相比H.264的8种更加精准。并提供了更好的帧间运动补偿处理和矢量预测方法。
(4)在相同的图象质量下,相比于H.264,通过H.265编码的视频码流大小比H.264减少大约39-44%
(5)在码率减少51-74%的情况下,H.265编码视频的质量还能与H.264编码视频近似甚至更好,其本质上说是比预期的信噪比(PSNR)要好。
(6)由于H.265的算法更加复杂,需要更高的性能,部分设备无法支持。
11. 软编码和硬编码是什么意思?
a) 软编码:使用CPU,通过软件实现编解码算法(ffmpeg,GPUImage);
b) 硬编码:使用系统自带的硬件(DSP、GPU)提供的api进行编解码(Android:MediaCodec,IOS:VideoToolBox)。
12. 为什么要进行封装?
封装的目的是将同一个节目的不同媒体流打包到一起,便于接收和播放。音频+视频+字幕+同步等。
13. 简述TS封装与解封装过程?
TS封装流程主要有三步:
a) es层:编码后的音视频数据
b) pes层:在音视频数据上加了时间戳等对数据帧的说明信息(同步)
c) ts层:在pes层上加入了数据流识别和传输的必要信息(PAT、PMT)
其内容是通过PID(PacketID)值来标识的,主要包括:PAT表、PMT表、音频流、视频流等。
解析过程是:
a) 找到PID=0的PAT表,PAT表中记录了TS流中所有节目的PMT表所在的PID
b) 通过PID找到节目的PMT表,PMT表中写了音视频流的PID
c) 通过PID找到真正的音视频流Packet,数据起始位置会有StartCode标识
14. 常见的流媒体协议有哪些?应用场景是什么?
常见的流媒体协议有:
传输:RTP,RTMP,HLS
质量保证:RTCP
控制:RTSP
资源预留:RSVP
(1)RTP:基于UDP的传输协议,用于单播or多播网络中传送实时数据。应用场景:简单多播会议、音频and视频会议、翻译器and混合器。
(2)RTMP:基于TCP传输,是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议。采用实时流传播不会缓存文件到客户端,可以拖动播放不需要关键帧,支持点播回放(需要把文件放到服务器,客户端才能播),支持直播。
(3)HLS:基于HTTP传输,HLS传输的不是完整的数据流,而是TS,只要不停地按序播放不停请求就实现直播。通过HTTP协议传输,无需考虑防火墙or代理。TS分片时长短,有利于切换码率,延迟较高,19年WWDC发布了解决方案将延迟从8s降到1-2s。
(4)RTCP:RTP的姊妹协议,RTP使用一个偶数UDP port,而RTCP则使用RTP的下一个port,也就是一个奇数port。RTCP与RTP联合工作,RTP实施实际数据的传输,RTCP则负责将控制包定期发送至参与者,为RTP提供QoS。
(5)RSVP:RSVP即资源预留协议,使用RSVP预留一部分网络资源(即带宽),能在一定程度上为流媒体的传输提供QoS。源节点发送path消息沿途建立路径状态,目的节点收到path消息回复reserve消息沿途预留带宽。
(6)RTSP:双向实时数据传输应用层协议。由客户端向流服务器发起,询问服务器提供的方法并获取sdp建立对话。对流媒体提供了诸如暂停,快进等控制,而它本身并不传输数据。
15. 传输质量优化方法有哪些?
常见的信道传输优化方法有FEC(前向纠错编码)、ARQ(自动请求重传)、HARQ混合重传,理论研究上还有NC(网络编码)等。
FEC:给定k个数据包,n个编码包,当丢包m<n-k时可以恢复丢包,当丢包m>n-k时无法恢复。基于不同数据的异或。
ARQ:有三个变种
停止等待ARQ,收不到OK一直等着;
退回N步ARQ,一直发,收到重传请求,从请求位置开始后面的全部重传。
选择性重传ARQ,一直发,让重传哪个重传哪个。
HARQ:根据PLR(丢包率,Packet Lost Rate)和RTT(往返耗时,Round Trip Time),衡量FEC的n、k值和ARQ的种类。
NC:基于喷泉码,每个中继节点进行拆包组装再编码
16. 弱网优化的方法有哪些?
a) 自适应码率:根据上行带宽的状况来动态调整码率、帧率、分辨率
b) 推流端使用H.265编码推流
c) 扩展内存,预缓存
17. 简述对WebRTC与FFmpeg开源框架的理解
FFmpeg功能是音视频编辑、播放、编解码的软件
WebRTC(Web Real-Time Communication)是网页实时通信,是一个支持网页浏览器进行实时语音对话或实时视频对话的技术,核心技术包括视频的采集、编解码、网络传输、渲染等功能。底层基于SRTP&UDP。
18. NAT网络穿透指的是什么?
由于Internet的快速发展 IPV4地址不够用,不能每个主机分到一个公网IP 所以不得不使用NAT地址转换。
因为旨在解决IP不够用问题,NAT的设计只接受在Track table中有ip和端口记录的由内向外访问。
但是为了解决P2P的需求(P2P软件、网络会议、视频传输等),NAT穿透必须解决。
Server启动两个网络监听,一个是主连接监听,一个是协助打洞监听,不同NAT路由下的设备通过主连接可以进行外网的请求,而通过发起协助打洞请求:
(蓝色是协助打洞消息,红色是主连接消息,自己按照理解画的如有问题请指正,谢谢)

19. 音视频同步怎么做到的?
音频帧和视频帧序列,每一帧都有PTS(Presentation Time Stamp)和DTS(Decode Time Stamp)时间戳。
PTS主要用于度量解码后的视频帧什么时候被显示出来,DTS主要是标识读入内存中的比特流在什么时候开始送入解码器中进行解码。FFmpeg中用AVPacket结构体来描述解码前或编码后的压缩包,用AVFrame结构体来描述解码后或编码前的信号帧。对于视频来说,AVFrame就是视频的一帧图像。这帧图像什么时候显示给用户,就取决于它的PTS。DTS是AVPacket里的一个成员,表示这个压缩包应该什么时候被解码。如果视频里各帧的编码是按输入顺序(也就是显示顺序)依次进行的,那么解码和显示时间应该是一致的。可事实上,在大多数编解码标准(如H.264或HEVC,当出现B帧的时候)中,编码顺序和输入顺序并不一致。于是才会需要PTS和DTS这两种不同的时间戳。
因为音频是采样数据,有固定的采用周期并且依赖于主系统时钟,要调整音频的延时播放较难控制。所以实际场合中视频同步音频相比音频同步视频实现起来更容易。
a) 显示第一帧视频图像;
b) 根据音频信号,计算出第二帧的delay时间,更新该帧的pts。
c) 当pts到达后,显示第二帧视频图像。
d) 重复以上步骤,到最后一帧
20. 播放器暂停、快进快退、seek、逐帧怎么实现?
a) 暂停:在暂停后记录暂停的时间,以更新同步时钟,取消暂停后重新计算音视频同步。
b) 快进快退:确定每次快进的步进值(x2、x3),和当前帧时钟相加即可得到快进后的时间点。在播放前对整个码流进行帧数统计,确定所有的 I 帧在什么位置。在播放的时候,再根据用户快进或快退的位置判断相邻最近的 I 帧在什么位置,然后从那一个 I 帧开始解码播放。
c) seek:对于mp4文件,有索引表,可以快速找到某个时间戳对应的数据;对于ts文件,需要根据时间戳和duration计算出seek后的position,请求相应position。
d) 逐帧播放:在视频解码线程中,不断通过stream_toggle_paused,控制对视频的暂停和显示,从而实现逐帧播放。其原理就是不断的播放,然后暂停,从而实现逐帧播放。


浙公网安备 33010602011771号