投屏音视频基础知识-千里马安卓framework手把手带你做投屏

音频

1、声音的基础知识

声音的产生是由于物体的振动,造成空间内空气的波动而共鸣发音,再由大气的传播,使人的听觉神经感受到的一种物理现象。

声音的三要素是响度,音调和音色。

响度
和声音震动的幅度有关,用的力越大,人的鼓膜震动幅度就越大,发出的声音越响。

音调
主要是和频率有关。声波的频率越高,音调也越高。

音色
在同样的音调(频率)和响度(振幅)下,钢琴和小提琴的声音听起来是完全不相同的,因为它们的音色不同。

声音传播的介质是固体、液体、气体。介质不同,传播的速度也不同。真空的情况下声音是无法传播的。

2、数字音频

对自然界的声音(模拟信号)进行采样,采样就是根据奈奎斯特定理在时间轴上对信号进行数字化信号,即按照一定时间间隔△t 在模拟信号 x(t)上逐点采取其瞬时值。采样率越高,声音的还原程度越高,质量就越好,同时占用空间会变大。

量化是用有限个幅度值近似原来连续变化的幅度值,把模拟信号的连续幅度变为有限数量的有一定间隔的离散值。

编码是按照一定的规律,把量化后的值用二进制数字表示,然后转化成二值或多值的数字信号流。这样得到的数字信号通过可以通过电缆,卫星通道等数字线路传输。在接收端与上述模拟信号数字化过程相反,再经过后置滤波再恢复成原来的模拟信号。

上面数字化的过程又叫做脉冲编码调制,通常我们说的音频的裸数据格式就是脉冲编码调制(PCM)数据。

描述一段 PCM 数据需要几个量化指标,常用的量化指标是采样率,位深度,字节序,声道数。

采样率(Sample rate):每秒钟采样多少次,以 Hz 为单位。

位深度(Bit-depth):表示用多少个二进制位来描述采样数据,一般为 16bit。

字节序:表示音频 PCM 数据存储的字节序是大端存储(big-endian)还是小端存储(little-endian),为了数据处理效率的高效,通常为小端存储。

首先明白字节序,字节序指占内存超过1个字节类型的数据在内存中存放顺序,通常有大端和小端两种顺序:
在这里插入图片描述在这里插入图片描述

声道数(channel number):指支持能不同发声(注意是不同声音)的音响的个数;单声道(1 个声道),双声道(2 个声道)等;

3、音频压缩编码

以 CD 音质来说,量化格式是 2 字节,采样率是 44100,声道数是 2,这些信息就描述了 CD 的音质。那么 CD 的数据采样率 =44100x16x2=1378.125kbps, 在 1 分钟的时间里 ,需要占用的存储空间=1378.125 * 60/8/1024=10.09MB。直接存储这个大小音频的话其实并不小。

压缩算法包括有损压缩和无损压缩。

常用的音频编码方式有以下几种:

MP3,MPEG-1 or MPEG-2 Audio Layer III,是曾经非常流行的一种数字音频编码和有损压缩格式 , 它被设计来大幅降低音频数据量 。

AAC,Advanced Audio Coding,是由 Fraunhofer IIS、杜比实验室、AT&T、Sony 等公司共同开发, 在 1997 年推出的基于 MPEG-2 的音频编码技术。AAC 比 MP3 有更高的压缩比,同样大小的音频文件,AAC 的音质更高。

视频相关

视频基本概念

(1)根据视觉暂留原理,连续的图像变化每秒超过24帧(Frame)画面以上时,人眼无法辨别单幅的静态画面,看上去是平滑连续的视觉效果,这样连续的图像画面构成即视频。
在这里插入图片描述

(2)一个完整的视频文件主要由音频和视频两部分组成的,视频编码是为了压缩视频数据而做的一种压缩算法,是音视频质量的决定因素;视频封装格式也叫做容器 Container,它是将已经编码压缩好的视频流、音频流以及元数据按照一定的结构规则编排放到一个文件中,不同封装格式编排规则不一样,应用场景和优点也不同。
视频文件的播放流程
在这里插入图片描述

像素:
屏幕显示是把有效面积化为为很多个小格子,每个格子只显示一种颜色,是成像的最小元素,因此就叫做“像素”。

分辨率:
屏幕在长度和宽度这俩个方向上各有多少像素,就叫做分辨率,一般用 AXB 来表示。分辨率越高,每个像素的面积越小,显示效果就越平滑细腻。

每一个像素点的 RGB 通道分别对应屏幕位置上的子像素点绘制到屏幕上,进而显示整个图像。

1、RGB 表示图像

一张图像是由每个像素点绘成的,那么一像素点的 RGB 又该如何表示呢?

浮点表示

归一化表示,取值范围 0.0~1.0,如 openGL 对每个子像素点的表示方式。

整数表示

取值范围 0~255 或者 00~FF,8bit 表示一个子像素。

如图像格式 RGBA_8888,表示 4*8bit 表示一个像素,而 RGB_565 用 5 + 6 + 5 bit 表示一个像素。一张 1280 * 720, RGBA_8888 格式的图片的大小= 1280 * 720 * 32bit = 1280 * 720 * 32 / 8 byte,也是位图在内存中占用 的大小。所以每一张图像的裸数据都是很大的。

2、YUV 表示图像

YUV (又称为 YCbCr),一种亮度与色度分离的色彩格式;

Y : 亮度,即灰度值,除了表示亮度信号外,还含有较多的绿色通道量;

U : 蓝色通道与亮度的差值;

V : 红色通道与亮度的差值;

YUV 的优势,人眼对亮度敏感,对色度不敏感,因此减少部分 UV 的数据量,人眼无法感知,从而可以通过压缩 UV 的分辨率, 在不影响观感的前提下,减小视频的体积;

视频帧裸数据之所以采用 YUV 色彩空间,使用为亮度信号 Y 和色度信号 UV 是分离的。当无 UV 色度信号,只有 Y 亮度信号时,那么这样表示的图像就是黑白灰度图像。彩色电视正是使用 YUV 空间使用 Y 亮度信号解决彩色电视与黑白电视的兼容问题、使黑白电视也能接收彩色电视信号。最常用的 YUV 都使用 8 个 字节来表示,所以取值范围就是 0~255。

音频最开始需要采样,图像也是一样的,YUV 最常用的采样格式是 4:2:0。

YUV 格式有两大类:planar 和 packed
YUV420 Planar

YYYY
YYYY
UU
VV

YUV 444 Packed

YUV YUV
YUV YUV

YUV 码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2, YUV4:2:0。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

YUV 4:4:4 采样,每一个 Y 对应一组 UV 分量。YUV 4:2:2 采样,每两个 Y 共用一组 UV 分量。YUV 4:2:0 采样,每四个 Y 共用一组 UV 分量。

3、YUV 和 RGB 转化

凡是渲染到屏幕上的东西(文字、图片或者其他),都要转换为 RGB 的表示形式,那么 YUV 的表示形 式和 RGB 的表示形式之间是如何进行转换的呢?

为了实现格式转换,我们首先要明确待转换格式和目标格式的特点和相互转换关系,这是编程实现转换的核心。对于 RGB 转 YUV 的过程,我们要首先拿到 RGB 文件的数据,再通过上图的 YUV 计算公式对其做 运算,得到 YUV 数据,从而实现转换。而对于 YUV 转 RGB 则要首先获得 YUV 数据,用第二组 RGB 公式计 算得到 RGB 数据。在本实验中,转换公式如下。

Y = 0.298R + 0.612G + 0.117B;
U = -0.168R - 0.330G + 0.498B + 128;
V = 0.449R - 0.435G - 0.083B + 128;

R = Y + 1.4075( V - 128);
G = Y - 0.3455( U - 128) - 0.7169( V - 128);
B = Y + 1.779( U - 128);

视频编码

视频压缩必要性

以常见的1080P60的视频计算一下没有压缩时数据量的大小(按红绿蓝三原色各一个字节数据量计算)

一秒钟数据量:1920(宽)x 1080(高)x 60(每秒帧数)x 3(像素3原色字节)= 373.248MB = 2.98Gbs

一小时数据量:373.248MB x 3600秒 = 13.43T字节/小时

这个数据量很大,近3G的原始数据量在任何常规网络上都无法实现视频的传输。因此我们就需要一种数据处理方式将海量的原始图像数据压缩到可在互联网上传输的数据量,这个过程叫做视频的编码。

视频压缩原理

帧内压缩

(1)将帧画面进行分层压缩(Y层:亮度相关、cr层:颜色相关、cb层:颜色相关),人对黑白亮度非常敏感,对颜色不太敏感,所以Y层尽量减少压缩,cr层、cb层多压缩。

(2)宏块压缩:一帧画面可以分层很多方块,相同的方块可以压缩,不同的保留

帧间压缩

I帧:关键帧,记录一帧完整的数据

P帧:前向帧,记录本帧与前一帧不同的数据。

B帧:双向帧,记录本帧与前帧和下一帧不同的数据。

在这里插入图片描述

帧与帧率

帧,视频的一个基本概念,表示一张画面,一个视频就是由许多帧组成的;

帧率,即单位时间内帧的数量,单位为 : 帧/秒 或 fps(frames per second),帧率越高则画面越顺滑过渡越自然;

硬解码和软解码

软解码,指利用 CPU 的计算能力来解码,通常若 CPU 的能力不是很强的时候,一则解码速度会比较慢,二则手机可能出现发热现象;但是, 由于使用统一的算法,兼容性会很好;

硬解码,指的是利用专门的解码芯片来加速解码,通常硬解码的解码速度会快很多,但是由于硬解码由各个厂家实现,质量参差不齐,非常容易出现兼容性问题;

具体详情试看方式:
投屏专题部分:
https://mp.weixin.qq.com/s/IGm6VHMiAOPejC_H3N_SNg

更多framework详细代码和资料参考如下链接

hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
在这里插入图片描述

其他课程七件套专题:在这里插入图片描述
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

视频试看:
https://www.bilibili.com/video/BV1wc41117L4/

参考相关链接:
https://blog.csdn.net/zhimokf/article/details/137958615

更多framework假威风耗:androidframework007

  • 27
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值