一、前言:
今天继续给大家分享最近星球上的星友音视频面试题目,希望对大家有用!
下面是具体面试问的问题:
二、面试题目:
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、SPS和PPS的区别:
SPS和PPS都是H264最开始的两个识别帧,若解码器没有识别出SPS和PPS则会无法正常解码出视频。但是这两个识别帧,也有很多不同。
SPS:中文全称是序列参数集,它主要包含了一连续编码序列的参数,比方说标识符seq_parameter_set_id、帧数、POC约束、参考帧数目、解码图像尺寸等信息。
PPS:中文全称是图像参数集,它主要包含的是一个序列中的某几张图像。这其中包括pic_parameter_set_id、可选的seq_parameter_set_id、片组数目、初始量化参数等。
4、FLV格式为何常用在直播流媒体协议:
FLV的特点是封装后的音视频文件大小相对比较小、封装规范相对比较简单,所以FLV格式非常适用于网络传输。尤其在RTMP网络流媒体传输中,FLV占据着统治地位。一般FLV格式如下图:
FLV封装格式一般由FLV Header和FLV Body组成。这里面FLV Body是由一对(Previous Tag Size字段 + Tag)组成。Previous Tag Size字段排在Tag之前,占用4个字节。Tag通常分为三种类型:
脚本数据类型
音频数据类型
视频数据类型。
5、TCP或者UDP传输视频码流的时候出现了粘包的情况,要如何解决:
所谓的视频流粘包,就是指一段视频码流无法识别出一帧完整的视频帧。我的回答是通过FFMPEG的抽帧api av_read_frame把每一个码流中的每一帧H264/H265码流获取到,并且通过内部的标识符00 00 00 01进行分割,最终分割成sps+pps+i作为一帧完整的视频帧。这样就可以解决TCP、UDP粘包的情况。
三、最后:
最后分享一个篮球励志故事,在昨天的湖勇大战中,朗尼沃克超神发挥;从赛季进入湖人慢慢打上首发位置,但由于伤病等原因,跌出了首发位置,甚至成了饮水机球员,但是朗尼沃克从不忘记刻苦训练,G4终于证明了自己!这就是坚持的意义。
莫愁前路无知己,天下谁人不识君!
如果大家确实对嵌入式音视频感兴趣的话,可以加入星球来学习,大家关心的,视频课程有没有期限,这个放心,是永久的,也不会说让大家后期交什么其他的费用。
下面是第一部分课程内容:
星球入口:
个人微信: