掌握音视频已是一种趋势,Android音视频基础解析帮大家破除学习“高门槛

压缩编码就是对数据进行压缩,压缩编码的原理实际上是压缩掉冗余信号,冗余信号是指不能被人耳感知到的信号,包含人耳听觉范围之外的音频信号以及被掩蔽掉的音频信号等,一般压缩分为两种:

  • 有损压缩,数据经过压缩后,信息不受损失,还能完全恢复到压缩前的原样

  • 无损压缩,经过此方法压缩、解压的数据会与原始数据不同但是非常接近

在音乐应用中,我们经常看到“无损音乐”,如果你发现它是mp3格式的,那么它一定是有损压缩,也就是我们所说的假无损。常见的有损压缩如下:

  • MP2

  • MP3

  • AAC

  • WMA

  • ADPCM

  • ATRAC

  • Dolby AC-3

  • Musepack

  • Ogg Vorbis

  • Opus

  • LDAC

视频

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

图像

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

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

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

图像表示

我们知道红®、绿(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帧的话,那就是相同的了。

以上就是音视频基础的相关内容,如有不明白或者不正确的地方,请在下方评论区留言,望共勉之。


最后为了帮助大家深刻理解音视频相关知识点的原理以及面试相关知识,这里为大家整理出了一份关于音视频开发入门到进阶的学习文档:

这里给大家提供一个方向,进行音视频体系化的学习:

接下来融合学习文档一起学习效果更佳哦~

一、初级入门篇

绘制图片

AudioRecord API详解

使用 AudioRecord 实现录音,并生成wav

用 AudioTrack 播放PCM音频

使用 Camera API 采集视频数据

使用 MediaExtractor 和 MediaMuxer API 解析和封装 mp4 文件

MediaCodec API 详解

二、中级进阶篇——Android OpenGL ES 开发

OpenGL ES 介绍

OpenGL ES 环境搭建

OpenGL ES 定义形状

OpenGL ES 绘制形状

OpenGL ES 使用投影和相机视图

OpenGL ES 添加运动效果

OpenGL ES 响应触摸事件

OpenGL ES 着色器语言GLSL

OpenGL ES 纹理贴图

通过GLES20与着色器交互

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【算法合集】

【延伸Android必备知识点】

【Android部分高级架构视频学习资源】

**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

688719)]

【算法合集】

[外链图片转存中…(img-ZTh6fe6Y-1712004688720)]

【延伸Android必备知识点】

[外链图片转存中…(img-e8nLIhjN-1712004688720)]

【Android部分高级架构视频学习资源】

**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值