Android中的音视频(1)|青训营笔记(二)

简介: 关于音视频,我们需要先了解如下的知识

视频压缩

若是视频未压缩,一个时长接近两个小时,分辨率为4k的视频,其大小会超过400GB。所以视频的压缩是尤为重要的。

颜色空间

YUV色彩空间不同于RGB,是另一种颜色数字化的表达方式,由于RGB不利于压缩,所以在视频系统中多会采用的是YUV。YUV体系中,不同于RGB的是,其有一个亮度的概念,其中Y表示色度,U和V表示亮度。由于人对亮度的敏感程度要大于色度,所以我们可以通过着重于提升亮度,减低色度,从而达到不降低分辨率的同时压缩视频的效果。

YUV 其实目前有 三种分类:

1,YIQ 适用于NTSC彩色电视制式

2,YUV 适用于PAL和SECAM彩色电视制式

3,YCrCb 适用于计算机用的显示器

我们做互联网音视频开发, 一般说的 YUV 是 指 YCbCr ,U 就是 Cb,V 就是 Cr。

大家经常在一些音视频书籍看到 YCbCr ,把它当成是 YUV 就行。实际上 YCbCr 才是比较准确的术语,JPEG、MPEG 标准 用的也是 YCbCr

1.webp.jpg

上图的第一张是原图,下面的三张分别是 Y Cb Cr。这张图是并未降低色度进行降采样的,事实上我们把色度降采样后拼起来的原图效果是一样的。

1.webp.jpg

对色度降采样

YUV采样格式的压缩

1.webp.jpg

帧内压缩

帧内(Intraframe)压缩也称为空间压缩(Spatial compression)。

当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,达不到很高的压缩比。

1.webp.jpg

如上图,将图片分为多个小方块,对于色值相同的小方块,我们只需要记录一个小方块的数据,其他的就引用该方块的数据即可。

帧间压缩

帧间压缩(Interframe compression)也称为时间压缩(Temporal_compression),是基于许多视频或动画的

连续前后两帧具有很大的相关性(即连续的视频其相邻帧之间具有冗余信息)的特点来实现的。

通过比较时间轴上不同帧之间的数据实施压缩,进一步提高压缩比.一般是无损压缩。

=>对于画面中静态的不去记录处理它,只去记录变化的画面,称之为记录残差。在呈现的时候,叠加残差值即可获得后面的帧的画面了。

帧的编码类型

I-frame:Intra-frame 帧内帧 (不会依赖其他帧,靠自己就能绘制出完整的画面,压缩比小)

P-frame:Predicted Frame 前向预测帧 (依赖前面的帧,叠加残差值绘制出画面,压缩比较高)

1.webp.jpg

B-frame:Bi-Directional frame (双向预测帧,参考前后的帧)

由于B帧可以参考和插入在它之前和之后发生的两个(或更多)帧(在时间维度上),所以它可以显著降低帧的大小,同时保持视频质量。B帧能够利用空间冗余和时间冗余(未来的帧和过去的帧),这使得它在视频压缩中非常有用。

1.webp.jpg

上图中的第一行数字是帧展示的顺序,第二行数字是帧的解码顺序。上图我们就可以看到,先解码I帧后,就去解码了第四个位置的p帧,然后中间的P帧就依赖这两个前后帧来进行解码。(解码顺序:I->P->B)

1.webp.jpg

对比表格

1.webp.jpg

当拖动进度条,视频改变播放进度后,如果不在同一个 GOP 中,需要从新位置所在的 GOP 的 I 帧开始解码(一定是从I帧开始解码的)

拖动后起播所需的耗时取决于位置在 GOP 中的位置,越靠前能越快响应

不同场景对 GOP 的设置

视频点播:节省带宽,高压缩率,会使用 B 帧

直播:低延迟,不使用 B 帧

视频编辑:提高响应,个别会使用全 I 帧

视频编码格式

现下的编码格式(后者压缩比都比前者提高一倍)有:

  • H265 压缩比更高,需要更多的算力
  • H264 : AVC 更普及
  • H265 : HEVC 更小体积


相关文章
|
3月前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
152 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
3月前
|
Unix Linux Shell
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
在Linux环境下交叉编译Android所需的FFmpeg so库,首先下载`android-ndk-r21e`,然后解压。接着,上传FFmpeg及相关库(如x264、freetype、lame)源码,修改相关sh文件,将`SYSTEM=windows-x86_64`改为`SYSTEM=linux-x86_64`并删除回车符。对x264的configure文件进行修改,然后编译x264。同样编译其他第三方库。设置环境变量`PKG_CONFIG_PATH`,最后在FFmpeg源码目录执行配置、编译和安装命令,生成的so文件复制到App工程指定目录。
287 9
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
|
1天前
|
JavaScript 前端开发 Java
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
IT寒冬使APP开发门槛提升,安卓程序员需转型。选项包括:深化Android开发,跟进Google新技术如Kotlin、Jetpack、Flutter及Compose;研究Android底层框架,掌握AOSP;转型Java后端开发,学习Spring Boot等框架;拓展大前端技能,掌握JavaScript、Node.js、Vue.js及特定框架如微信小程序、HarmonyOS;或转向C/C++底层开发,通过音视频项目如FFmpeg积累经验。每条路径都有相应的书籍和技术栈推荐,助你顺利过渡。
9 3
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
|
3月前
|
监控 Unix 应用服务中间件
Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器
Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器
|
2月前
|
Java API Android开发
技术经验分享:Android源码笔记——Camera系统架构
技术经验分享:Android源码笔记——Camera系统架构
31 0
|
3月前
|
安全 Linux Android开发
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
该文介绍了如何在Linux服务器上交叉编译Android的FFmpeg库以支持HTTPS视频播放。首先,从GitHub下载openssl源码,解压后通过编译脚本`build_openssl.sh`生成64位静态库。接着,更新环境变量加载openssl,并编辑FFmpeg配置脚本`config_ffmpeg_openssl.sh`启用openssl支持。然后,编译安装FFmpeg。最后,将编译好的库文件导入App工程的相应目录,修改视频链接为HTTPS,App即可播放HTTPS在线视频。
72 3
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
|
3月前
|
Java 测试技术 开发工具
Android 笔记:AndroidTrain , Lint , build(1),只需一篇文章吃透Android多线程技术
Android 笔记:AndroidTrain , Lint , build(1),只需一篇文章吃透Android多线程技术
|
3月前
|
设计模式 缓存 前端开发
真的强!借助阿里技术博主分享的Android面试笔记,我拿到了字节跳动的offer
真的强!借助阿里技术博主分享的Android面试笔记,我拿到了字节跳动的offer
|
3月前
|
Java Android开发 设计模式
flutter音视频开发,Android开发需要学什么
flutter音视频开发,Android开发需要学什么
|
3月前
|
存储 Java API
Android系统 文件访问权限笔记
Android系统 文件访问权限笔记
348 1