【H.264/AVC视频编解码技术详解】十九、熵编码(5):CABAC语法元素的二值化

2023-11-12

《H.264/AVC视频编解码技术详解》视频教程已经在“CSDN学院”上线,视频中详述了H.264的背景、标准协议和实现,并通过一个实战工程的形式对H.264的标准进行解析和实现,欢迎观看!

“纸上得来终觉浅,绝知此事要躬行”,只有自己按照标准文档以代码的形式操作一遍,才能对视频压缩编码标准的思想和方法有足够深刻的理解和体会!

链接地址:H.264/AVC视频编解码技术详解

GitHub代码地址:点击这里


一、上下文自适应的二进制算术编码

在上篇博文【H.264/AVC视频编解码技术详解】十八:算术编码的基本原理与实现中研究了算术编码的基本概念,然而在实际的H.264编解码的方法中,显然是不可能采用上文中简单的算法来实现。在实际应用中,H.264采用的为称作上下文自适应的二进制算术编码(Context-based Adaptive Binary Arithmetic Coding, CABAC)。CABAC算法是H.264中新引入的一种非常复杂的熵编码算法,专门用于视频的压缩编码。事实证明,在视频压缩编码领域,CABAC保持了强大的生命力,在H.264更新的标准H.265中继续保留了CABAC算法,并且废弃了CAVLC而将CABAC作为主要的熵编码方法。

在CABAC中,主要步骤或算法可以分为3个步骤/类别:

  1. 语法元素的二值化;
  2. 上下文模型;
  3. 算术编码;

在本章节中主要讨论语法元素二值化过程,上下文模型和算术编码在后续章节详述。

二、二值化方法

我们知道,预测编码、变换编码等步骤输出的信息多种多样,不会仅仅出现二进制数据,例如宏块类型mb_type或预测模式pred_mode等信息具有比较广泛的取值范围。在输入算术编码器之前,需要对这些语法元素进行二值化操作。在H.264的标准文档中,二值化的方法定义在9.3.2节。

语法元素二值化的输入数据为一个语法元素的值,例如型mb_type等。而输出的信息为语法元素的二值化数据流,以及maxBinIdxCtx、ctxIdxOffset和bypassFlag等信息。在协议文档中定义的二值化方法有:

  • 一元二值化(Unary Binarization);
  • 截断一元二值化(Truncated Unary Binarization);
  • k阶指数哥伦布编码;
  • 定长编码;
  • 其他方法;

2.1 一元二值化(Unary Binarization)

一元二值化方法是一种非常简单的方法。二值化之后的码流长度等于语法元素的值val,且除了最后一位为0外,前面的val-1位均为1。对应关系为:
在这里插入图片描述

2.2 截断一元二值化(Truncated Unary Binarization)

采用截断一元二值化方法时,输入数据除了语法元素的值之外,还需要传入一个值cMax,表示语法元素的上限值。使用截断一元二值化时,如果语法元素的值小于cMax,则采用2.1所述的一元二值化方法;如果语法元素的值等于cMax,则二值化的输出码流为cMax个bit-1。

2.3 k阶指数哥伦布编码

指数哥伦布编码在前面的博文中已有详述,详情可见:

2.4 定长编码

定长编码的输入数据包括语法元素的值和cMax,,表示语法元素的上限值。定长编码的码字长度以cMax的长度为准,并按二进制排列每一个语法元素值作为编码的对应。

三、语法元素的二值化

3.1 语法元素相关的特定二值化方法

在标准协议文档的9.2.3.5描述了宏块类型mb_type和子宏块类型sub_mb_type的二值化。这两种类型的二值化方法不是由某个算法推导,而是由表格指定。表9-36到9-38描述了此类语法元素的值与二进制数据的关系。

3.2 Coded Block Pattern的二值化

对于CBP数据,其二值化码流由前缀和后缀组成。前缀表示亮度cbp,即CodedBlockPatternLuma,由cMax为15的定长编码实现;若ChromaArrayType不等于0或3,则后缀表示色度cbp即CodedBlockPatternChroma,由cMax为2的截断一元编码表示。

3.3 mb_qp_delta的二值化

mb_qp_delta的二值化过程需要首先解决一个其取值有正有负的过程,因此首先采用了标准文档中表9-3中的正负值映射方法将mb_qp_delta全部转换为非负值,而后采用一元编码方法进行二值化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【H.264/AVC视频编解码技术详解】十九、熵编码(5):CABAC语法元素的二值化 的相关文章

  • 视频转码后有色差要如何处理

    目录 视频转码后有色差要如何处理 KEY COLOR STANDARD KEY COLOR RANGE 视频转码后有色差要如何处理 以下是回答 欢迎大家留言讨论补充 1 色差是如何产生的 1 有损压缩产生的质量损失 解决方法为尽可能的提高码
  • linux安装ffmpeg

    1 下载解压 wget http www ffmpeg org releases ffmpeg 3 1 tar gz tar zxvf ffmpeg 3 1 tar gz 2 进入解压后目录 输入如下命令 usr local ffmpeg为
  • H264 视频使用 src 属性工作。使用 MediaSource API (Chromium) 相同视频失败

    http www youtube com html5表示 Google Chrome 兼容 MediaSource Extensions 和 H 264 我做了一个简单的测试 检查我的视频是否受 Chromium 支持 使用 视频 gt 视
  • H264 NAL 单元前缀

    我需要对 H264 NAL 单位分隔符前缀进行一些澄清 00 00 00 01 and 00 00 01 我正在使用 Intel Media SDK 生成 H264 并将其打包到 RTP 中 问题是到目前为止我只是在寻找00 00 00 0
  • 如何用 SPS 和 PPS 数据填充 AVCodecContext 的“extradata”字段?

    问题是这样的 当解码 H264 流时ffmpeg 我可以获得SPS和PPS的原始数据 但我不知道如何将它们填充到extradata现场AVCodecContext 没有extradata 我无法正确解码帧 每次我打电话avcodec dec
  • 将 H.264 帧复用到 MP4 时,Media Foundation IMFSinkWriter::Finalize() 方法在 Windows 7 下失败

    我正在用 C 编写一个工具 将 H 264 帧混合到 MP4 文件中 并且我使用 Media Foundation 的媒体接收器和接收器编写器来执行此操作 在 Win8 下一切工作得很好 但在 Windows 7 下 当调用接收器编写器的
  • 通过 MP4 进行直播

    我正在从事在线电视服务工作 目标之一是无需任何额外的浏览器插件 Flash 除外 即可播放视频 我决定使用 MP4 因为大多数 HTML5 浏览器和 Flash 作为后备 都支持它 这些视频由 FFMpeg 从服务器上的 ASF 进行转码
  • 将 mkv 转换为 h264 FFmpeg

    EDIT 这个问题已经变得非常流行 并且是搜索 convert mkv to h264 ffmpeg 的最佳结果之一 因此我认为对于任何偶然发现这个问题的人来说 添加这一点是适当的 而不是使用 ffmpeg i input mkv c v
  • 如何处理 cv::VideoCapture 解码错误?

    我使用 OpenCV 的 VideoCapture 使用 ffmpeg 支持编译 从 IP 摄像机流式传输 H264 内容 到目前为止 一切正常 但每隔一段时间我就会遇到解码错误 我猜是来自 ffmpeg h264 0x103006400
  • 无法播放某些视频

    我正在尝试通过我们的服务器在 Android 设备上播放电影 它不是一个媒体服务器 只是一个普通的 Apache 服务器 我们使用相同的 API 来访问 iPhone 上的视频 效果很好 在 Android 设备上 某些视频可以播放 而另一
  • 将 FFMPEG 编码为 MPEG-DASH – 或使用关键帧簇的 WebM – 用于 MediaSource API

    我目前正在将视频流发送到 Chrome 以通过 MediaSource API 进行播放 据我了解 MediaSource 仅支持使用 MPEG DASH 编码的 MP4 文件 或具有以关键帧开头的簇的 WebM 文件 否则会引发错误 媒体
  • Android MediaCodec 似乎可以缓冲 H264 帧

    我正在手动读取 RTP H264 流并将 H264 帧传递给 Android MediaCodec 我使用 markerBit 作为框架的边框 MediaCodec 与 OpenGL 纹理 SurfaceTexture 绑定 一般来说 一切
  • H.264 over RTP - 识别 SPS 和 PPS 帧

    我有来自 IP 摄像机的原始 H 264 流 封装在 RTP 帧中 我想将原始 H 264 数据放入文件中 以便我可以将其转换为ffmpeg 因此 当我想将数据写入原始 H 264 文件时 我发现它必须如下所示 00 00 01 SPS 0
  • 使用libavcodec解码H264视频,C

    我正在尝试使用 ffmpeg libavcodec 解码原始 h264 文件 但无法使其正常工作 目前输出应该是原始 YUV 文件 可以用GCC编译代码 gcc o decoder decoder c L lib llibavcodec l
  • 解析 mdat MP4 中的 H264

    我有一个仅包含 MP4 容器中的 mdat 原子的文件 mdat中的数据包含AVC数据 我知道数据的编码参数 该格式似乎不是附件 B 字节流格式 我想知道我将如何解析这个 我尝试过搜索切片标题 但运气不佳 是否可以在没有 NAL 的情况下解
  • 如何使用Android MediaCodec编码相机数据(YUV420sp)

    感谢您的关注 我想使用Android MediaCodec API对从Camera获取的视频帧进行编码 不幸的是 我没有成功做到这一点 我对 MediaCodec API 还不太熟悉 以下是我的代码 我需要你的帮助来弄清楚我应该做什么 1
  • 为什么 AVSampleBufferDisplayLayer 会失败并出现操作中断 (-11847)?

    我正在使用一个AVSampleBufferDisplayLayer解码并显示从服务器流式传输的 H 264 视频 当我的应用程序进入后台然后返回前台时 解码过程就会搞砸 并且AVSampleBufferDisplayLayer失败 我看到的
  • Gstreamer - Android 上的硬件加速视频解码

    我在 Android 手机上通过 RTP UDP 接收视频 但我发现 CPU 使用率非常高 几乎 100 的一个核心都用于解码视频 在高端设备上 视频播放几乎流畅 但在中低端设备上 我几乎每秒无法获得 1 帧 这是一个 H 264 视频流
  • 使用 libavcodec 的 mpegts 容器中的原始 H264 帧

    我非常感谢对以下问题的帮助 我有一个带摄像头的小工具 可以生成 H264 压缩视频帧 这些帧将发送到我的应用程序 这些帧不在容器中 只是原始数据 我想用ffmpeg和libav函数创建一个视频文件 方便以后使用 如果我解码帧 然后对其进行编
  • Apple HLS 中的 PES 数据包内的访问单元如何对齐?

    Apple 是否指定了这一点 PES 数据包有效负载中应放置多少个访问单元 另外 我想知道 PES 数据包中存在哪些前缀起始代码 如果有 我认为访问单元中第一个 NAL 单元之前的单元是无用的 不能放置 正确的 我想知道它是如何在 HLS

随机推荐

  • 网络安全(黑客)自学笔记&学习路线

    谈起黑客 可能各位都会想到 盗号 其实不尽然 黑客是一群喜爱研究技术的群体 在黑客圈中 一般分为三大圈 娱乐圈 技术圈 职业圈 娱乐圈 主要是初中生和高中生较多 玩网恋 人气 空间 建站收徒玩赚钱 技术高的也是有的 只是很少见 技术圈 这个
  • Jeesite4本地及服务器上传文件、图片详解

    大家过年好 你们的老朋友小Q又回来了 最近一段时间忙于公司项目开发 又加上过年比较忙 所以没能留出时间更新内容 大家是不是有点着急了 公司最近在使用jeesite4开发项目 我呢 对这个框架一点也不熟悉 遇到问题都是现查现用 这不 在上传文
  • 【Vue3源码学习】响应式 api: watchEffect

    在 Vue2中watch 是 option 写法中一个很常用的选项 使用它可以非常方便的监听一个数据源的变化 而在 Vue3 中watch 独立成了一个 响应式api 源码地址 packages runtime core src apiWa
  • IOS发送通知与接收通知

    1 注册通知 注册通知 NSNotificationCenter defaultCenter addObserver self selector selector notiReceived name RefreshOrder object
  • 单例模式的优缺点和使用场景

    单例模式 Singleton 也叫单子模式 是一种常用的软件设计模式 在应用这个模式时 单例对象的类必须保证只有一个实例存在 许多时候整个系统只需要拥有一个的全局对象 这样有利于我们协调系统整体的行为 比如在某个服务器程序中 该服务器的配置
  • Unity Animation动画系统

    Unity Animation动画系统 Animation基础用法 Animator动画状态机 注意一些细节 Animation基础用法 创建游戏对象并添加Animation组件 然后将动画文件拖入组件 注意 需要进入动画文件的Debug属
  • 保持健康体态

    少吃多动 我们日常生活中经常可以吃到的米面谷物 蛋糕甜点等都属于富含 碳水化合物 的食物 其中 像蛋糕 甜点 面条这种经过精细加工的食物 就可以被理解为 精制碳水化合物 而奶茶 饮料里边的糖更是精加工碳水 平时吃的精白米面 都属于是精加工碳
  • Linux文件误删除恢复操作

    本文参考http write blog csdn net postedit ticket ST 491405 OGjDDusZeyMgVQ7bHW7f passport csdn net 前言 作为一个多用户 多任务的操作系统 Linux下
  • Linux统计物理cpu、逻辑cpu

    物理cpu个数 grep physical id proc cpuinfo sort uniq wc l 每个物理cpu的核心个数 grep cpu cores proc cpuinfo uniq awk F print 2 每个物理cpu
  • 值传递与引用传递的区别

    一 值传递 是指在调用函数时将实际参数复制一份传递到函数中 这样在函数中如果对参数进行修改 将不会影响到实际参数 代码在内存中的执行流程 1 首先加载main方法 2 接下来int number 100 3 输出调用前的number 结果为
  • C# 参考 : sealed 密封类

    C 语言参考 sealed C 参考 当对一个类应用 sealed 修饰符时 此修饰符会阻止其他类从该类继承 在下面的示例中 类 B 从类 A 继承 但是任何类都不能从类 B 继承 1 class A 2 sealed class B A
  • mysql提高数据插入效率

    1 同时插入多行记录时 宜采用一条Insert语句 2 批量插入记录时 建立采用Load Date Infile语句 3 插入延迟 提高插入操作对系统的不利影响 4 在插入大量数据之前 可以先将表锁定 5 插入数据之前先对数据进行排序
  • Java BufferedImage设置透明背景

    方式一 从网上搜索出来的方案 BufferedImage bufferedImage new BufferedImage width height BufferedImage TYPE INT RGB Graphics2D graphics
  • 《c/c++ 获取时间戳》——精确到毫秒

    timeb h和time h 这两个是C 的标准头文件 在Microsoft Visual Studio VC98 Include中 表示了C 对时间的支持能力 time h中申明了tm结构体 来对时间年月日 时分秒的支持 值得注意的是 它
  • 小程序运营成功的秘诀

    随着移动互联网的快速发展 小程序已经成为许多企业提升用户体验 增强市场竞争力的重要工具 然而 在竞争激烈的市场环境下 要想让小程序真正成功 吸引用户并保持用户的活跃度 需要一系列有效的运营策略 本文将深入探讨小程序运营成功的关键要素 帮助企
  • [Oracle]解决dbms_output.put_line输出长度限制

    解决dbms output put line输出长度限制 设置dbms output enable n n为一个比较大的数值 即长度大于即将输出的内容 如下函数是将输出的长段内容逐行输出的存储过程 可替代dbms output put li
  • WSL2实现桥接网卡(简单版)局域网内互ping不成问题~

    Windows操作 同时选中wsl网卡与以太网网卡 然后选择桥接 就会出现桥接网卡 设置网桥的静态ip和dns WSL2操作 执行以下脚本 实际IP地址 网关啥的根据实际情况设置 bin bash new ip 168 168 4 169
  • VGGNet实现CIFAR-100图像识别-2(图像增强/ImageDataGenerator)

    图像增强 ImageDataGenerator 官方文档直达 代码 注意 使用图像增强的原因 测试ImageDataGenerator对象的flow方法中batch size参数 具体分析ImageDataGenerator对象的flow方
  • Android博客周刊专题之#插件化开发#

    转自 http www androidblog cn index php Index detail id 16 本期专栏目讨论插件化开发 插件化涉及的东西很多 所以我们需要多个维度去学习 大概分为5个部分 预备知识 入门 进阶 系列 类库
  • 【H.264/AVC视频编解码技术详解】十九、熵编码(5):CABAC语法元素的二值化

    H 264 AVC视频编解码技术详解 视频教程已经在 CSDN学院 上线 视频中详述了H 264的背景 标准协议和实现 并通过一个实战工程的形式对H 264的标准进行解析和实现 欢迎观看 纸上得来终觉浅 绝知此事要躬行 只有自己按照标准文档