(转载)直播一:H.264编码基础知识详解

简介: 原文地址:https://www.cnblogs.com/ziyi--caolu/p/8034367.html非常感谢原文作者,总结的很好,讲解的也很详细,学习了。

原文地址:
https://www.cnblogs.com/ziyi--caolu/p/8034367.html

非常感谢原文作者,总结的很好,讲解的也很详细,学习了。
以下是原文内容:

一、编码基础概念

1、为什么要进行视频编码?

视频是由一帧帧图像组成,就如常见的gif图片,如果打开一张gif图片,可以发现里面是由很多张图片组成。一般视频为了不让观众感觉到卡顿,一秒钟至少需要16帧画面(一般是30帧),假如该视频是一个1280x720分辨率的视频,那么不经过编码一秒钟的大小:
结果:1280x720x60≈843.75M

所以不经过编码的视频根本没法保存,更不用说传输了。

2、视频压缩编码标准

视频中存在很多冗余信息,比如图像相邻像素之间有较强的相关性,视频序列的相邻图像之间内容相似,人的视觉系统对某些细节不敏感等,对这部分冗余信息进行处理的过程就是视频编码。

H.26X系列(由ITU[国际电传视讯联盟]主导)
    H.261:主要在老的视频会议和视频电话产品中使用
    H.263:主要用在视频会议、视频电话和网络视频上
    H.264:H.264/MPEG-4第十部分,或称AVC(Advanced Video Coding,高级视频编码),是一种视频压缩标准,一种被广泛使用的高精度视频的录制、压缩和发布格式。
    H.265:高效率视频编码(High Efficiency Video Coding,简称HEVC)是一种视频压缩标准,H.264/MPEG-4 AVC的继任者。可支持4K分辨率甚至到超高画质电视,最高分辨率可达到8192×4320(8K分辨率),这是目前发展的趋势,尚未有大众化编码软件出现

MPEG系列(由ISO[国际标准组织机构]下属的MPEG[运动图象专家组]开发)
    MPEG-1第二部分:MPEG-1第二部分主要使用在VCD上,有些在线视频也使用这种格式
    MPEG-2第二部分(MPEG-2第二部分等同于H.262,使用在DVD、SVCD和大多数数字视频广播系统中
    MPEG-4第二部分(MPEG-4第二部分标准可以使用在网络传输、广播和媒体存储上

3、编码流程
在进行当前信号编码时,编码器首先会产生对当前信号做预测的信号,称作预测信号(predicted signal)

预测的方式:

    时间上的预测(interprediction),亦即使用先前帧的信号做预测
    空间上的预测 (intra prediction),亦即使用同一张帧之中相邻像素的信号做预测

得到预测信号后,编码器会将当前信号与预测信号相减得到残余信号(residual signal),并只对残余信号进行编码,如此一来,可以去除一部份时间上或是空间上的冗余信息。

编码器并不会直接对残余信号进行编码,而是先将残余信号经过变换(通常为离散余弦变换)然后量化以进一步去除空间上和感知上的冗余信息。量化后得到的量化系数会再透过熵编码,去除统计上的冗余信息。

二、H.264编码详解(AVC)

1、H.264是新一代的编码标准,以高压缩高质量和支持多种网络的流媒体传输著称

相关理解:
    在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内
    所以对于一段变化不大图像画面,我们可以先编码出一个完整的图像帧A,随后的B帧就不编码全部图像,只写入与A帧的差别,这样B帧的大小就只有完整帧的1/10或更小!
    B帧之后的C帧如果变化不大,我们可以继续以参考B的方式编码C帧,这样循环下去。
    这段图像我们称为一个序列:序列就是有相同特点的一段数据
    当某个图像与之前的图像变化很大,无法参考前面的帧来生成,那我们就结束上一个序列,开始下一段序列
    也就是对这个图像生成一个完整帧A1,随后的图像就参考A1生成,只写入与A1的差别内容

2、H.264三种帧

在H.264中定义了三种帧:
    I帧:完整编码的帧叫I帧
    P帧:参考之前的I帧生成的只包含差异部分编码的帧叫P帧
    B帧:参考前后的帧编码的帧叫B帧

H264采用的核心算法是帧内压缩和帧间压缩:
    帧内压缩是生成I帧的算法
    帧间压缩是生成B帧和P帧的算法

压缩方法:
    分组:把几帧图像分为一组(GOP,也就是一个序列),为防止运动变化,帧数不宜取多
    定义帧:将每组内各帧图像定义为三种类型,即I帧、B帧和P帧;
    预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;
    数据传输:最后将I帧数据与预测的差值信息进行存储和传输。

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

a、H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。
b、这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。
c、IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。

一个序列就是一段内容差异不太大的图像编码后生成的一串数据流:

a、当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以编一个I帧,然后一直P帧、B帧了。
b、当运动变化多时,可能一个序列就比较短了,比如就包含一个I帧和3、4个P帧。

在视频编码序列中,GOP即Group of picture(图像组),指两个I帧之间的距离。

I帧、P帧、B帧实际顺序&&编码顺序:


img_b12533965b038365ab2c2f0014501fd1.png
image
img_4c5ebbc9bbbce5e5d4d3895fe943975e.png
image

三、H.264分层设计

H264算法在概念上分为两层:
    VCL:(Video Coding Layer)视频编码层,负责高效的内容表示。
    NAL:(Network Abstraction Layer)网络提取层,负责以网络所要求的恰当的方式对数据进行打包和传送。
    上面所学习的知识都是VCL层。

NAL设计的目的,是根据不同的网络把数据打包成相应的格式,将VCL产生的比特字符串适配到各种各样的网络和多元环境中。

NAL的封装方式:
    NAL是将每一帧数据写入到一个NAL单元中,进行传输或存储的
    NALU分为NAL头和NAL体
    NALU头通常为00 00 00 01,作为一个新的NALU的起始标识
    NALU体封装着VCL编码后的信息或者其他信息

NAL的封装过程:
    I帧、P帧、B帧都是被封装成一个或者多个NALU进行传输或者存储的
    每一个I帧开始之前也有非VCL的NAL单元,用于保存其他信息,它们是PPS、SPS
    PPS(Picture Parameter Sets):图像参数集
    SPS(Sequence Parameter Set):序列参数集
    在实际的H264数据帧中,往往帧前面带有00 00 00 01 或 00 00 01分隔符,一般来说编码器编出的首帧数据为PPS与SPS,接着为I帧,后续是B帧、P帧等数据


img_762b0bd82c4a3048f453bedd8d00aa25.png
image

朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。

目录
相关文章
|
1月前
|
编解码 监控 API
惊艳登场!揭秘如何在Android平台上轻松玩转GB28181标准,实现多视频通道接入的超实用指南!
【8月更文挑战第14天】GB28181是公共安全视频监控联网的技术标准。本文介绍如何在Android平台上实现该标准下的多视频通道接入。首先准备开发环境,接着引入GB28181 SDK依赖并初始化SDK。实现设备注册与登录后,通过指定不同通道号请求多路视频流。最后,处理接收到的数据并显示给用户。此过程涉及视频解码,需确保应用稳定及良好的用户体验。
15 0
|
编解码 开发工具 Android开发
Android平台如何实现第三方模块编码后(H.264/H.265/AAC/PCMA/PCMU)数据实时预览播放
Android平台如何实现第三方模块编码后(H.264/H.265/AAC/PCMA/PCMU)数据实时预览播放
|
10月前
|
编解码 人工智能 前端开发
编码之旅:从非科班转码者到应用开发者
编码之旅:从非科班转码者到应用开发者
101 0
|
11月前
|
编解码 数据处理 数据格式
[笔记]音视频学习之视音频数据处理入门《四》AAC
[笔记]音视频学习之视音频数据处理入门《四》AAC
|
编解码 Android开发 数据安全/隐私保护
Android平台如何实现外部编码后(H.264/H.265)数据实时预览播放
我们在对接开发者的时候,遇到这样的诉求:除了正常的RTMP、RTSP直播播放外,有些硬件设备输出编码后(H.264/H.265)的数据,比如无人机或类似硬件产品,回调出来的H.264/H.265数据,除了正常转推到RTMP、轻量级RTSP服务或GB28181外,还需要本地预览甚至重新对数据做二次处理,基于这样的场景诉求,我们开发了外部编码后数据实时预览播放模块。
|
编解码 Android开发 开发者
Android平台GB28181设备接入模块如何实现实时视频和本地录像双码流编码
我们在做Android平台GB28181设备接入模块的时候,遇到这样的场景,比如执法记录仪或智慧工地等场景下,由于GB28181设备接入模块,注册到国标平台后,平时只是心跳保持,或还有实时位置订阅,查看视频的时候,是按需看,而且有时候,网络环境并不是太好,所以,催生了这样一个诉求:部分开发者希望能本地录像的时候,录制高分辨率(比如1920*1080),国标平台侧发起实时视频查看请求的时候,上传低分辨率(如1280*720)数据,有点类似于IPC的主码流和子码流。
|
存储 编解码 开发框架
主流视频编码技术H.264简介
  前戏   在之前的调研中,发现还是有些朋友对流媒体感兴趣,所以本人准备几篇文章讲解下流媒体技术。本文呢,讲解下H264,为之后的文章做个铺垫。感谢各位!   H.264简介
328 0
|
存储 Web App开发 编解码
如何使用下一代编码技术提升流媒体体验
本文来自Bitmovin总裁及联合创始人Stefan Lederer LiveVideoStackCon2019北京大会上的分享。Stefan介绍了下一代编解码器和编码技术的实施,以及如何让观众有更好的流媒体和视频体验。另外,还进一步解释HEVC、VP9和AV1如何在不同的设备上运作。如果将这些编解码器结合,可以降低比特率获取更大的存储空间,把CDN成本降低30%。
661 0
如何使用下一代编码技术提升流媒体体验
|
Web App开发 缓存 算法
白话解读 WebRTC 音频 NetEQ 及优化实践
NetEQ 是 WebRTC 音视频核心技术之一,对于提高 VoIP 质量有明显的效果,本文将从更为宏观的视角,用通俗白话介绍 WebRTC 中音频 NetEQ 的相关概念背景和框架原理,以及相关的优化实践。
白话解读 WebRTC 音频 NetEQ 及优化实践