音视频开发之H264编码原理

编码的本质就是压缩 Google VP8 VP9视频编码协议主要用于视频通话,H264编码协议就是一系列算法的集合

视频文件的封装格式就是将已经编码好的视频轨和音频轨按照一定的格式方到一个文件中,比如:avi mkv mov flv mp4

视频源文件为.H264(其中之一) 音频源文件为.AAC(其中之一)

摄像头捕捉到了一帧数据(YUV)未压缩,经过 信源编码器,视频复合编码器,传输缓冲器,传输编码器 处理编码出H264码流

信源编码器:将视频中的每一帧颜色趋于一致或具备连续性(类似渐变)的图片的区域 打乱成很多宏块 H264对比较平坦的图像使用16*16大小的宏块,但位了更高的压缩率,还可以在16*16的宏块上划分出更小的子块。子块的大小为8*16 16*8 8*8 4*8 8*4 4*4等非常灵活(视频播放或者直播时花屏 是因为对应区域的宏块丢失导致的)

视频复合编码器:保存宏块中颜色起始点颜色,终止点颜色,宏块大小,颜色预测方向(利用颜色推断算法 向下,向左,左下 ,取平均等)来还原宏块中所有像素点的颜色,而不用每一个像素点的颜色信息都要记录

传输缓冲器:缓存那些比较小的帧比如B帧,等到缓存一定数量时一起发送出去,至于缓存多少由算法决定,当第一帧被编码为I帧输出出去,第二帧以及后续的帧如果相似程度达到95%以上会被编码成B帧,缓存在传输缓冲器,直到有一帧被编码为P帧(相似程度70%以上)被输出的时候,会将通知缓冲区将里面的B帧输出,里面包含I帧和P帧的信息

传输编码器:输出H264数据流

H264编码原理:块结构编码,图片中的颜色PS中放大以后很多趋于一致,具有连续性(类似于渐变)这就是空间冗余,利用类似渐变的原理我们只需要记录起始点颜色,终止点颜色,图片宽高,我们就可以还原这个图片的颜色信息,而不用每一个像素的颜色都保存下来,h264编码就是将颜色趋于一直划分成宏块,在利用颜色推断算法来计算每个像素的颜色,来保存图片颜色信息,达到压缩编码的目的。以上部分为帧内压缩

对于H264协议来说视频播放的本质就是宏块的运动,在一帧图片中又很多宏块 在下一帧会继续出现,我们只需要记录他的运动矢量,宏块的坐标信息即可,这就是帧间压缩

120FPS的解码器去播放60帧的视频 与60FPS的解码器去播放60帧的视频 播放效果是一致的 120FPS 只不过是一帧渲染了两次,通过运动补偿技术(宏块由第一帧在A点,第二帧在B点,由A点到B点的运动轨迹是可以推算出来的,因此我们可以在第一帧到第二帧之间插一个计算的虚拟帧出来,使得画面更加细腻流畅)120FPS的解码器去播放60帧的视频 就是60帧原有视频 + 60帧虚拟帧

关于I B P帧:

P帧的形成参考I帧 B帧的形成参考I帧与P帧,与I帧的相似程度达到95%以上编码称为B,相似程度70%编码成P,一个可以播放的视频文件第一帧永远是I帧,第二帧永远为P帧,这里要注意视频录制顺序和码流输出顺序

什么是GOP?

GOP就是两个I帧之间的视频流序列包含第一个I帧,GOP可以理解为一个视频场景,场景中的物体都是比较类似的,

GOP越小 I帧频率越高 视频流文件越大

短视频GOP越长越好

直播GOP越短越好 因为直播的及时性比较高,只有I帧为关键帧,只有I帧才能反补出视频信息 ,所以对I帧出现的频率有要求 当我们进入直播间黑一会就是在等I帧,直播往往都是2s一个I帧

那直播如何避免直播流数据过大?

降低编码帧率 短视频的帧率基本30左右 直播帧率基本10~15

SeekTo的时候是如何定位到准确位置的?

1.如果直接seek到I帧那么可以直接播放

2.如果不是I帧,先等待解码之前最近的一帧I帧,在反推当前seekto位置的帧

相关推荐
平凡シンプル6 分钟前
安卓 uniapp跨端开发
android·uni-app
elina80139 分钟前
安卓实现导入Excel文件
android·excel
小灰灰爱代码10 分钟前
C++——求3个数中最大的数(分别考虑整数、双精度数、长整数的情况),用函数模板来实现。
开发语言·c++·算法
严文文-Chris13 分钟前
【设计模式-享元】
android·java·设计模式
趋势大仙40 分钟前
SQLiteDatabase insert or replace数据不生效
android·数据库
DS小龙哥43 分钟前
QT For Android开发-打开PPT文件
android·qt·powerpoint
青柠视频云44 分钟前
青柠视频云——视频丢包(卡顿、花屏、绿屏)排查
服务器·网络·音视频
BeyondESH1 小时前
Linux线程同步—竞态条件和互斥锁(C语言)
linux·服务器·c++
试行2 小时前
Android实现自定义下拉列表绑定数据
android·java
豆浩宇2 小时前
Halcon OCR检测 免训练版
c++·人工智能·opencv·算法·计算机视觉·ocr