音视频知识总结

340 阅读5分钟

这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战

音视频知识总结

YUV、H264是音视频编码中不可缺少的部分,初次接触总是一头雾水,不知道从何下手。干货一般都是晦涩的,文章尽量用简短方便记忆的方式进行记录总结。

一、YUV

1. YUV 概念

调查研究发现,人类对于亮度的敏感程度大于色度,基于这个原理,有一个编码应运而生,它降低了色度,保留了亮度,满足了人类的感知能力,同时又减少了带宽的占用。

这种编码的方式就叫做 YUV

“Y”表示明亮度,也就是灰阶值,“U”和“V”表示的则是色度。

它常常用在处理视频的场景中。

在黑白视频的年代,只有Y(Luma,Luminance)视频,也就是灰阶值,后来有了彩色视频,就有了 U、V

设计YUV的目的:为了减少带宽占用

2. YUV采样格式和存储方式

YUV 的采样和存储方式比较复杂,主要分为以下采样方式,建议通过链接去阅读。 图解:www.cnblogs.com/schips/arch… 采样存储: blog.csdn.net/newarow/art… (1) YUV 4:4:4 (2) YUV 4:2:2 (3) YUV 4:1:1 (4)YUV 4:2:0

二、H264 编码

1.网传一段这样的解释

引用:H264生成帧的原理:参照一段时间内图像的统计结果表明,在相邻几幅图像画面中, 一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内。所以对于一段变化不大图像画面,我们可以先编码出一个完整 的图像帧A,随后的B帧就不编码全部图像,只写入与A帧的差别,这样B帧的大小就只有完整帧的1/10或更小!B帧之后的C帧如果变化不大,我们可以继续 以参考B的方式编码C帧,这样循环下去。这段图像我们称为一个序列(序列就是有相同特点的一段数据),当某个图像与之前的图像变化很大,无法参考前面的帧 来生成,那我们就结束上一个序列,开始下一段序列,也就是对这个图像生成一个完整帧A1,随后的图像就参考A1生成,只写入与A1的差别内容。

上面一大段话是什么含义呢,意思就是我们有关键帧,其它的非关键帧我们就根据关键帧去计算,怎么计算呢,我们就把画面划分成很多小块去对比,这样就能够达到无损压缩的效果。

2. I帧、P帧、B帧

  • I帧:关键帧。 它是完整的画面保留,就算仅有关键帧也能解析出该帧的画面,可以完全还原。分隔符:帧前面带有00 00 00 01 或 00 00 01

  • P帧:差别帧。 解码时必须要配合关键帧,通过前面的关键帧才能生成完整画面,因为差别帧是在关键帧的基础上做的计算

  • B帧:双向差别帧 必须通过前后帧才能确定该帧的画面,由于计算率比较大,这部分耗费的计算也比较多。

3. H264码流中SPS PPS

注意:H265中增加了VPS

内容来自:zhuanlan.zhihu.com/p/27896239

SPS即Sequence Paramater Set,又称序列参数集。里面保存这一些配置信息,比如压缩率、yuv的格式等

Picture Paramater Set(PPS)。又称图像参数集 也是保存配置信息,比如视频的宽和高

4. H264的帧

H.264中,每帧的分割符为00 00 00 01 或者00 00 01。 如果码流中刚好存在界定符,编码的时候会进行转义。

例如下面是一个H264的文件片段 00 00 00 01 67 42 C0 28 DA 01 E0 08 9F 96 10 00 00 03 00 10 00 00 03 01 48 F1 83 2A 00 00 00 01 68 CE 3C 80 00 00 01 06 05 FF FF 5D DC 45 E9 BD E6 D9 48 B7 96 2C D8 20 D9 23 EE EF …

第一帧是00 00 00 01 67 42 C0 28 DA 01 E0 08 9F 96 10 00 00 03 00 10 00 00 03 01 48 F1 83 2A 第二帧是00 00 00 01 68 CE 3C 80 第三帧是00 00 01 06 05 FF FF 5D DC 45 E9 BD E6 D9 48 B7 96 2C D8 20 D9 23 EE EF ..

帧类型有:

NAL_SLICE = 1 非关键帧 NAL_SLICE_DPA = 2 NAL_SLICE_DPB = 3 NAL_SLICE_DPC =4 NAL_SLICE_IDR =5 关键帧 NAL_SEI = 6 NAL_SPS = 7 SPS帧 NAL_PPS = 8 PPS帧 NAL_AUD = 9 NAL_FILLER = 12

解释:

在码流中为了不浪费空间,实际上是按位来表示内容的。 比如第一个分割符之后的十六进制是67。
十六进制:67
对应的二进制:0110 0111
由高到低划分:

  • 1位(0,禁止位,初始为0,解析错误时是1,以便接收方纠错或丢掉)
  • 2位(11,标志Nal的重要性)
  • 5位(00111,帧的对应类型)

所以取出后5位的运算为:0x67 & 0x1f = 7,即对应sps帧。

5. dsp芯片

DSP芯片即指能够实现数字信号处理技术的芯片。 抖音,剪影用的是 dsp芯片,ffmpeg会比较慢,电视中也是用了dsp用来解码和播放视频。Dsp有好有差,目前不是所有的dsp都支持 4k和 8k。 硬解码的速度很快,但是兼容性要差一些,据说高通和联发科调用方法不一致。

三、ffmpeg 学习总结

1.什么是ffmpeg

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。 对音视频的处理具有强大的功能。

2.下载安装地址

从 2020.09.18 开始原来的 ffmpeg.zeranoe.com/builds/ 已经彻底关闭

新的编译下载地址移到 github.com/BtbN/FFmpeg…

3.常规命令

  • MP4 转 h264文件 ffmpeg -i input.mp4 -vcodec h264 output.h264
  • 播放h264文件 ffplay output.h264