视频编解码基础概念

简介: 本文涉及视频编解码最基础概念,从工程应用角度出发,帮助理解和编写源码。本文并不涉及深层次原理和算法。错误难免,逐渐完善

作者:叶余

来源:https://www.cnblogs.com/leisure_chn/p/10285829.html


1. 概述

音视频领域早期采用模拟化技术,目前已发展为数字化技术。数字化的主要好处有:可靠性高、能够消除传输及存储损耗,便于计算机处理及网络传输等。数字化后,音视频处理就进入了计算机技术领域,音视频处理本质上就是对计算机数据的处理。

图像信息经采集后生成的原始视频数据,数据量非常大,对于某些采集后直接本地播放的应用场合,不需要考虑压缩技术。但现实中更多的应用场合,涉及视频的传输与存储,传输网络与存储设备无法容忍原始视频数据的巨大数据量,必须将原始视频数据经过编码压缩后,再进行传输与存储。

本文仅关注视频,不关注音频。

2. 视频压缩原理

2.1 熵与冗余

引自参考资料[1]第1.5节

在所有的实际节目素材中,存在着两种类型的信号分量:即异常的、不可预见的信号分量和可以预见的信号分量。异常分量称为,它是信号中的真正信息。其余部分称为冗余,因为它不是必需的信息。冗余可以是空间性的,如在图像的大片区域中,邻近像素几乎具有相同的数值。冗余也可以是时间性的,例如连续图像之间的相似部分。在所有的压缩系统编码器中都是将熵与冗余相分离,只有熵被编码和传输,而在解码器中再从编码器的发送的信号中计算出冗余。

2.2 帧内编码

帧内编码是空间域编码,利用图像空间性冗余度进行图像压缩,处理的是一幅独立的图像,不会跨越多幅图像。空间域编码依赖于一幅图像中相邻像素间的相似性和图案区的主要空间域频率。

JPEG标准用于静止图像(即图片),只使用了空间域压缩,只使用帧内编码。

2.3 帧间编码

帧间编码是时间域编码,是利用一组连续图像间的时间性冗余度进行图像压缩。如果某帧图像可被解码器使用,那么解码器只须利用两帧图像的差异即可得到下一帧图像。比如运动平缓的几帧图像的相似性大,差异性小,而运动剧烈的几幅图像则相似性小,差异性大。当得到一帧完整的图像信息后,可以利用与后一帧图像的差异值推算得到后一帧图像,这样就实现了数据量的压缩。时间域编码依赖于连续图像帧间的相似性,尽可能利用已接收处理的图像信息来“预测”生成当前图像。

MPEG标准用于运动图像(即视频),会使用空间域编码和时间域编码,因此是帧内编码和帧间编码结合使用。

2.4 运动矢量

一组连续图像记录了目标的运动。运动矢量用于衡量两帧图像间目标的运动程度,运动矢量由水平位移量和垂直位移量二者构成。

2.5 运动补偿

目标的运动降低了图像间的相似性,增加了差异数据量。而运动补偿则通过运行矢量来降低图像间的差异数据量。

下图为运动补偿的示意图。当某一目标运动时,其位置会变化但形状颜色等基本不变。编码器则可利用运动矢量减低图像差值,解码器根据图像差值中的运动矢量移动目标到合适的位置即可。假设图中是理想情况,目标除移动位置外其他任何属性无任何变化,则两幅图像间的差值仅包含运动矢量这一数据量。显然运动补偿可以显著减少图像差值数据量。

image.png

2.6 双向预测

先看示意图:

image.png

连续的三幅图像中,目标块有垂直位置上的移动,背景块无位置移动。我们考虑如何取得当前帧图像(画面N):

画面N中,目标向上移动后,露出背景块。

画面N-1中,因为背景块被目标块遮挡住了,因此没有背景块相关信息。

画面N+1中,完整包含背景块的数据,因此画面N可以从画面N-1中取得背景块。

如何可以得到画面N呢?解码器可以先解码得到画面N-1和画面N+1,通过画面N-1中的目标块数据结合运动矢量即可得到画面N中的目标块数据,通过画面N+1中的背景块数据则可得到画面N中的背景块数据。三幅画面的解码顺序为:N-1, N+1, N。三幅画面的显示顺序为:N-1, N, N+1。画面N通过其前一幅画面N-1和后一幅画面N+1推算(预测,predicted)得到,因此这种方式称为双向预测(或前向预测、双向参考)。

2.7 I帧/IDR帧/P帧/B帧

I帧:I帧(Intra-coded picture, 帧内编码帧,常称为关键帧)包含一幅完整的图像信息,属于帧内编码图像,不含运动矢量,在解码时不需要参考其他帧图像。因此在I帧图像处可以切换频道,而不会导致图像丢失或无法解码。I帧图像用于阻止误差的累积和扩散。在闭合式GOP中,每个GOP的第一个帧一定是I帧,且当前GOP的数据不会参考前后GOP的数据。

IDR帧:IDR帧(Instantaneous Decoding Refresh picture, 即时解码刷新帧)是一种特殊的I帧。当解码器解码到IDR帧时,会将DPB(Decoded Picture Buffer,指前后向参考帧列表)清空,将已解码的数据全部输出或抛弃,然后开始一次全新的解码序列。IDR帧之后的图像不会参考IDR帧之前的图像,因此IDR帧可以阻止视频流中的错误传播,同时IDR帧也是解码器、播放器的一个安全访问点。

P帧:P帧(Predictive-coded picture, 预测编码图像帧)是帧间编码帧,利用之前的I帧或P帧进行预测编码。

B帧:B帧(Bi-directionally predicted picture, 双向预测编码图像帧)是帧间编码帧,利用之前和(或)之后的I帧或P帧进行双向预测编码。B帧不可以作为参考帧。

B帧具有更高的压缩率,但需要更多的缓冲时间以及更高的CPU占用率,因此B帧适合本地存储以及视频点播,而不适用对实时性要求较高的直播系统。

2.8 GOP

GOP(Group Of Pictures, 图像组)是一组连续的图像,由一个I帧和多个B/P帧组成,是编解码器存取的基本单位。GOP结构常用的两个参数M和N,M指定GOP中两个anchor frame(anchor frame指可被其他帧参考的帧,即I帧或P帧)之间的距离,N指定一个GOP的大小。例如M=3,N=15,GOP结构为:IBBPBBPBBPBBPBB

TODO: GOP中是否每两个anchor frame的间隔是相同的?推测:未必相同。实际上分析不少视频文件,规律并不一致。此处没有彻底弄清楚,待进一步积累素材、分析与确认。

GOP有两种:闭合式GOP和开放式GOP:

闭合式GOP:闭合式GOP只需要参考本GOP内的图像即可,不需参考前后GOP的数据。这种模式决定了,闭合式GOP的显示顺序总是以I帧开始以P帧结束

TODO: 闭合式GOP是否一定是以P帧结束?推测:可能未必有此定义。有看到某些视频文件GOP以B帧结束。

开放式GOP:开放式GOP中的B帧解码时可能要用到其前一个GOP或后一个GOP的某些帧。码流里面包含B帧的时候才会出现开放式GOP。

TODO: 开放式GOP是否规定是以B帧开始,P帧结束?推测:可能未必有此定义。是否以B帧开始?网上资料说法不一。是否以P帧结束?有看到某些视频文件GOP以B帧结束。

在开放式GOP中,普通I帧和IDR帧功能是有差别的,需要明确区分两种帧类型。在闭合式GOP中,普通I帧和IDR帧功能没有差别,可以不作区分。

开放式GOP和闭合式GOP中I帧、P帧、B帧的依赖关系如下图所示:

image.png

2.9 DTS和PTS

DTS(Decoding Time Stamp, 解码时间戳),表示压缩帧的解码时间。

PTS(Presentation Time Stamp, 显示时间戳),表示将压缩帧解码后得到的原始帧的显示时间。

音频中DTS和PTS是相同的。视频中由于B帧需要双向预测,B帧依赖于其前和其后的帧,因此含B帧的视频解码顺序与显示顺序不同,即DTS与PTS不同。当然,不含B帧的视频,其DTS和PTS是相同的。下图以一个开放式GOP示意图为例,说明视频流的解码顺序和显示顺序

image.png

采集顺序指图像传感器采集原始信号得到图像帧的顺序。

编码顺序指编码器编码后图像帧的顺序。存储到磁盘的本地视频文件中图像帧的顺序与编码顺序相同。

传输顺序指编码后的流在网络中传输过程中图像帧的顺序。

解码顺序指解码器解码图像帧的顺序。

显示顺序指图像帧在显示器上显示的顺序。

采集顺序与显示顺序相同。编码顺序、传输顺序和解码顺序相同。

以图中“B[1]”帧为例进行说明,“B[1]”帧解码时需要参考“I[0]”帧和“P[3]”帧,因此“P[3]”帧必须比“B[1]”帧先解码。这就导致了解码顺序和显示顺序的不一致,后显示的帧需要先解码。

3. 参考资料

[1] 泰克Tektronic, MPEG基础和协议分析指南

[2] 视频直播的理论知识https://www.jianshu.com/p/04b5b1e4ff27

[3] open GOP & close GOP, https://www.jianshu.com/p/d30c051b4106

[4] I帧/B帧/P帧/GOP, https://blog.csdn.net/abcsunl/article/details/68190136

[5] FFmpeg音视频同步原理与实现, https://www.jianshu.com/p/3578e794f6b5

[6] FFmpeg音视频同步, https://www.jianshu.com/p/27279255f67e

[7] The GOP Inter Prediction of H.264 AVC, https://www.sciencedirect.com/science/article/pii/S1319157819301867

[8] WiKi Group of pictures, https://en.wikipedia.org/wiki/Group_of_pictures

[9] Open and Closed GOPs – All You Need to Know, https://streaminglearningcenter.com/articles/open-and-closed-gops-all-you-need-to-know.html

4. 修改记录

2018-12-08 V1.0 初稿

2020-11-24 V1.0 修正GOP中M参数描述错误。修改文字笔误。


「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。

阿里云视频云@凡科快图.png

相关文章
|
6月前
|
Java API 微服务
2025 年 Java 核心技术全面升级与实战应用详解
这份Java校招实操内容结合了最新技术趋势,涵盖核心技术、微服务架构、响应式编程、DevOps及前沿技术等六大模块。从函数式编程到Spring Cloud微服务,再到容器化与Kubernetes部署,帮助你掌握企业级开发技能。同时,提供AI集成、区块链实践和面试技巧,包括高频算法题与系统设计案例。通过学习这些内容,可应对90%以上的Java校招技术面试,并快速上手实际项目开发。资源链接:[点此获取](https://pan.quark.cn/s/14fcf913bae6)。
770 41
|
4月前
|
人工智能 缓存 自然语言处理
大模型性能测试完全指南:从原理到实践
本文介绍了大模型性能测试的核心价值与方法,涵盖流式响应机制、PD分离架构、五大关键指标(如首Token延迟、吐字率等),并通过实战演示如何使用Locust进行压力测试。同时探讨了多模态测试的挑战与优化方向,帮助测试工程师成长为AI系统性能的“诊断专家”。
|
存储 编解码 算法
视频为什么可以被压缩?帧内压缩与帧间压缩有何区别?视频编码中的CBR、VBR、CRF...是什么?
视频压缩基于冗余,包括空间冗余、时间冗余、视觉冗余和编码冗余。帧内压缩利用空间相关性,帧间压缩利用时间相关性。视频编码中的码率控制方法有CBR(固定码率)、VBR(动态码率)、CRF(固定码率系数)、CQP(固定质量参数)、CVBR(约束可变码率)和ABR(平均码率),各有优缺点,适用于不同的场景。
用户态和内核态是如何切换的?
【10月更文挑战第28天】用户态和内核态的切换是通过系统调用指令、异常和中断等机制来实现的。这些机制确保了应用程序能够在需要时请求内核提供的服务,同时也保证了内核能够对系统资源进行有效的管理和保护,维护系统的稳定性和安全性。通过准确地保存和恢复上下文信息,实现了用户态和内核态之间的无缝切换,为计算机系统的正常运行提供了有力保障。
|
11月前
|
人工智能 自然语言处理 Java
Spring Cloud Alibaba AI 入门与实践
本文将介绍 Spring Cloud Alibaba AI 的基本概念、主要特性和功能,并演示如何完成一个在线聊天和在线画图的 AI 应用。
3222 8
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
1472 9
|
存储 编解码 API
【视频花屏问题】解码天书:深入理解视频流花屏现象及其解决方案
【视频花屏问题】解码天书:深入理解视频流花屏现象及其解决方案
2777 8
|
编译器 C++
VS Code设置C++编译器路径
VS Code设置C++编译器路径
732 0
|
算法
25. K 个一组翻转链表
25. K 个一组翻转链表
144 9
|
存储 编解码 算法
深入浅出:FFmpeg 音频解码与处理AVFrame全解析(一)
深入浅出:FFmpeg 音频解码与处理AVFrame全解析
2166 0