音视频开发之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位置的帧

相关推荐
我是谁??9 分钟前
C/C++使用AddressSanitizer检测内存错误
c语言·c++
晨曦_子画19 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
孤客网络科技工作室41 分钟前
AJAX 全面教程:从基础到高级
android·ajax·okhttp
发霉的闲鱼43 分钟前
MFC 重写了listControl类(类名为A),并把双击事件的处理函数定义在A中,主窗口如何接收表格是否被双击
c++·mfc
小c君tt1 小时前
MFC中Excel的导入以及使用步骤
c++·excel·mfc
xiaoxiao涛1 小时前
协程6 --- HOOK
c++·协程
冷凝女子1 小时前
【QT】海康视频及openCv抓拍正脸接口
qt·opencv·音视频·海康
Mr Lee_2 小时前
android 配置鼠标右键快捷对apk进行反编译
android
安步当歌2 小时前
【WebRTC】视频编码链路中各个类的简单分析——VideoStreamEncoder
音视频·webrtc·视频编解码·video-codec
顾北川_野2 小时前
Android CALL关于电话音频和紧急电话设置和获取
android·音视频