写点什么

Android 学习趋势:讲一下音视频热点知识,移动设备开发图书

用户头像
Android架构
关注
发布于: 刚刚
  • MP2

  • MP3

  • AAC

  • WMA

  • ADPCM

  • ATRAC

  • Dolby AC-3

  • Musepack

  • Ogg Vorbis

  • Opus

  • LDAC


视频




说完音频,我们来说说视频,首先得说说视频是什么?我们都知道视频是由一帧一帧联系图像构成的,所以再介绍视频之前,先得了解一下什么是图像?

图像

我们从小学习物理知识就知道,通过三菱镜就可以将光色散成不同的颜色,经过进一步研究发现,只有红?、绿(G)、蓝(B)不能被分解,所以它们被称为光的三原色。


一般我们买手机的时候会参考它的分辨率,当然是分辨率越大越好,因为越大越清晰,更接近事物的原始样貌,那这是为什么呢?


其实为了让人能够在手机上感知图像,也采用了这样的 RGB 模式。以“1080x1920”为例,那就是每一个横向就有 1080 个像素点,纵向有 1920 个像素点,那总共就有 1080x1920=2073600 个像素。每一个像素又包含了红?、绿(G)、蓝(B)三个子像素,这样每个像素就可以有自己的全部颜色呈现。


图像表示


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


们知道红?、绿(G)、蓝(B)都可以使用 00~FF 或者 0~255 表示,由上面我们知道 8 比特刚好可以表示 0~255,一个像素又包含了红?、绿(G)、蓝(B)三个子像素,那一个像素至少需要 24 位,我们一般还要给颜色加上一个不透明度(A),所以一个像素其实是 32 位,这种表示方式就是我们常用的RGBA_8888,那如果一张图片要在上面分辨率的手机上全屏展示出来需要多大的空间呢?


108019204 = 8294400b = 8100kb = 7.91Mb


这也是位图(bitmap)在内存中所占用的大小,每一张图像的裸数据都是很大的,所以在手机上如果直接加载 bitmap 的话,很快就会内存溢出。所以如果让图像直接在网络上行走的话肯定是不行的,一般都会进行一个压缩,常见的压缩格式有:


  • BMP - 无损压缩

  • PNG - 无损压缩

  • JPEG - 有损压缩


这是就是为什么在制作小图(比如 icon)的时候使用png格式,而大图采用jpeg的原因,小图经过无损压缩放大之后不让其太过模糊,大图保证其能够清晰即可。

视频表示

视频的裸数据我们一般使用 YUV 来进行表示,YUV 也是一种颜色编码方式,为什么不使用 RGB 呢?与 RGB 视频信号传输相比,它最大的优点在于只需要占用极少的频宽(RGB 要求三个独立的视频信号同时传输)


“Y”表示明亮度(Luminance、Luma),也称灰阶值;“U”和“V”则是色度,它们的作用是描述影像的色彩及饱和度,用于指定像素的颜色。如果忽略掉 UV,那就是只剩下灰(Y),那就跟以前黑白电视机信号一样了,所以 YUV 的发明了是为了从黑白电视过渡彩色电视而发明的。


UV 又由 Cb 和 Cr 来描述,Cb 反映的则是 RGB 输入信号蓝色部分与 RGB 信号亮度值之间的差异,而 Cr 反映了 RGB 输入信号红色部分与 RGB 信号亮度值之间的差异。UV 信号告诉了显示器使得某个颜色亮度依某个基准偏移, UV 的值越高,代表该像素会有更饱和的颜色。


为节省带宽起见,大多数 YUV 格式平均使用的每像素位数都少于 24 位。主要的抽样(subsample)格式有 YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1 和 YCbCr 4:4:4。YUV 的表示法称为 A:B:C 表示法:


  • 4:4:4 表示完全取样,与 RGB 类似

  • 4:2:2 表示 2:1 的水平取样,垂直完全采样。

  • 4:2:0 表示 2:1 的水平取样,垂直 2:1 采样。

  • 4:1:1 表示 4:1 的水平取样,垂直完全采样。


我们再对 1080x1920 手机上展示视频一帧的数据量大小如下:


| YUV 格式 | 大小 (1080x1920 分辨率) |


| --- | --- |


| 444 | 1080* 1920* 3=6220800b = 6075 kb = 5.93Mb |


| 422 | 1080* 1920* (1+0.5+0.5) = 4147200 b = 4050 kb = 3.96Mb |


| 420 | 1080* 1920* (1+0.5+0) = 3110400 b = 3037.5 kb = 2.97Mb |


| 411 | 1080* 1920* (1+0.25+0.25) = 3110400 b = 3037.5 kb = 2.97Mb |


从上图中我们可以看到,如果使用 YUV420 一帧会比直接使用 RGB 少了近 3M,这也就是为什么使用 YUV 而不是用 RGB 的主要原因。


需要注意点是一般视频都是使用的 YUV4:2:0,YUV4:2:0 并不是说只有 U(即 Cb), V(即 Cr)一定为 0,而是指 U:V 互相援引,时见时隐,也就是说对于每一个行,只有一个 U 或者 V 分量,如果一行是 4:2:0 的话,下一行就是 4:0:2,再下一行是 4:2:0…以此类推。


怎么让 YUV 转化成 RGB 数据在手机上呈现呢?这就需要一个转化公式了




到此我们就知道视频是怎么回事了,视频的是由一帧一帧图像组成,一帧图像又是由 YUV 裸数据组成,而 YUV 裸数据是可以与 RGB 互相转化的,最终呈现在手机上的是转化后的 RGB。

视频编码

在介绍编码之前,我们先介绍两个概念:


  • 帧率(fps) - 测量单位时间(s)显示的帧数,一般视频中使用 24fps 就可以了。对于游戏来讲,如果帧率少于 30fps 就会出现不连贯,也就是我们平常说的卡顿。

  • 比特率 - 测量单位时间(s)数据量大小。


我们就可以计算一下在 1080* 1920 的手机上播放 YUV420 视频数据的比特率:


bitRate = 1080* 1920* (1+0.5+0)* 24 = 71.2 Mbps


还可以得出 90 分钟电影数据量:


total = bitRate * 60 * 90 = 375.42 GB


这对于我们来说是肯定不能接受的,所以就必须对其进行编码,跟音频编码类似,一般采用压缩编码,不然就没得玩咯~


与音频编码不同,视频数据之间有很强的关联性,也就是由大量的冗余信息,包括时间上的冗余信息和空间上的冗余信息。


  • 时间上的冗余信息(temporal redundancy)- 在视频数据中,相邻的帧(frame)与帧之间通常有很强的关连性,这样的关连性即为时间上的冗余信息。

  • 空间上的冗余信息(spatial redundancy)- 在同一张帧之中,相邻的像素之间通常有很强的关连性,这样的关连性即为空间上的冗余信息。


现在常见的视频编码有两个系列:


  • MPEG 系列 - 包括 Mpeg1(用于 VCD)、Mpeg2(用于 DVD)、Mpeg4 AVC(现在流媒体使用最多的就是它了)

  • H.26x 系列 - 包括 H.261、H.262、H.263、H.264(现在视频使用的最多就是它了)

IPB 帧

MPEG 定义了 I 帧、P 帧、B 帧,并根据不同帧实现了不同的压缩算法


  • I 帧 - 帧内编码帧,就是通过压缩算法压成一张单独的完整视频画面,也是一组的第一帧,所以 I 帧去掉的是视频帧在空间维度上的冗余信息。

  • P 帧 - 前向预测编码帧,需要参考其前面的一个 I 帧或者 P 帧来解码成一张完整的视频画面 。

  • B 帧 - 双向预测内插编码帧,需要参考其前一个 I 帧或者 P 帧及其后面的一个 P 帧来生成一张完整的视频画面,所以 P 帧与 B 帧去掉的是视频帧在时间维度上的冗余信息。


注意:


在 I 帧中有一个特殊的帧IDR,它也是一个 I 帧,如果在视频编码过程中出现一个 IDR 帧,那么就意味着之后所有的帧不能再参考前面的帧了,其作用就相当于一个分水岭。


前面我们说到,视频是由一系列图像组成,每个图像就是一帧。图像是一组一组处理的,一组帧常用的结构由 15 个帧组成,具有 IBBPBBPBBPBBPBB 形式,一组帧又叫GOP,可以参考下图



从上图可以看到解码顺序和显示顺序是不一样的,但是如果没有 B 帧的话,那就是相同的了。


以上就是音视频基础的相关内容,大家如果有不明白或者不正确的地方,请在下方评论区留言,我们一起讨论。


学习音视频不容易,光基础就是一个小难题!我觉得最好的方式有非常好的课程,可以循序渐进,有条理、系统的学习,给大家推荐 Android 架构师的经验教学视频


音视频从零到高手开发


里面包含 FFmpeg 编解码专题,MediaCodec 视频编辑专题,直播推流专题,WebRtc 视频会议专题。带你全面深入音视频编码原理,掌握音视频开发技巧。


如果你想学习音视频基础知识,音视频处理、编辑、特效相关的内容就重点学习 ffmpeg。如果你想学习音视频实时通讯(如音视频会议、在线教育)就重点学习 WebRTC 相关内容。

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android学习趋势:讲一下音视频热点知识,移动设备开发图书