视频相关的问与答:
一、YUV的内存存储格式
YUV格式有很多种,比如YUV420,YUV422,YUV444等。比较常用的就是YUV420。下面是说下YUV420的存储格式:
1、交叉的(调系统摄像头采集到的是交叉的)
Y(wh)+交叉的U(wh/4)、V(w*h/4)数据
2、非交叉的(ffmpeg的AVFrame中的是非交叉的)
同上,只是UV不是交叉的
二、在ffmpeg中的YUV420的格式
AVFrame
AVFrame->data[0]:Y
AVFrame->data[1]:U
AVFrame->data[2]:V
分别对应一个linesize,这个linesize不是每一个data的大小,而是对应data中没一行的大小,这个值可能比图片的width要大。但我们取的时候,是通过height来遍历,每一行取width的大小
三、谈谈H264与H265的区别
H265编码效率更高。同样质量的一张图片,编码后,H265的大小基本为H264的一半。所以H265的出现,为2K实时传输奠定了基础。
H265编码效率高,那么编码和解码时候都会比较耗CPU和内存。H264基本全部手机都兼容,H265不兼容一些配置较差的手机,对应iphone,也要IOS11才可使用系统对应的H265的api。
四、简单谈谈OpenCL es
简单说就是直接操作GPU进行图片的渲染。OpenGL有自己的渲染管线,提供给外部修改的有顶点处理和片元处理。
顶点处理:我们可以为OpenGL提供顶点,相当于构建了图片的外部框架
片元处理:提供图片纹理填充刚才构建的外部框架的内容
然后OpenGL就帮我们写入到帧缓冲区。
所以我们在代码中主要做了:
1、创建一个渲染缓冲区,主要是关联帧缓冲区,最终展示OpenGL渲染的效果
2、提供顶点数据
3、提供图片纹理,这里可以通过纹理坐标操作图片的方向
4、进行OpenGL渲染glDrawArrays
五、简单讲下ffmpeg解码流程
1、创建解码器,AVCodec
2、构建解码上下文AVCodecContext
3、封装AVPacket
4、avcodec_send_packet与avcodec_receive_frame
流程不是特别难。主要得注意几点:
解码的视频帧编码格式,比如H264。就有Annex-B与AVCC
Annex-B通过00000001分割nal,所以解码器可以拆出来sps,pps,和帧内容
AVCC是通过长度进行分割,因为我们不知道它存储长度的字节等信息。所以还得要一个extraData,这里包含了解码的一些信息
六、ffmpeg的编码流程
过程与解码的差不多。就是在构建编码上下文AVCodecContext需要传更多的参数
//得到编码器
AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264);
//得到编码上下文
c = avcodec_alloc_context3(codec);
//设置码流
c->bit_rate = 900000;
//设置分辨率
c->width = frame->width;
c->height = frame->height;
//设置timebase
c->time_base = (AVRational){1, 15};
//设置编码前的格式
c->pix_fmt = frame->format;
//打开编码器
ret = avcodec_open2(c, codec, NULL);
其中同时配置了bit_rate与time_base,你才可以准确控制编码后的大小
七、硬解与软件的区别
假如视频流格式为H264
硬解需要自己去配置sps,pps信息
ffmpeg软解不需要
硬解占用的cpu和内存比软解低
硬解如果发现一个gop里面一帧有问题,可能gop剩下的帧都不会去解析,等待下一个gop到来。软解发现gop里面其中一帧有问题,还是会去尝试解析gop剩下的帧,有可能会导致花屏
八、说说做视频实时播放遇到什么难点
我觉得做视频播放,开发功能可能不是特别难。
难点在于解决Bug与优化
bug,比如说花屏,蓝屏,音视频不同步,串流
就拿花屏来说,怎么解决呢?
1、p2p过来的包,一个比较大的视频帧可能会分几包过来。这时候就需要拼包成完整的一帧
2、等主帧过来了再开始解码,进行了丢帧操作,需要等下一个主帧过来。
3、用硬解,可以减少花屏
4、通过唯一标志位,避免串流
如果上面都做了,还是花屏,这时候就得分析下源视频流是否就有问题
可以把视频流采集下来。然后通过ffmpeg指令转为mp4格式,如果你实时播放的时间点的花屏与ffmpeg转的mp4对应的点都是花屏的,那很有可能流本来就有问题。
优化部分,比如说要减少卡顿,减少延迟
1、方法,需要大量实验,才能得出如何动态变码流,如何动态变帧率才是最优的。
2、如何去衡量结果
你统计的方法有说服力,那么你上报的相关视频播放数据才能让老板信服。
音频相关的问与答:
一、简单谈谈AudioUnit的原理
与其他音频播放控件不同的是,audioUnit中的每一个unit可以代表独立的一个功能,比如输入输出功能,转换音频功能,混合音频功能等。然后把它们connect起来,所以自由度很高。
刚才说的输入输出audioUnit。又可以分出两个模块,输入(element1)与输出(element0)。每一个element又包含inScope outScope
二、aac音频解码你用过多少种方法
1、直接用ffmpeg封装
2、直接调用aac SDK api进行操作
3、用系统api AudioConverterRef
网友评论