音视频笔记(三)

410 阅读2分钟

解码

软解码:cpu直接解码。

硬解码:dsp芯片直接解码,指的是系统将文件(例如flv)分离成H.264视频数据量和acc音频数据流,然后再将H.264视频数据量转交给dsp芯片进行处理,dsp将处理好的一帧帧画面交给CPU、GPU然后显示在屏幕上。。

CPU软解码的话兼容性会比较高,各种格式都能兼容,但是会占用cpu大量性能。硬解码优缺点与之相反

考虑兼容性:硬解码再软解码

一段视频(例如.MP4文件),cpu调用seek->dsp创建解码任务,设置路径,读文件,开始解码,再把解码数据(YUV)给GPU -> GPU。

cpu发seek后除了接收回调信息以讲解目前进度外不用做其他事了,这是硬解之所以高效的原因(个人理解)

dsp芯片能访问磁盘。

mediacodec:硬解码,用来调用dsp

如何判断mediacodec是否支持这种编码格式?

可以实例化MediaCodec对象,如果实例化成功则代表该设备支持。

mediacodec的解码流程:硬解时,dsp给cpu提供空的容器,cpu把h264之类的数据填入容器中,再给dsp,dsp将数据解析为yuv数据,再塞入容器中给cpu,至此,cpu拿到数据就可以进行显示了(个人理解)

编码

全量配置帧:sps,帧类型(0x67), 包含纠错单元、优先级顺序、策略信息、编码等级等。

基础配置帧:pps,帧类型(0x68), 只包含yuv数据。

编码器只会输出一个sps、pps。两者是成对存在的。一个视频里会有n个一模一样的sps、pps。因为会缓存,是解码的加进去的。为了方便从某一帧直接开始解码(个人理解)。

如果sps、pps发生变化,只能重新初始化编码器,此时会黑屏,横竖屏转换也是一样。如果不重新初始化只能用之前的sps、pps或是状态异常。

帧类型编码解析

以上帧类型实际包含三个数据,是否可用(1bit)、重要性(2bit)、帧类型(6bit)。

是否可用:0可用,1不可用。不可用得原因可能是解析出错或者其他原因,这样解码器就不用解析错误的数据。

重要性:11(最重要),10(重要),01(一般),00(不重要)

帧类型帧类型.png

所以sps的0x67应该这样理解:0110 0111, 0代表可用,11代表重要性,00111为7代表帧类型(序列才数据),计算时&上0x1f, 0001 1111。