一、视频文件是什么?

视频文件就相当于是:音频码流和视频码流结合封装的一个容器其中一个视频文件中可以放入多个音频码流和视频码流的文件。

并且从视频文件中导出来的视频压缩数据是不可以直接进行播放的(假设里面有两张相似的图片,其实并没有保存两张图片的完整信息,第二张图片可能只保存了与第一张图片的不同信息)

二、为什么要编码?

视频是连续的图像序列,由连续的帧构成,一帧即为一幅图像。由于人眼的视觉暂留效应,当帧序列以一定的速率播放时,我们看到的就是动作连续的视频。这么多连续的图像数据如果不经过编码的数据量太大了。

比如一个1920x1080分辨率,32位,每秒30帧的视频,一秒钟需要1920+1080+32*30,大小大概为237M数据。

        所以编码说白了就是压缩数据!!!!!

三、IPB帧和GOP

之前有提到两张相似图片没必要保存他的两张图片的全部信息,那他们是怎么样保存的呢?

  • l帧 :帧内编码帧,关键帧,l帧可以看作一个图像经过压缩之后的产物,可以单独解码出一个完整的图像;
  • P帧 :前向预测编码帧,记录了本帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。
  • B帧 :双向预测编码帧,记录了本帧与前后帧的差别,解码需要参考前面一个l帧或者P帧,同时也需要后面的P帧才能解码一张完整的图像。

GOP(序列):

        编码器将多张图像进行编码后生产成一段一段的 GOP ( Group of Pictures ) , 解码器在播放时则是读取一段一段的 GOP 进行解码后读取画面再渲染显示。

在视频编码序列中,GOP即Group of picture图像组),指两个I帧之间的距离,Reference(参考周期)指两个P帧之间的距离。两个I帧之间形成一组图片,就是GOP(Group Of Picture)。

IDR:

在H.264中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流。一个序列的第一个图像叫做 IDR 图像立即刷新图像),IDR 图像都是 I 帧图像。

IDR的工作原理

H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。

如果前一个序列出现重大错误,在这里可以获得重新同步的机会。

IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。

四、PTS和DTS

DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。

PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。

引入此概念的原因:

通过上面的描述可以看出:P帧需要参考前面的I帧或P帧才可以生成一张完整的图片,而B帧则需要参考前面I帧或P帧及其后面的一个P帧才可以生成一张完整的图片。

这样就带来了一个问题在视频流中,先到来的 B 帧无法立即解码,需要等待它依赖的后面的 I、P 帧先解码完成,这样一来播放时间与解码时间不一致了,顺序打乱了,那这些帧该如何播放呢?这时就引入了另外两个概念:DTS 和 PTS

虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的。

在视频采集的时候是录制一帧就编码一帧发送一帧的,在编码的时候会生成 PTS,这里需要特别注意的是 frame(帧)的编码方式,在通常的场景中,编解码器编码一个 I 帧,然后向后跳过几个帧,用编码 I 帧作为基准帧对一个未来 P 帧进行编码,然后跳回到 I 帧之后的下一个帧。编码的 I 帧和 P 帧之间的帧被编码为 B 帧。之后,编码器会再次跳过几个帧,使用第一个 P 帧作为基准帧编码另外一个 P 帧,然后再次跳回,用 B 帧填充显示序列中的空隙。这个过程不断继续,每 12 到 15 个 P 帧和 B 帧内插入一个新的 I 帧。P 帧由前一个 I 帧或 P 帧图像来预测,而 B 帧由前后的两个 P 帧或一个 I 帧和一个 P 帧来预测,因而编解码和帧的显示顺序有所不同,如下所示:

另外,并不是一定要使用B帧。在实时互动直播系统中,很少使用B帧。主要的原因是压缩和解码B帧时,由于要双向参考,所以它需要缓冲更多的数据,且使用的CPU也会更高。由于实时性的要求,所以一般不使用它。不过对于播放器来说,遇到带有B帧的H264数据是常有的事儿。在没有B帧的情况下,存放帧的顺序和显示帧的顺序就是一样的,PTS和DTS的值也是一样的。

五、如何编码?

编码的目的,就是为了压缩。各种视频编码方式,都是为了让视频变得体积更小,有利于存储和传输。编码的核心思想就是去除冗余信息。

冗余的类型:

  • 空间冗余:图像内部相邻像素之间存在较强的相关性多造成的冗余。
  • 时间冗余:视频图像序列中的不同帧之间的相关性所造成的冗余。
  • 视觉冗余:是指人眼不能感知或不敏感的那部分图像信息。
  • 信息嫡冗余:也称编码冗余,人们用于表达某一信息所需要的比特数总比理论上表示该信息所需要的最少比特数要大,它们之间的差距就是信息嫡冗余,或称编码冗余。(类似于一串数据是11112222八个数据,就可以使用4142共4个数据来表示)
  • 知识冗余:是指在有些图像中还包含与某些验证知识有关的信息。
  • .........

六、视频编码

所谓视频编码就是指通过特定的压缩技术,将某个视频格式文件转换成另一种视频格式文件的方式。视频流传输中最重要的编解码标准有国际电联(ITU-T,国际电信联盟)的H.261、H.263、H.264等,运动静止图像专家组(由ISO国际标准化组织与IEC国际电子委员会于1988年联合成立)的MPEG系列标准MPEG1、MPEG2、MPEG4 AVC等

其中ITU-TH.264/MPEG-4 AVC是ITU-T与ISO/IEC连手合作制订的新标准。ITU-T方面称之为H.264。但ISO/IEC的则将这个新标准归纳于MPEG系列,称为MPEG-4 AVC。

而H.265则被视为是ITU-TH.264/MPEG-4 AVC标准的继任者,又称为高效率视频编码(High Efficiency VideoCoding,简称HEVC) 。

七、H.264码流分析

H.264码流文件分为两层:

  1. VCL (Video Coding Layer,视频编码层)︰负责高效的视频内容表示,VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。
  2. NAL (Network Abstraction Layer,网络提取层)︰负责以网络所要求的恰当的方式对数据进行打包和传送,是传输层。不管在本地播放还是网络播放,都要通过这一层来传输。

 VCL就是被压缩编码后原始数据,在VCL数据封装到NAL单元中之后,才可以用于传输或存储。

八、片和宏块

一帧图片经过H.264编码器之后,就被编码为一个或多个片(slice),每片包含整数个宏块(至少一个宏块,最多包含整个图像宏块),NAL单元就是装载着这些片(slice)的载体。

九、Annexb格式

一般H.264编码器的默认输出为︰起始码+NALU (Nal单元)。起始码为:0x00000001或者0x000001(起始码的作用:用来划分单元 ,类似于文章的标点符号)。每个NALU包含1个字节的Nal Header与若干整数字节的负荷数据EBSP构成。

NALU的结构如下:

其中Nal Header占用1个字节,此字节低5位表示NALU类型:

我们知道了Nal Header底五位表示了NALU的类型,接下来我们来看一下整体的文件是怎么样的。

在.h264文件的开头处第一个和第二个必然是SPS类型(底五位为7:序列参数集)和PPS类型(底五位为8:图像参数集)。

这两个里面保存了一些视频文件的基本信息:比如说分辨率,解码的规则,视频的帧率和码率等等。

第一个和第二个结束之后必然跟了一个关键帧因为只有关键帧才可以独立解码

Android音视频开发(一)——音视频开发流程相关推荐

  1. Android入门视频教程,抖音音视频开发

    前言 今年的面试形势不容乐观,竞争愈发激烈,进大厂的难度又增加了. 但是,梦想还是要有的,万一实现了呢?这不就有一只幸运鹅. 我的一个朋友,几天前,他百年不见更新的朋友圈有了新动态,他居然晒了他的of ...

  2. 都2021了作为一名Android开发者,还不学音视频开发?我劝你早点认清现实!

    缘起 最近经常遇到一些同学问我如何学习音视频,怎样才能快速上手?还有一些对音视频不了解的同学问我该不该学习音视频?作为一名音视频行业的10年Android老兵,我有一些思考分享给大家,希望能对你有所帮 ...

  3. 【Android FFMPEG 开发】音视频基础 和 FFMPEG 编译 ( 音视频基础 | MPEG-4 标准 | Android 开发环境 | FFMPEG 交叉编译 | 安卓项目导入配置 )

    本篇博客代码及资源下载 : https://download.csdn.net/download/han1202012/10382762 文章目录 一. 音视频基础 1. 音频基础 (1) 声音要素 ...

  4. iOS音视频开发八:视频编码,H.264 和 H.265 都支持

    我们将通过拆解采集 → 编码 → 封装 → 解封装 → 解码 → 渲染流程并实现 Demo 来向大家介绍如何在 iOS/Android 平台上手音视频开发. 这里是第八篇:iOS 视频编码 Demo. ...

  5. linux视频应用程序开发,Linux平台音视频开发和音视频SDK应用

    Linux平台音视频开发和音视频SDK应用 下面介绍一款强大的音视频即时通讯平台给大家,它就是--云智真音视频SDK. 云智真提供一套跨平台的音.视频即时通讯解决方案,基于先进的H.264视频编码标准 ...

  6. 第一篇,用Uniapp仿微信的语音电话,视频聊天IM聊天APP开发,支持各类消息收发,音视频通话等

    前言 基于uni-app技术开发的仿微信项目,实现了文本消息.图文消息.表情(gif动画),图片预览,图片编辑,视频预览,视频编辑,仿微信的图片选择.编辑.长按菜单等功能 一.项目意义 作为一个企业或 ...

  7. 音视频开发—抖音GsyVideoPlayer视频底层分析使用

    theme: channing-cyan 一.初始化分析 1.初始化主要是构造了一个StandardGSYVideoPlayer 2.设置全屏布局的容器 代码如下: listVideoUtil = n ...

  8. 抖音seo源码 短视频seo源码二次开发,怎么使用抖音seo源码,视频seo源码私有化部署?

    抖音seo源码 短视频seo源码二次开发,怎么使用抖音seo源码,短视频seo源码私有化部署? 抖音seo源码 短视频seo源码二次开发,怎么使用抖音seo源码,短视频seo源码私有化部署到本地.首先 ...

  9. 抖音seo源码二次开发,短视频seo源码二次开发

    抖音seo源码二次开发,短视频seo源码二次开发 开发逻辑及部分代码展示 抖音seo系统前端采用vue 与React技术语言,后端采用jave后台技术语言. 抖音seo是什么技术逻辑呢?seo是搜索引 ...

  10. 直播软件搭建音视频开发中的视频采集

    直播软件搭建音视频开发中的视频采集 前言 在直播和短视频行业日益火热的发展形势下,音视频开发(采集.编解码.传输.播放.美颜)等技术也随之成为开发者们关注的重点,本系列文章就音视频开发过程中所运用到的 ...

最新文章

  1. poj 1185(状压dp)
  2. python中表头格式错误导入_python读csv文件时指定行为表头或无表头的方法
  3. POJ1015-Jury Compromise【01背包,dp】
  4. 设置QtreeWidget水平滚动条
  5. dhcp工具_网络分析之DHCP服务闯入QinQ二层隧道引发故障
  6. 【2016年第3期】中国电信大数据应用实践
  7. jQuery EasyUI API 中文文档 - 数据表格(DataGrid)
  8. java持久层用文件_JAVA中用三种方法将字符串持久化到文件中
  9. MyEclipse7.0及JDK1.6.0的安装及配置过程(修改)
  10. 【万字总结】基于多智能体强化学习的《星际争霸II》中大师级水平的技术研究
  11. WAP PUSH解析(3)——Android中实现
  12. TCP/IP、HTTP、HTTPS
  13. android 微信 amr转mp3格式,微信amr格式转换器使用教程 如何批量转换微信amr为mp3音频格式文件...
  14. OneNET麒麟座应用开发之十:空气质量数据监测站项目总结
  15. 双向可控硅晶片光耦 (TLP160J TLP260J TLP525G) 基本原理及应用实例
  16. mysql怎么分组计算逾期率_Tableau分享第一篇:如何计算分组留存率(Cohort Analysis)!...
  17. Java_JUC_CountDownLatch/CyclicBarrier循环屏障/Semaphore信号灯/枚举
  18. 计算机游戏锁怎么打开,电脑玩游戏锁帧怎么办
  19. 考研计算机需要学复变函数与积分变换,《复变函数与积分变换》期末考研重点复习试题...
  20. 某电批锁付一颗螺丝的原理分析

热门文章

  1. Photoshop制作逼真燃烧的文字效果
  2. 20230214不是情人的情人节
  3. Ubuntu 如何直接回到桌面
  4. oracle10g笔记1
  5. 支付宝小程序获取手机号和授权信息遇坑锦集
  6. 电脑屏幕由刺眼的白色改为淡绿色
  7. 【奇葩瑞萨-002】调教Renesas RX130独立看门狗
  8. 【AI绘画】二次元小姐姐生成!春节版!
  9. 一些《集成电路与光刻机》笔记
  10. 悬赏数据控!2018第一届网易有数可视化大赛火热开启!