前些时间,我在知识星球上创建了一个音视频技术社群:关键帧的音视频开发圈,在这里群友们会一起做一些打卡任务。比如:循序渐进地归纳总结音视频技术知识,绘制一幅音视频知识图谱,你可以看看《音视频知识图谱 2022.03》。再比如:周期性地整理音视频相关的面试题,汇集一份音视频面试题集锦。
下面是 2022.04 月音视频面试题集锦内容的节选:
1)RTMP 消息分优先级的设计有什么好处?
RTMP 的消息优先级是:控制消息 > 音频消息 > 视频消息。当网络传输能力受限时,优先传输高优先级消息的数据。 要使优先级能够有效执行,分块也很关键:将大消息切割成小块,可以避免大的低优先级的消息(如视频消息)堵塞了发送缓冲从而阻塞了小的高优先级的消息(如音频消息或控制消息)。
2)什么是 DTS 和 PTS?它们有什么区别?
DTS 是解码时间戳;PTS 是显示时间戳。 虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的。 当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。但如果有 B 帧时,就回到了我们前面说的问题:解码顺序和播放顺序不一致了。DTS 告诉我们该按什么顺序解码这几帧图像,PTS 告诉我们该按什么顺序显示这几帧图像。
3)什么是 IDR 帧?它和 I 帧有什么区别?
IDR 帧全称叫做 Instantaneous Decoder Refresh,是 I 帧的一种。IDR 帧的作用是立刻刷新,重新算一个新的序列开始编码,使错误不致传播。 IDR 帧有如下特性:
- IDR 帧一定是 I 帧,严格来说 I 帧不一定是 IDR 帧(但一般 I 帧就是 IDR 帧);
- 对于 IDR 帧来说,在 IDR 帧之后的所有帧都不能引用任何 IDR 帧之前的帧的内容。与此相反,对于普通的 I 帧来说,位于其之后的 B 和 P 帧可以引用位于普通 I 帧之前的 I 帧(普通 I 帧有被跨帧参考的可能);
- 播放器永远可以从一个 IDR 帧播放,因为在它之后没有任何帧引用之前的帧。因此,视频开头的 I 帧一定是 IDR 帧;一个封闭类 GOP 的开头的 I 帧也一定是 IDR 帧。
所以,在直播场景通常每个 I 帧都是 IDR 帧,这样服务端下发流数据的时候总是从一个 I 帧开始,播放器就可以立即开始播放。
4)什么是 SPS 和 PPS?它们有什么区别?
SPS,Sequence Paramater Set,保存了一组编码后的图像序列所依赖的全局参数。 PPS,Picture Paramater Set,保存了每一帧编码后的图像所依赖的参数。 SPS 中的信息至关重要,如果其中的数据丢失,解码过程就可能失败。SPS 和 PPS 通常作为解码器的初始化参数。一般情况,SPS 和 PPS 所在的 NAL 单元位于整个码流的起始位置,但是在某些场景下,在码率中间也可能出现这两种结构:
- 解码器要在码流中间开始解码。比如,直播流。
- 编码器在编码过程中改变了码率的参数。比如,图像的分辨率。
5)什么是 SEI?我们可以用它来做什么?
SEI 即补充增强信息(Supplemental Enhancement Information),属于码流范畴,它提供了向视频码流中加入额外信息的方法,是 H.264 标准的特性之一。 SEI的基本特征如下:
- 并非解码过程的必须选项;
- 可能对解码过程(容错、纠错)有帮助;
- 集成在视频码流中。
在直播场景,我们通常使用 SEI 来携带推流端的信息,一直随着直播流传输到播放端。由于 SEI 是绑定着视频帧,所以它可以支持诸如:
- 统计直播推流端到播放端延时。
- 支持和视频帧绑定的内容交互。比如,直播答题在播放端的弹窗等。
6)什么是 MP4 的 moov Box?我们在封装 MP4 时通常怎么处理它?为什么?
moov Box 即 Movie Box,MP4 中存储所有媒体数据的索引信息的 Box。moov Box 可以说是 MP4 文件中最重要的 Box,一般播放器的实现都需要读取到 moov 的数据才能开始播放流程。 对于通过网络播放 MP4 视频的场景,都建议将视频处理为 moov 前置。因为 moov 前置后,从网络读取和播放 MP4 文件时,就可以较快获取到 moov 的数据并开始播放。