音视频面试题集锦第 2 期
下面是音视频面试题集锦第 2 期:
1)如何根据 NALU 裸流数据来判断其是 H.264 编码还是 H.265 编码?
1)通常在处理音视频数据时,我们如何选择解码器?
通常我们不是根据 NALU 裸流数据中的信息来选择解码器,而是根据媒体封装层的信息来确定解码器。
媒体封装层是表示媒体数据是什么封装格式的,比如 MP4、FLV。在这层信息里,通常会携带码流编码格式的信息。
拿 MP4 来说,我们可以根据 Sample Description Box(moov/trak/mdia/minf/stbl/stsd) 中的信息来确定其封装的码流的编码格式。参考:《MP4 格式》。
对于 FLV,我们可以根据 VideoTagHeader 中的 CodecID 等信息来确定其封装的码流的编码格式。参考:《FLV 格式》。
这样的好处是效率比较高,解封装的时候就可以确定选择何种解码器了。
2)怎么识别 NALU 裸流数据的编码格式是 H.264 还是 H.265?
但是,如果出现题目中的情况,没有对码流进行封装,而是直接传输码流时,这时候 NALU 中有什么字段能标识自己的编码格式吗?答案是,没有这样明确的字段能标识码流的编码格式。
但是这个问题也不是不能解决,因为 H.264、H.265 码流本身也是遵循一定格式规范的,我们可以按照它的格式规范进行探测,如果能解析出来正确的信息,那也可以确定它的编码格式。
比如,拿 H.265 来说,FFmpeg 中
hevcdec.c就有对其码流数据进行探测的函数hevc_probe(...)。所以,我们可以按照编码格式规范探测,比如 H.265 如果解析出了 pps、sps、vps 的各字段信息符合规范,就认为它是 H.265 的编码;如果不是,在你们的码流格式范围中就只剩 H.264 了;接下来将码流数据交给对应的解码器解码即可。
2)为什么视频会议用 UDP?如果用 TCP 实现音视频,需要建立几次连接?用 UDP 实现音视频,有什么方法可以保证通话质量?
1)为什么视频会议用 UDP?
视频会议场景最重要的体验指标一般是『通话延时』和『语音音质』两方面。
在传输层使用 UDP 的主要考虑是为了降低通话延时。因为 UDP 的不需要 TCP 那样的面向连接、可靠传输、拥塞控制等机制,这些机制(比如三次握手建连、丢包重传等)通常都会带来相对 UDP 更高的延时。
当然,另外一方面原因是人们对视频会议中图像信息的损失容忍度是比较高的,这样即使 UDP 无法保证可靠性,有时候还是可以接受的。
2)如果用 TCP 实现音视频,需要建立几次连接?
可以做到只建连一次,多路复用。
也可以音频和视频各使用一路连接。
3)用 UDP 实现音视频,有什么方法可以保证通话质量?
使用 UDP 享受了低延时,牺牲了可靠性。但可靠性牺牲太多导致不可用也是不可接受的,所以还需要做一些机制来保证一定的可靠性,比如我们可以参考 WebRTC 的机制:
- NACK:通过丢包重传解决丢包问题,会增加延时。
- FEC:通过冗余数据解决丢包问题,会增加带宽占用。
- JitterBuffer:通过队列对接收到的数据进行缓冲,出队时将数据包均匀平滑的取出,解决视频的乱序与抖动。
- NetEQ:类似 JitterBuffer,解决音频的乱序与抖动。
3)CDN 在直播中有哪些运用?
...
全文链接:点击看全文

浙公网安备 33010602011771号