本文主要是介绍【音视频】播放音视频时发生了什么? 视频的编解码 H264是什么? MP4是什么?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- ✨播放一个视频的流程
- ✨为什么要编码(压缩)视频数据?
- ✨如何编码(压缩)数据
- 🎄简单的例子
- 🎄音视频编码方式
- 🎄视频编码格式
- H264编码
- 是什么?发展历程?
- H.264基本单元
- H.264的I帧,P帧,B帧
- 🎄音频编码格式
- ✨视频文件封装格式
- ✨解封装格式
- ✨视频解码
- ✨H264分层结构
- 🎄网络上传输H264视频数据的流程
- VCL的结构关系
- 🎄NAL单元
- ✨ 参考文章
✨播放一个视频的流程
1.对音视频进行编码,一般用H.264编码标准
2.对编码后的音视频进行封装,一般封装为MP4格式
3.播放MP4视频,必须要解封装
4.解封装之后得到的是编码后的音视频编码流,必须解编码(压缩)
✨为什么要编码(压缩)视频数据?
视频是又一帧一帧的图片组成的,人眼有视觉暂留效应,当帧序列以一定的速率播放,我们就能看到连续的视频。
比如一个1920x1080分辨率,32位,每秒30帧的视频。一秒钟就要流过 1920x1080x32x30 = 237M的数据!!!
一个.rgb文件75.5mb,编码为.h264文件之后大概为525KB.
✨如何编码(压缩)数据
🎄简单的例子
比如大话西游朱茵的经典照,取两张图片,一个图片右眼是睁开的,一个图片右眼是闭着的。那么保存第二张图片的时候只需要记录这张图片和上一张图像的区别信息即可。
编码就是去除冗余。
从计算机的角度来说:比如一个全黑的图片,存储方法是100x100的数组,每个矩阵的值都是0。该数组是Int型,存储这个图片需要100x100x4字节的大小。
只需要用一个int记录该数组的数,即0。
然后再用两个int分别记录矩阵的长和宽。
就可以用这三个int变量来复原该图像。
🎄音视频编码方式
音视频开发——H264编解码总结
🎄视频编码格式
视频编码的作用: 将视频像素数据(RGB,YUV 等)压缩成视频码流,从而降低视频的数据量。常用的音频编码方式有以下几种:
H264编码
打开斗鱼直播间,右键点击查看参考信息选项,会发现直播的视频流用的是H264编码方式。
是什么?发展历程?
H264,通常也被称之为H264/AVC(或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC)
H264是一种编码算法。是主流的编码标准。
像大多数看到的视频,如rmvb、avi、mp4、flv大多数是由h264进行编码,当然也会有不同的,如mpeg4、vp9这样冷门的编码。
H264视频编码发展历程
H.264基本单元
在H.264定义的结构中,一个视频图像编码后的数据叫做一帧。 一帧是由一个或多个片(slice)组成的,一个片是由一个或多个宏块(MB)组成的(宏块是H264编码的基本单位),一个宏块是由16x16的yuv数据组成的。
H.264的I帧,P帧,B帧
I帧:关键帧,就是把一个图片直接压缩,压缩之后的内容就是I帧,它可以单独解码出一个完整的图像。
P帧:前向预测编码帧。记录本帧和之前的一个关键帧的差别。解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。
比如记录第三张图片,只需记录右下角的粉矩形,然后用这个信息 叠加第一张图片,即可复原第三张图片。
B帧:双向预测编码帧,既要参考前面的,又要参考后面的。
比如想要记录第二张图片,它只需要记录右上角的椭圆,然后将它与第一张原始图片和第三张原始图片叠加即可复原第二张图片。
这种方法压缩效果很强。本来第二张图片是个很复杂的图片,它只需要记录第一张图片然后记录第二张第三张图片的部分信息就能复原第二张图片。
🎄音频编码格式
MP3 MP3,英文全称 MPEG-1 or MPEG-2 Audio Layer III,是曾经非常流行的一种数字音频编码和有损压缩格式,它被设计来大幅降低音频数据量。它是在 1991 年,由位于德国埃尔朗根的研究组织 Fraunhofer-Gesellschaft 的一组工程师发明和标准化的。MP3 的普及,曾对音乐产业造成极大的冲击与影响。
✨视频文件封装格式
上一步编码(压缩)之后必须要把编码后的内容按照一定的格式放在一个文件中,这个文件相当于一个外壳,它就是封装格式(容器)。常见的格式为 .mp4。
或者把它当成一个放视频轨和音频轨的文件夹也可以。说得通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个碗,或者一个锅,用来盛放饭菜的容器。 下面是几种常用的视频文件后缀类型与其相对应的封装格式。
✨解封装格式
如果要播放一个MP4文件,MP4是一个封装格式数据,是一个容器,要想播放它首先要打开它。然后把数据从容器中取出来。
✨视频解码
直接从容器里面拿出来的音视频数据不能直接拿出来播放。这些都是编码(压缩)后的数据。
这样的数据显然不能直接转成图片然后播放。所以要对数据进行解码,比如上面的例子,我们拿到区别信息之后,参考第一张图片,进行整合,然后才能拿到完整的图像进行展示。
✨H264分层结构
H.264码流文件分为两层:
1.VCL (Video Coding Layer 视频编码层):它是被编码(压缩)后的视频数据。
2.NAL(Netword Abstraction layer 网络提取层):VCL数据被封装到NAL单元中之后,才可以用于传输或者存储。
🎄网络上传输H264视频数据的流程
在网络上传输H264视频数据与服务器段的java代码一样:
VCL的结构关系
参考博客:h.264(2)——VCL/NAL/切片/宏块
🎄NAL单元
一帧图片经过H.264 编码后,变成了多个片(slice),每片包含整数个宏块(至少一个宏块,最多包含整个图像宏块),NAL单元就是装载着这些片(slice)的载体。
✨ 参考文章
音视频开发——H264编解码总结
强烈推荐:【音视频 | H.264】H.264视频编码及NALU详解
这篇关于【音视频】播放音视频时发生了什么? 视频的编解码 H264是什么? MP4是什么?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!