关于android:Android音视频开发1H264-基本原理

3次阅读

共计 5704 个字符,预计需要花费 15 分钟才能阅读完成。

前言

H264 视频压缩算法当初无疑是所有视频压缩技术中应用最宽泛,最风行的。随着 x264/openh264 以及 ffmpeg 等开源库的推出,大多数使用者无需再对 H264 的细节做过多的钻研,这大升高了人们应用 H264 的老本。

但为了用好 H264,咱们还是要对 H264 的基本原理弄清楚才行。明天咱们就来看看 H264 的基本原理。

H264 概述

H264 压缩技术次要采纳了以下几种办法对视频数据进行压缩。包含:

  • 帧内预测压缩,解决的是空域数据冗余问题。
  • 帧间预测压缩(静止预计与弥补),解决的是时域数据冗徐问题。
  • 整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据而后进行量化。
  • CABAC 压缩。

通过压缩后的帧分为:I 帧,P 帧和 B 帧:

  • I 帧:关键帧,采纳帧内压缩技术。
  • P 帧:向前参考帧,在压缩时,只参考后面曾经解决的帧。采纳帧音压缩技术。
  • B 帧:双向参考帧,在压缩时,它即参考前而的帧,又参考它前面的帧。采纳帧间压缩技术。

除了 I /P/ B 帧外,还有图像序列 GOP。

  • GOP: 两个 I 帧之间是一个图像序列,在一个图像序列中只有一个 I 帧。如下图所示:

上面咱们就来详细描述一下 H264 压缩技术。

H264 压缩技术

H264 的基本原理其实非常简单,下咱们就简略的形容一下 H264 压缩数据的过程。通过摄像头采集到的视频帧(按每秒 30 帧算),被送到 H264 编码器的缓冲区中。编码器先要为每一幅图片划分宏块。

以上面这张图为例:

划分宏块

H264 默认是应用 16X16 大小的区域作为一个宏块,也能够划分成 8X8 大小。

划分好宏块后,计算宏块的象素值。

以此类推,计算一幅图像中每个宏块的像素值,所有宏块都解决完后如上面的样子。

划分子块

H264 对比拟平坦的图像应用 16X16 大小的宏块。但为了更高的压缩率,还能够在 16X16 的宏块上更划分出更小的子块。子块的大小能够是 8X16、 16X8、 8X8、 4X8、 8X4、 4X4 十分的灵便。

上幅图中,红框内的 16X16 宏块中大部分是蓝色背景,而三只鹰的局部图像被划在了该宏块内,为了更好的解决三只鹰的局部图像,H264 就在 16X16 的宏块内又划分出了多个子块。

这样再通过帧内压缩,能够失去更高效的数据。下图是别离应用 mpeg- 2 和 H264 对下面宏块进行压缩后的后果。其中左半部分为 MPEG- 2 子块划分后压缩的后果,右半部分为 H264 的子块划压缩后的后果,能够看出 H264 的划分办法更具劣势。

宏块划分好后,就能够对 H264 编码器缓存中的所有图片进行分组了。

帧分组

对于视频数据次要有两类数据冗余,一类是工夫上的数据冗余,另一类是空间上的数据冗余。其中工夫上的数据冗余是最大的。上面咱们就先来说说视频数据工夫上的冗余问题。

为什么说工夫上的冗余是最大的呢?假如摄像头每秒抓取 30 帧,这 30 帧的数据大部分状况下都是相关联的。也有可能不止 30 帧的的数据,可能几十帧,上百帧的数据都是关联特地亲密的。

对于这些关联特地亲密的帧,其实咱们只须要保留一帧的数据,其它帧都能够通过这一帧再按某种规定预测进去,所以说视频数据在工夫上的冗余是最多的。

为了达到相干帧通过预测的办法来压缩数据,就须要将视频帧进行分组。那么如何断定某些帧关系密切,能够划为一组呢?咱们来看一下例子,上面是捕捉的一组静止的台球的视频帧,台球从右上角滚到了左下角。

H264 编码器会按程序,每次取出两幅相邻的帧进行宏块比拟,计算两帧的类似度。如下图:

通过宏块扫描与宏块搜寻能够发现这两个帧的关联度是十分高的。进而发现这一组帧的关联度都是十分高的。因而,下面这几帧就能够划分为一组。其算法是:在相邻几幅图像画面中,个别有差异的像素只有 10% 以内的点, 亮度差值变动不超过 2%,而色度差值的变动只有 1% 以内,咱们认为这样的图能够分到一组。

在这样一组帧中,通过编码后,咱们只保留第一帖的残缺数据,其它帧都通过参考上一帧计算出来。咱们称第一帧为IDR/I 帧,其它帧咱们称为P/B 帧,这样编码后的数据帧组咱们称为GOP

静止预计与弥补

在 H264 编码器中将帧分组后,就要计算帧组内物体的静止矢量了。还以下面静止的台球视频帧为例,咱们来看一下它是如何计算静止矢量的。

H264 编码器首先按程序从缓冲区头部取出两帧视频数据,而后进行宏块扫描。当发现其中一幅图片中有物体时,就在另一幅图的邻近地位(搜寻窗口中)进行搜寻。如果此时在另一幅图中找到该物体,那么就能够计算出物体的静止矢量了。上面这幅图就是搜寻后的台球挪动的地位。

通过上图中台球地位相差,就能够计算出台图运行的方向和间隔。H264 顺次把每一帧中球挪动的间隔和方向都记录下来就成了上面的样子。

静止矢量计算出来后,将雷同局部(也就是绿色局部)减去,就失去了弥补数据。咱们最终只须要将弥补数据进行压缩保留,当前在解码时就能够复原原图了。压缩弥补后的数据只须要记录很少的一点数据。如下所示:

咱们把静止矢量与弥补称为 帧间压缩技术,它解决的是视频帧在工夫上的数据冗余。除了帧间压缩,帧内也要进行数据压缩,帧内数据压缩解决的是空间上的数据冗余。上面咱们就来介绍一下帧内压缩技术。

帧内预测

人眼对图象都有一个辨认度,对低频的亮度很敏感,对高频的亮度不太敏感。所以基于一些钻研,能够将一幅图像中人眼不敏感的数据去除掉。这样就提出了帧内预测技术。

H264 的帧内压缩与 JPEG 很类似。一幅图像被划分好宏块后,对每个宏块能够进行 9 种模式的预测。找出与原图最靠近的一种预测模式。

上面这幅图是对整幅图中的每个宏块进行预测的过程。

帧内预测后的图像与原始图像的比照如下:

而后,将原始图像与帧内预测后的图像相减得残差值。

再将咱们之前失去的预测模式信息一起保存起来,这样咱们就能够在解码时复原原图了。成果如下:

通过帧内与帧间的压缩后,尽管数据有大幅缩小,但还有优化的空间。

对残差数据做 DCT

能够将残差数据做整数离散余弦变换,去掉数据的相关性,进一步压缩数据。如下图所示,左侧为原数据的宏块,右侧为计算出的残差数据的宏块。

将残差数据宏块数字化后如下图所示:

将残差数据宏块进行 DCT 转换。

去掉相关联的数据后,咱们能够看出数据被进一步压缩了。

做完 DCT 后,还不够,还要进行 CABAC 进行无损压缩。

CABAC

下面的帧内压缩是属于有损压缩技术。也就是说图像被压缩后,无奈齐全还原。而 CABAC 属于无损压缩技术。

无损压缩技术大家最相熟的可能就是哈夫曼编码了,给高频的词一个短码,给低频词一个长码从而达到数据压缩的目标。MPEG- 2 中应用的 VLC 就是这种算法,咱们以 A-Z 作为例子,A 属于高频数据,Z 属于低频数据。看看它是如何做的。

CABAC 也是给高频数据短码,给低频数据长码。同时还会依据上下文相关性进行压缩,这种形式又比 VLC 高效很多。其成果如下:

当初将 A-Z 换成视频帧,它就成了上面的样子。

从下面这张图中显著能够看出采纳 CACBA 的无损压缩计划要比 VLC 高效的多。

小结

至此,咱们就将 H264 的编码原理讲完了。本篇文章次要讲了以下以点内容:

  1. 简音介绍了 H264 中的一些基本概念。如 I /P/ B 帧,GOP。
  2. 具体解说了 H264 编码的基本原理,包含:
  • 宏块的划分
  • 图像分组
  • 帧内压缩技术原理
  • 帧间压缩技术原理。
  • DCT
  • CABAC 压缩原理。

最初

大家都晓得要入门音视频要学习音视频录制,编码,解决,然而具体不晓得怎么做。我本人在入门的时候也一样,靠着搜索引擎本人一点一点的积攒,在这里当然要谢谢在该畛域无私奉献的大佬们。

上面是我整顿的学习路线,置信我,如果你认真学完了,你肯定会成为音视频人才招聘市场的香饽饽~~

一、高级入门篇:

一、绘制图片

  1. ImageView 绘制图片
  2. SurfaceView 绘制图片
  3. 自定义 View 绘制图片

二、AudioRecord API 详解

三、应用 AudioRecord 实现录音,并生成 wav

  • 创立一个 AudioRecord 对象
  • 初始化一个 buffer
  • 开始录音
  • 创立一个数据流,一边从 AudioRecord 中读取声音数据到初始化的 buffer,一边将 buffer 中数据导入数据流。
  • 敞开数据流
  • 进行录音

四、用 AudioTrack 播放 PCM 音频

1.AudioTrack 根本应用

  • MODE_STATIC 模式
  • MODE_STREAM 模式

2.AudioTrack 详解

  • 音频流的类型
  • Buffer 调配和 Frame 的概念
  • AudioTrack 结构过程
  1. AudioTrack 与 MediaPlayer 的比照
  • 区别
  • 分割
  • SoundPool

五、应用 Camera API 采集视频数据

1. 预览 Camera 数据

2. 取到 NV21 的数据回调

六、应用 MediaExtractor 和 MediaMuxer API 解析和封装 mp4 文件

1.MediaExtractor API 介绍

2.MediaMuxer API 介绍

3. 应用情境

七、MediaCodec API 详解

1.MediaCodec 介绍

2.MediaCodec API 阐明

3.MediaCodec 流控

  • 流控基本概念
  • Android 硬编码流控
  • Android 流控策略抉择

因为文章篇幅受限,残余内容过多,文中插图无限,下文只能截图目录展现:

所有知识点具体内容都整顿在了开源我的项目【GitHub】, 有须要的能够自取。

二、中级进阶篇:

  • Android OpenGL ES 开发(一): OpenGL ES 介绍
  • Android OpenGL ES 开发(二): OpenGL ES 环境搭建
  • Android OpenGL ES 开发(三): OpenGL ES 定义形态
  • Android OpenGL ES 开发(四): OpenGL ES 绘制形态
  • Android OpenGL ES 开发(五): OpenGL ES 应用投影和相机视图
  • Android OpenGL ES 开发(六): OpenGL ES 增加静止成果
  • Android OpenGL ES 开发(七): OpenGL ES 响应触摸事件
  • Android OpenGL ES 开发(八): OpenGL ES 着色器语言 GLSL
  • Android OpenGL ES 开发(九): OpenGL ES 纹理贴图
  • Android OpenGL ES 开发(十): 通过 GLES20 与着色器交互
  • 应用 OpenGL 显示一张图片
  • GLSurfaceviw 绘制 Camera 预览画面及实现拍照
  • 应用 OpenGL ES 实现视频的录制,并实现视频水印成果

高级探索篇:

  • 深刻学习音视频编码,如 H.264,AAC,钻研应用开源编解码库,如 x.264,JM 等
  • 深入研究音视频相干的网络协议,如 rtmp,hls,以及封包格局,如:flv,mp4
  • 深刻学习一些音视频畛域的开源我的项目,如 webrtc,ffmpeg,ijkplayer,librtmp 等等
  • 将 ffmpeg 库移植到 Android 平台,联合下面积攒的教训,编写一款繁难的音视频播放器
  • 将 x264 库移植到 Android 平台,联合下面积攒的教训,实现视频数据 H264 软编性能
  • 将 librtmp 库移植到 Android 平台,联合下面积攒的教训,实现 Android RTMP 推流性能 

音视频编解码技术

  • 音视频编解码技术(一):MPEG-4/H.264 AVC 编解码规范
  • 音视频编解码技术(二):AAC 音频编码技术

流媒体协定

  • 流媒体协定(一):HLS 协定
  • 流媒体协定(二):RTMP 协定

多媒体文件格式

  • 多媒体文件格式(一):MP4 格局
  • 多媒体文件格式(二):FLV 格局
  • 多媒体文件格式(三):M3U8 格局
  • 多媒体文件格式(四):TS 格局
  • 多媒体文件格式(五):PCM / WAV 格局

FFmpeg 学习记录

  • FFmpeg 命令行工具学习(一):查看媒体文件头信息工具 ffprobe
  • FFmpeg 命令行工具学习(二):播放媒体文件的工具 ffplay
  • FFmpeg 命令行工具学习(三):媒体文件转换工具 ffmpeg
  • FFmpeg 命令行工具学习(四):FFmpeg 采集设施
  • FFmpeg 命令行工具学习(五):FFmpeg 调整音视频播放速度

  • FFmpeg 学习(一):FFmpeg 简介
  • FFmpeg 学习(二):Mac 下装置 FFmpeg
  • FFmpeg 学习(三):将 FFmpeg 移植到 Android 平台
  • FFmpeg 学习(四):FFmpeg API 介绍与通用 API 剖析
  • FFmpeg 学习(五):FFmpeg 编解码 API 剖析
  • FFmpeg 学习(六):FFmpeg 外围模块 libavformat 与 libavcodec 剖析

  • FFmpeg 构造体学习(一):AVFormatContext 剖析
  • FFmpeg 构造体学习(二):AVStream 剖析
  • FFmpeg 构造体学习(三):AVPacket 剖析
  • FFmpeg 构造体学习(四):AVFrame 剖析
  • FFmpeg 构造体学习(五):AVCodec 剖析
  • FFmpeg 构造体学习(六):AVCodecContext 剖析
  • FFmpeg 构造体学习(七):AVIOContext 剖析
  • FFmpeg 构造体学习(八):FFMPEG 中重要构造体之间的关系

更多目录截图:

总结:以上就是对于音视频的材料最强整顿和概括了(还有局部内容没有截图进去),置信应该是全网最全了,所有材料都是收费分享给大家的,也省去了对音视频感兴趣的小伙伴们到处找材料的工夫,如果你正好须要能够点此处收费获取

音视频开发的前景,置信大家从相干的招聘网站上就能够看到,不论是流媒体开发还是音视频解决开发,都是大量招人的,并且因为入门门槛绝对较高,学习周期长,薪资也是居高不下。

另外:小编还收集整理一些音视频相干配套视频,置信能使大家学习起来更加疾速无效:

** 文中所有材料都是收费分享给大家的,[只需你动动手指导击此处就可中转收费支付形式了。](https://github.com/zhireshini…
)**

Android 架构师之路很漫长,一起共勉吧!学习之路犹如逆水行舟,逆水行舟,如果你松散了,那么你就退化了,而在 Android 开发工作中没有一门吃香独特的技术,想拿高薪也只能是可望不可即的。做个怠惰向上的人,加紧学习,抓住核心,宁精勿杂,宁专勿多。

如果你正好须要这份完整版 Android 音视频开发,只需你多多反对我这篇文章。

疾速动手通道:(点这里)下载!诚意满满!!!

整顿不易,感觉有帮忙的敌人能够帮忙点赞分享反对一下小编~

你的反对,我的能源;祝各位前程似锦,offer 一直!!!

正文完
 0