1.学习音视频需要一个非常长的周期,在这个周期内需要你不断的强迫自己接受新的知识,并且将某些东西发挥到极致才会有所有收货,下面先简单罗列一下接下来的学习过程
视频如何解包装
下面是播放视频的过程,至于这个过程怎么来的,大致了解了一下,
一个可以被播放的视频,内容大致分为3个
1.音频 单通道 双通道 环绕声(多通道) 等等
2.视频数据
3.字幕数据,目前这个国内用到的比较少
了解了这些就可以继续向下分析播放整个过程了
视频播放需要将视频内容拆分
一个视频播放需要经过这么多到流程,为什么还要这么做呢
音频 与 视频的采集都会随着频率 质量影响,设定的参数越大就会导致原始数据的内容膨胀的非常快,原始数据的膨胀就意味着数据传输上带来的额外的开销与不稳定性,那么就需要对视频与音频进行压缩传送,现在主流的音频压缩大多数都在使用AAC ,这个编码格式在同样音质的情况下,可以将内容压缩的更小,视频大多都使用的H.264 H.265 格式, 也就是 I P B 帧压缩思路
视频的编码过程是一个比较复杂的过程,但是如何压缩视频呢,我就就从每一帧来分析
1.空间冗余:通过算法去除相邻相似度非常高的内容
2.时间冗余:在视频拼装的过程中,保留第一帧与第二帧之间的变化信息,在播放时利用完整帧 与 只保留变化帧合成新的帧
3.视觉冗余:某些相似的颜色在人类看起来是没有差别的,或者说感受不到差别,那么这类信息统一后,可以让信息变得更小,在使用方法1,则可以进行图片压缩,
4.哈夫曼算法能去除编码信息的冗余
I帧 主要帧 原始图像 显示-->在渲染过程中只需要关注帧内信息 压缩情况--> 基本没有信息压缩
P帧 变化帧 记录与I帧的信息差, 显示-->需要与前面的主要帧合成新的帧图像 压缩情况--> 压缩情况比 I 帧 高,但是比B 帧低
B帧 变化帧 记录与前面I 帧 和 后面 帧的信息差 , 显示--> 图片合成过程比较复杂,需要前后两个帧都参与进来 压缩情况-->压缩率最高
各种压缩方式也需要结合实际情况来使用,就比如直播业务需要较高的数据实时性与性能的要求,在编码过程中就需要尽量减少B帧的数量,来减少计算合成帧的过程,过度的压缩就会带来解码过程中性能的损耗,发热 电量等其他问题也会随之出现
现在主流的视频编码方式是 H264 与 H265,他们会有非常多的叫法
H.264 == MPEG-4 AVC 简写 AVC
H.265 == HEVC
H.264 分层结构
VCL: 数据编码层
NAL:网络提取层
关于VCL 与 NAL 的介绍都比较笼统,但是把他们想象成 客户端想服务端发起请求的过程就比较好理解了 VCL 的主要功能就是讲 数据封装成一个javaBean ,而 NAL 则是将javaBean 序列化成为一个 json数据,发送给服务端
视频信息在传输过程中都是 NALU 的数据包来传出的,而 NALU 的数据包又包含了下面3个信息
- NALU 间隔符 ,在数据传输过程中会存在非常多的 NALU ,我们使用下面的示例来看一下
示例1-->NALUNALUNALUNALUNALUNALUNALUNALUNALUNALU
示例2-->|NALU|NALU|NALU|NALU|NALU|NALU|NALU|NALU|
从上面这个例子就能很好的将一个个NALU 数据包分割出来
2.数据头 他是一个16进制的数据, 将他转换为二进制后,有可以将这部分数据分成了3个组
0 00 00000
将低 五位转化为 16进制后,就可以根据 H.264 信息对照表来查看 这个NALU 数据的内容 SPS PPS 等信息就是利用它来区分的
第2-3位来表示的是这个数据的重要性 11 代表非常重要 而 00 就代表非常不重要
第一位用来表示这个信息是否可用的,0 可用 1不肯用 , 没有明白他的设计初衷,是为了方便在视频中夹带私货? 搞不清楚
在音视频开发领域过程中,我们需要经常分析 SPS PPS 与 I帧
而且伴随着 B 帧的内容是与 前后帧都有关系的,那么在实际开发过程中 就产生了2个顺序,也就是 解码顺序与播放数据 ,这个概念也是非常重要的
网友评论