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 更小体积


相关文章
|
1月前
|
Web App开发 安全 程序员
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
多年的互联网寒冬在今年尤为凛冽,坚守安卓开发愈发不易。面对是否转行或学习新技术的迷茫,安卓程序员可从三个方向进阶:1)钻研谷歌新技术,如Kotlin、Flutter、Jetpack等;2)拓展新功能应用,掌握Socket、OpenGL、WebRTC等专业领域技能;3)结合其他行业,如汽车、游戏、安全等,拓宽职业道路。这三个方向各有学习难度和保饭碗指数,助你在安卓开发领域持续成长。
69 1
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
|
29天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
81 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
3月前
|
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积累经验。每条路径都有相应的书籍和技术栈推荐,助你顺利过渡。
62 3
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
|
6月前
|
监控 Unix 应用服务中间件
Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器
Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器
|
2月前
|
Web App开发 网络协议 Android开发
Android平台一对一音视频通话方案大比拼:WebRTC VS RTMP VS RTSP,谁才是王者?
【9月更文挑战第4天】本文详细对比了在Android平台上实现一对一音视频通话时常用的WebRTC、RTMP及RTSP三种技术方案。从技术原理、性能表现与开发难度等方面进行了深入分析,并提供了示例代码。WebRTC适合追求低延迟和高质量的场景,但开发成本较高;RTMP和RTSP则在简化开发流程的同时仍能保持较好的传输效果,适用于不同需求的应用场景。
159 1
|
3月前
|
编解码 安全 Ubuntu
Android Selinux 问题处理笔记
这篇文章是关于处理Android系统中SELinux权限问题的笔记,介绍了如何通过分析SELinux拒绝的日志、修改SELinux策略文件,并重新编译部署来解决权限问题,同时提供了一些SELinux的背景知识和实用工具。
75 0
|
6月前
|
安全 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在线视频。
110 3
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
|
5月前
|
Java API Android开发
技术经验分享:Android源码笔记——Camera系统架构
技术经验分享:Android源码笔记——Camera系统架构
57 0
|
6月前
|
Java 测试技术 开发工具
Android 笔记:AndroidTrain , Lint , build(1),只需一篇文章吃透Android多线程技术
Android 笔记:AndroidTrain , Lint , build(1),只需一篇文章吃透Android多线程技术
|
6月前
|
设计模式 缓存 前端开发
真的强!借助阿里技术博主分享的Android面试笔记,我拿到了字节跳动的offer
真的强!借助阿里技术博主分享的Android面试笔记,我拿到了字节跳动的offer