嵌入式音视频开发面试题:如何优化画面质量?
1、请说下H264的两种形态:
- Annex B格式:这种格式常用于网络流媒体传输,比方说RTP、RTSP、RTMP等等。他的格式特点如下:它拥有StartCode(00 00 00 01/00 00 01)作为分隔符,StartCode的作用是防止竞争,当数据中出现00 00 01 ,则会修改成00 00 031。更重要的是,对于AnnexB的分隔符不代表NALU长度。
- AVCC格式:这种格式的分隔符能表示NALU长度,并且不定长。这种方式也是防止竞争字节,这种格式的文件多用于MP4文件。
2、在直播场景中如何做到解码端秒开
直播秒开是开发音视频项目中一个很重要的功能,因为如果用户在播放网络视频流黑屏的时间过长则会严重影响用户体验。一般我们有两种方式解决:
- 推流端缩短GOP长度:在推流端设置GOPSIZE,一般来说GOP的长度会影响播放端的黑屏时间。GOP长度越长,找到I帧的时间就会变长,若解码端长时间没找到I帧,播放器就会处于长时间黑屏。若出现黑屏的时间过长,则可以考虑缩短GOPSIZE的长度。比方说,黑屏的GOPSIZE长度是60,则可以缩短GOPSIZE为5,此时解码端则会快速找到I帧,播放器基本上会秒开。
- 设置服务端GOP缓存:这个方法跟第一个方法有点相似,也是设置GOP的属性。但这个方法是在服务端设置GOP属性,在服务端可以通过设置GOP-Cache缓存让播放器总是缓存着前一个I帧,这样的话播放器每次刷新都可以快速播放视频。
3、TCP或者UDP传输视频码流的时候出现了粘包的情况,要如何解决:
所谓的视频流粘包,就是指一段视频码流无法识别出一帧完整的视频帧。我的回答是通过FFMPEG的抽帧api av_read_frame把每一个码流中的每一帧H264/H265码流获取到,并且通过内部的标识符00 00 00 01进行分割,最终分割成sps+pps+i作为一帧完整的视频帧。这样就可以解决TCP、UDP粘包的情况。
4、你如何进行画面增强:
我这里回答了两点,一个是GOP调节,另外一个是QP调节。
4.1、适当增加GOP的长度:
GOP是画面调节的一种,在音视频开发中,可以通过调节GOP长度去改善画质的。一般情况下,GOP的长度越长视频增强效果越长,反之GOP越小则画质增强效果越弱。所以,可以适当通过调节GOP的长度去增强画质。
4.2、QP调节方法:
QP调节是常见的画面增强的方法,它的基本原理是通过修改步长(QStep)来调节QP的总体画面质量,除了QStep外还有maxQp和minQp。maxQp主要是调节运动画面时候的变化情况,minQp主要是调节静止画面的时候画面变化的情况。
5、你如何做码率的稳定性控制:
它这个问题实际上就是问如何做码率控制,我的回答是:根据不同的场景做不同的码率控制调节,如果对画面质量较高并且不考虑码率的大小则优先使用VBR调节模式。若需求是保码率,不要求画质,则可以优先考虑CBR码率控制方式。
6、对IDR帧有什么了解?
IDR帧是I帧的一种,当解码器收到I帧和IDR帧的时候,都会将所有参考帧丢弃,在这点上I帧和IDR帧是一样的。但有一点不同的是,IDR帧除了清空所有参考帧外,还会把所有的SPS和PPS参数进行更新。每发一个IDR,就相应地发一个PPS和SPS_nal_unit。
7、说一下RKNN的开发、部署步骤:
1、RKNN的部署工作一般以下步骤:
RKNN的部署一般要部署三个文件,分别是:box_priors.txt坐标权重文件、SSD模型文件、coco_labels_list.txt训练集文件。把这三个文件放到/userdata/文件夹下面。
2、RKNN的开发步骤,一般分为以下几步:
- 第一步,读取模型文件:这个模型文件可以是ssd模型、 yolo模型等。
- 第二步,初始化rknn模块,调用的API是rknn_init。
- 第三步,对视频数据进行RKNN识别。识别的步骤如下:首先,先调用RK_MPI_SYS_GetMediaBuffer或者每一帧视频数据,并把每一帧数据进行格式转换(RKNN模型中只识别RGB24,所以要把NV12数据转换成RGB24),格式转换完成之后,把RGB24的数据传给RKNN的输入模块(调用的API是rknn_inputs_set)。输入模块设置完成之后,则调用rknn_run开启识别工作,并实时把输出的结果拿到(调用rknn_outputs_get获取识别出来后的结果)。
- 第四步,把识别出来的结果进行可视化操作。可视化操作分下面几个步骤:第一步,读取SSD数据集(coco_labels_list.txt)和坐标系数(box_priors.txt)。然后根据识别出来的结果和box_priors.txt进行过滤,找出最合适的识别个数。然后根据最优识别个数进行排序和非极大抑制(NMS)找出最优的矩形框。
面试官侧重点是音视频项目的主要实现过程,包括一些细节的提问,比方说:在上面提到的音视频不同步、如何改善画面质量等问题。除了音视频项目外,面试官还会问RK3399的RKNN技术点,RKNN模型的部署和开发流程。
粉丝福利,博主耗时2个月整理了一份详细的音视频开发学习教程,涵盖了音视频开发FFmmpeg、流媒体客户端、流媒体服务器、WebRTC、Android NDK开发、IOS音视频开发等等全栈技术栈,并提供了配套的免费领取C++音视频学习资料包、技术视频/代码,内容包括(FFmpeg ,WebRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs流媒体服务器,音视频通话等等)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓