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

相关推荐
量子-Alex1 小时前
【多模态聚类】用于无标记视频自监督学习的多模态聚类网络
学习·音视频·聚类
C4rpeDime2 小时前
自建MD5解密平台-续
android
鲤籽鲲4 小时前
C# Random 随机数 全面解析
android·java·c#
别NULL4 小时前
机试题——疯长的草
数据结构·c++·算法
mo47765 小时前
Webrtc音频模块(四) 音频采集
音视频·webrtc
icy、泡芙5 小时前
T527-----音频调试
linux·驱动开发·音视频
易我数据恢复大师5 小时前
怎么提取音频保存到本地?电脑音频提取方法
音视频·软件·音频提取
野蛮的大西瓜5 小时前
开源呼叫中心中,如何将ASR与IVR菜单结合,实现动态的IVR交互
人工智能·机器人·自动化·音视频·信息与通信
CYBEREXP20085 小时前
MacOS M3源代码编译Qt6.8.1
c++·qt·macos
yuanbenshidiaos6 小时前
c++------------------函数
开发语言·c++