目录
简要介绍一下对 H.264 的了解?
H.264 原始码流(裸流)是由⼀个接⼀个 NALU 组成,它的功能分为两层:VCL(视频编码层)和 NAL(⽹络抽象层)。VCL 层负责视频的信号处理,包含压缩,量化等处理,NAL 层则负责解决编码后数据的网络传输。
SPS,Sequence Paramater Set,保存了一组编码后的图像序列所依赖的全局参数。
PPS,Picture Paramater Set,保存了每一帧编码后的图像所依赖的参数。
SPS 中的信息至关重要,如果其中的数据丢失,解码过程就可能失败。SPS 和 PPS 通常作为解码器的初始化参数。一般情况,SPS 和 PPS 所在的 NAL 单元位于整个码流的起始位置,但是在某些场景下,在码率中间也可能出现这两种结构:
解码器要在码流中间开始解码。比如,直播流。
编码器在编码过程中改变了码率的参数。比如,图像的分辨率。
AnnexB 模式:
传统模式
有 startcode,startcode 码是:00 00 01 或 00 00 00 01 (3 字节或 4 字节)
SPS 和 PPS 在码流中分别作为一个 NALU
H.264 如何根据 NALU 判断当前视频帧的类型?
RTP(real-time transport protocol, 实时传输协议)
1)RTMP 和 RTSP 有什么区别?使用 RTSP 是基于 UDP 传输的话,我们怎样进行乱序重排?
RTMP协议:是流媒体协议,RTMP是Adobe的私有协议,没有完全公开,一般传输的是flv、f4v格式流。
RTSP协议:是流媒体协议,RTSP协议是公有协议,有专门的机构维护RTSP协议一般传输的是ts、mp4格式流。
RTMP 的消息优先级是:控制消息 > 音频消息 > 视频消息。当网络传输能力受限时,优先传输高优先级消息的数据。
要使优先级能够有效执行,分块也很关键:将大消息切割成小块,可以避免大的低优先级的消息(如视频消息)堵塞了发送缓冲从而阻塞了小的高优先级的消息(如音频消息或控制消息)。
RTMP 和 RTSP 的区别:
RTMP 使用 TCP 作为传输层协议,能保证不丢包和接收顺序,传输质量高。
RTSP 使用 RTP 格式协议和 RTCP 控制协议,命令与数据分离。传输层协议一般会选择 UDP,延迟比较低,传输效率高。
RTSP 中的 RTP 格式头中有 SequenceNumber 字段,可以通过这个序号实现排序
SRTP(Secure Real-time Transport Protocol,安全实时传输协议)
对硬件解码有了解吗?
硬解码可以直接解码出纹理进行渲染,相比于软解要做一层 CPU 数据转换到 GPU,渲染效率也更高。
SDL(Simple DirectMedia Layer)
是一套开放源代码的跨平台多媒体开发库,使用 C 语言写成。其主要用于游戏开发中的多媒体处理,如:视频渲染、音频播放、鼠标键盘控制等操作。
统一的接口,但在内部,它会根据不同平台调用不同的底层 API 库。
SDL 的基本流程如下:
1、初始化 SDL
2、创建窗口
3、创建渲染器
4、清空缓冲区
5、绘制要显示的内容
6、最终将缓冲区内容渲染到 Window 窗口上
7、销毁渲染器
8、销毁窗口
9、退出 SDL
什么是 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 帧开始,播放器就可以立即开始播放。
I frame(Intra-coded picture) :帧内编码帧,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是一个图像经过压缩后的产物。
P frame(predictive-frame): 前向预测编码帧,通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧;
B frame(bi-directional interpolated prediction frame): 双向预测内插编码帧 ,既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧;
PTS(Presentation Time Stamp):PTS主要用于度量解码后的视频帧什么时候被显示出来DTS(Decode Time Stamp):
DTS主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码。
GOP(Group of Pictures):顾名思义,就是一组图片,在实际操作中,就是一组完整的视频帧,也就是说一个GOP拿出来,必须能够完整的播放、显示。那GOP就可以推断出来,必须是以I帧开头,这样后面的P帧和B帧才能跟据前向参考帧进行解码显示。
点播的倍速播放要如何实现?
视频处理
比如,对一个视频做 2 倍速播放,假设原来各视频帧的 pts 时间戳依次是 0, 30, 60, 90 …,倍速处理及将它们除以 2 变成 0, 15, 30, 45 …。这样处理后,视频的帧率和总时长相应的也发生了变化,帧率变为原来的 2 倍,总时长变为原来的 1/2。
设定最大帧率的限制,并按照这个最大帧率来进行丢帧。
音频处理
比如,原来的音频是 48K 的采样率,播放设置了使用 48K 的采样率进行音频渲染,这时候要对音频做 2 倍速播放,可以将音频数据每秒 48K 个采样点重采样降低到 24K 个(把音频数据的采样率处理为 24K),当播放还是使用 48K 的采样率来播放时,每秒需要 48K 个采样点,这时候就需要 2s 的数据,这时候音频的播放速度就变成了原来的 2 倍。
视频编辑中如何实现视频倒放?
采取分而治之、并行提效的思路。因为视频本身可以按照 GOP 单元独立编解码,所以我们可以把视频的每一个 GOP 单元取出来分别做解码、逆排序、编码,最后再把处理后的所有 GOP 重新 remux 封装起来即可。
什么是 DTS 和 PTS?它们有什么区别?
DTS 是解码时间戳;PTS 是显示时间戳。
虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的。
当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。但如果有 B 帧时,就回到了我们前面说的问题:解码顺序和播放顺序不一致了。DTS 告诉我们该按什么顺序解码这几帧图像,PTS 告诉我们该按什么顺序显示这几帧图像。
为什么会有 YUV 这种数据?它相比 RGB 数据有什么优点?
RGB 工业显示器要求一幅彩色图像由分开的 R、G、B 信号组成,而电视显示器则需要混合信号输入,为了实现对这两种标准的兼容,NTSC(美国国家电视系统委员会)制定了 YIQ 颜色模型,它的主要优点是可以实现对彩色电视和黑白电视的兼容,即可以用黑白电视收看彩色电视信号。YUV 颜色模型则是在 YIQ 的基础上发展而来。
YUV 颜色模型中用亮度、色度来表示颜色。它的亮度信息和色度信息是分离的,其中 Y 表示亮度通道,U 和 V 则表示色度通道。如果只有 Y 信息,没有 U、V 信息,那么表示的图像就是灰度图像。YUV 常用在各种影像处理场景中。YUV 在对照片或视频编码时,考虑到人眼对亮度信息的敏感度高于色度信息,
允许降低色度的带宽。
这样一来就可以对色度信息进行压缩,所以 YUV 可以相对 RGB 使用更少的数据带宽。比如常见的采样格式有:4:2:1、4:1:1、4:2:0 等,它们分别相对 RGB 压缩了 33.3%、50%、50% 的数据量。
OpenGL 是按照什么架构设计的?
OpenGL 的渲染架构是 Client/Server 模式:Client(客户端)指的是我们在 CPU 上运行的一些代码,比如我们会编写 OC/C++/Java 代码调用 OpenGL 的一些 API;而 Server(服务端)则对应的是图形渲染管线,会调用 GPU 芯片。