【H.264/AVC视频编解码技术详解】十二、解析H.264码流的宏块结构(下):H.264帧内编码宏块的预测结构

2023-11-07

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

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

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

GitHub代码地址:点击这里

在以H.264格式编码的视频码流中,宏块结构必然包含预测结构(I_PCM模式除外),该结构中包含了像素块的预测模式等信息。对于不同预测模式的宏块,其预测结构是不同的。从上篇的宏块结构中,可以看出,对于部分模式,预测信息保存于mb_pred()结构中,而对于另一部分模式则采用sub_mb_pred()结构。
在这里插入图片描述

在我们本系列的H.264分析器SimpleH264Analyzer项目中默认的全I帧测试码流中,我们所分析的第一个IDR帧的第一个宏块,其mb_type为I_NxN。实际上,对于除了I_PCM模式之外的所有Intra宏块,其预测结构均采用mb_pred()结构。

在标准文档中,mb_pred()的定义如下表所示(只看Intra模式下):
在这里插入图片描述

从表中可以看出,Intra预测模式的结构主要有两组,分别表示4×4和8×8模式,每一组包含两个元素,分别表示预测模式标识位和预测模式值,以及最后的色度分量预测模式。

  • prev_intra4x4_pred_mode_flag和prev_intra8x8_pred_mode_flag:表示帧内预测模式预测标识。如果该标识位为1,表示帧内预测模式的预测值就是实际的模式,否则就需要另外传递实际的帧内预测模式。
  • prev_intra4x4_pred_mode_flag和prev_intra8x8_pred_mode_flag:表示额外传递的实际帧内预测模式。
  • intra_chroma_pred_mode:表示色度分量的预测模式,取值范围为[0,3],分别代表DC、水平、垂直和平面模式。

在我们的demo中解析这部分的代码以下面的代码段实现:

if (m_mb_type == 25)
{
	// To do: I-PCM mode...
} 
else if (m_mb_type == 0)
{
	// Intra_NxN mode...
	if (m_pps_active->Get_transform_8x8_mode_flag())
	{
		m_transform_size_8x8_flag = Get_bit_at_position(m_pSODB, m_bypeOffset, m_bitOffset);
	}

	// Get prediction-block num...
	if (m_transform_size_8x8_flag)
	{
		// Using intra_8x8
		m_pred_struct = new IntraPredStruct[4];	
		for (int luma8x8BlkIdx = 0; luma8x8BlkIdx < 4; luma8x8BlkIdx++)
		{
			m_pred_struct[luma8x8BlkIdx].block_mode = 1;
			m_pred_struct[luma8x8BlkIdx].prev_intra_pred_mode_flag = Get_bit_at_position(m_pSODB, m_bypeOffset, m_bitOffset);
			if (!m_pred_struct[luma8x8BlkIdx].prev_intra_pred_mode_flag)
			{
				m_pred_struct[luma8x8BlkIdx].rem_intra_pred_mode = Get_uint_code_num(m_pSODB, m_bypeOffset, m_bitOffset, 3);
			}
		}
	} 
	else
	{
		// Using intra_4x4
		m_pred_struct = new IntraPredStruct[16];
		for (int luma4x4BlkIdx = 0; luma4x4BlkIdx < 16; luma4x4BlkIdx++)
		{
			m_pred_struct[luma4x4BlkIdx].block_mode = 0;
			m_pred_struct[luma4x4BlkIdx].prev_intra_pred_mode_flag = Get_bit_at_position(m_pSODB, m_bypeOffset, m_bitOffset);
			if (!m_pred_struct[luma4x4BlkIdx].prev_intra_pred_mode_flag)
			{
				m_pred_struct[luma4x4BlkIdx].rem_intra_pred_mode = Get_uint_code_num(m_pSODB, m_bypeOffset, m_bitOffset, 3);
			}
		}
	}

	// intra_chroma_pred_mode
	m_intra_chroma_pred_mode = Get_uev_code_num(m_pSODB, m_bypeOffset, m_bitOffset);
}
else
{
	// To do: Intra_16x16 mode
}

更详细的信息可以到github下载完整的工程:
https://github.com/yinwenjie/SimpleH264Analyzer

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

【H.264/AVC视频编解码技术详解】十二、解析H.264码流的宏块结构(下):H.264帧内编码宏块的预测结构 的相关文章

  • ffmpeg错误码

    cpp view plain copy AVERROR BSF NOT FOUND 1179861752 AVERROR BUG 558323010 AVERROR DECODER NOT FOUND 1128613112 AVERROR
  • 从 AVAssetWriter 读取实时 H.264 输出时数据损坏

    我正在使用一些技巧来尝试在将 AVAssetWriter 写入磁盘时读取其原始输出 当我通过连接各个文件来重新组装它们时 生成的文件与 AVAssetWriter 的输出文件的字节数完全相同 但是 重新组装的文件将无法在 QuickTime
  • 使用 MediaCodec 和 MTK Codec 编码时选择 H264 Profile

    我们有一个 Android 应用程序 可以将视频编码为 H264 在所有以前尝试过的 Android 设备上 这都会编码为 Baseline 配置文件 这正是我所需要的 在 Lenovo Yoga 10 上 编解码器为 OMX MTK VI
  • 除 ffmpeg x264 之外的 H264 编码器

    我正在开发的 iPhone 应用程序会在特定的用户定义的时间间隔内连续捕获图像 我正在寻找一种将这些图像组合成 H264 编码视频的方法 我在 Google 上做了一些研究 看起来我必须在 iPhone 上使用 ffmpeg mencode
  • 了解 libx264 输出 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我在 ffmpeg 中使用 libx264 进行编码 最后我得到了以下输出 谁能指导我理解和解释这一点 有任何参考 文档吗 01 01 06 34 43 650 I stderr 6
  • 将 mkv 转换为 h264 FFmpeg

    EDIT 这个问题已经变得非常流行 并且是搜索 convert mkv to h264 ffmpeg 的最佳结果之一 因此我认为对于任何偶然发现这个问题的人来说 添加这一点是适当的 而不是使用 ffmpeg i input mkv c v
  • ffmpeg API h264编码的视频不能在所有平台上播放

    Edit 在之前的版本中 我使用了非常旧的 ffmpeg API 我现在使用最新的库 问题仅略有变化 从 主要 变为 高 我正在使用 ffmpeg C API 在 C 中创建 mp4 视频 我希望生成的视频具有 约束基线 配置文件 以便生成
  • 从 QuickTime MOV 文件解析 h.264 NAL 单元

    我正在尝试从 iPhone 上的 MOV 文件获取 h 264 NAL 单位 以便将 RTP h 264 视频从 iPhone 摄像头传输到服务器 Apple 的 API 不允许直接访问来自相机输出的编码比特流 因此我只能在写入 MOV 文
  • 从 H.264 中删除 EIA-608 隐藏式字幕而不重新编码

    我希望从 H 264 视频 包含为 mkv 中删除隐藏字幕 EIA 608 而不需要重新编码 我最接近的是使用 ffmpeg ffmpeg f lavfi i movie input mkv out subcc map 0 0 output
  • 实用软件分享,打工人必备~

    在这个数字化时代 各种实用软件已经成为我们生活中不可或缺的工具 它们可以帮助我们更高效地完成工作 提高生活质量 节省时间和精力 本文将为您介绍几款实用的软件 让您的工作和生活更加便捷 一 视频下载工具 犀牛下载器 一款免安装的在线视频下载工
  • ffmpeg 复制以保留时间戳

    我正在尝试修改 HLS 段传输流 并使用 ffmpeg 保留其开始时间 但是 即使提到了 copyts 输出也不会保留输入文件的 start time 值 这是我的命令行 ffmpeg i fileSequence1 ts i x png
  • 如何在没有 MediaExtractor 的情况下使用 MediaCodec 进行 H264

    我需要在没有 MediaExtractor 的情况下使用 MediaCodec 并且我正在使用 FileInputStream 读取文件 目前它不起作用 它在屏幕上显示绿色的乱码图像 这是整个源代码 FileInputStream in n
  • 解析 mdat MP4 中的 H264

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

    我正在尝试让它在 Android 4 1 上运行 使用升级的 Asus Transformer 平板电脑 谢谢亚历克斯对我之前问题的回答 https stackoverflow com a 13420558 726156 我已经能够将一些原
  • 实现 HTML5 视频的最佳方式

    我知道 HTML5 视频比其支持者希望我们相信的要复杂得多 Safari 使用专有的 H 264 编解码器 而 Firefox Chrome 和 Opera 都支持开源 Theora Internet Explorer 两者都不支持 因此需
  • 将 H.264 I 帧放入 AVSampleBufferDisplayLayer 但不显示视频图像

    在详细回顾了 WWDC2014 Session513 后 我尝试在 IOS8 0 上编写我的应用程序来解码和显示一个实时 H 264 流 首先 我成功构建了H264参数集 当我得到一个带有 4 位起始代码的帧时 就像 0x00 0x00 0
  • 如何减少 MediaCodec 视频/avc 解码中的延迟

    我执行了一些简单的计时电影播放器 java https github com google grafika blob master src com android grafika MoviePlayer java in the Grafik
  • FFmpeg - H264 编码器找不到有效设备并且无法配置编码器

    我尝试使用 H264 编码器进行编码 但是当我这样做时 出现以下错误 h264 v4l2m2m 0x55682d2416c0 Could not find a valid device h264 v4l2m2m 0x55682d2416c0
  • 如何减少 MediaCodec H264 编码器延迟

    我正在尝试使用 Android6 0 的 MediaCodec 将 h264 实时低延迟编码为流 编码器大约有 6 帧延迟 我想知道如何减少 代码来自屏幕记录 cpp https android googlesource com platf
  • MediaCodec 创建输入表面

    我想使用 MediaCodec 将 Surface 编码为 H 264 使用 API 18 有一种方法可以通过调用 createInputSurface 然后在该表面上绘图来对表面中的内容进行编码 我在 createInputSurface

随机推荐

  • 【从零开始】力扣刷题(2)

    前言 我根据这里的表单开始刷力扣 数组的改变移动 453 最小操作次数使元素相等 写了一个但超过时间限制 碰到 1 100000000 就超出时间限制了 就不错误示范了 看了一个评论 拍案叫绝 665 非递减数列 想了一天 看了很多解答 好
  • 【数据结构2】算法的基本概念

    算法的基本概念 程序 数据结构 算法 数据结构 如何把现实世界的问题信息化 将信息存进计算机 同时还要实现对数据结构的基本操作 算法 如何处理这些信息 以解决实际问题 算法的特性 有穷性 一个算法必须总在执行有穷步之后结束 且每一步都可在有
  • Windows 快速配置ip地址

    说明 生活中 很多时候我们要背着电脑往返于某些固定的地方 家里 公司 实验室 寝室等等 每次开电脑后第一件事情就是用图形界面点点点点再点改IP地址 这样非常的麻烦 如何快速配置为自己量身定做的IP地址呢 当然是用脚本 bat 脚本 将下面脚
  • Stata数据处理

    作者 Economicoder 公众号 数据学徒 1 快捷键 Fn F2 描述数据 describe Fn PgUp 搜索先前命令 Ctrl 8 打开 data editor browse Ctrl 9 新建do文档 Ctrl D 执行在d
  • 图片转换js (img对象,file对象,base64,canvas对象),以及图片压缩方式

    首先想一想我们有哪些需求 大多时候我们需要将一个File对象压缩之后再变为File对象传入到远程图片服务器 有时候我们也需要将一个base64字符串压缩之后再变为base64字符串传入到远程数据库 有时候后它还有可能是一块canvas画布
  • 【blog】使用github-pages搭建个人博客

    我的博客 以此博客记录学习过程及相关学习笔记 一 选择模板 1 在Jekyll Themes 或者jekyll sites 选择一个你喜欢的模板直接下载 2 在github新建一个项目 选择一个主题 外链图片转存失败 源站可能有防盗链机制
  • 数据库的模糊查询

    命中率越高 策略越好 数据库的模糊查询 work918 在SQL中 模糊查询可以使用LIKE关键字来实现 LIKE关键字后面可以跟一个模式 其中 表示任意数量的字符 表示一个字符 例如 如果你想在一个名为students的表中查找所有名字以
  • python计算正方形、立方体、圆、球的面积和体积

    usr bin env python encoding UTF 8 import math 正方形的面积 def square mianji x return x x 立方体的表面积 def cube x return xx6 立方体的体积
  • linux系统下部署02-InfluxDB的安装和设置密码

    InfluxDB是一个当下比较流行的时序数据库 InfluxDB使用 Go 语言编写 无需外部依赖 安装配置非常方便 适合构建大型分布式系统的监控系统 一 InfluxDB 简介 InfluxDB 是用Go语言编写的一个开源分布式时序 事件
  • 使用高效代理抓取58同城巴州二手房信息并保存至excel

    声明 此程序旨在技术学习交流 促进网络安全 不作任何商业用途 违者责任自负 此程序就是使用代理IP来反爬的一个小案例 使用的高效代理 通过API每次请求提取一个代理IP 一个代理IP 必须是高匿代理 隐藏真实IP 相当于一台主机 只要主机足
  • 无需解密代码!软件保护专家VMProtect 2020全新升级!更丰富的保护功能

    VMProtect是新一代的软件保护实用程序 具有内置的反汇编程序 可与Windows和Mac OS X可执行程序配合使用 还可以链接编译器创建的MAP文件 以快速选择代码片段进行保护 VMProtect的基本原则是通过使应用程序代码和逻辑
  • ReactNative——导航器react-navigation(堆栈式导航器篇)

    react navigation 安装核心包 yarn add react navigation native 安装 react navigation native本身依赖的相关包 react native reanimated 动画库 r
  • MVC中前台Model转Json传到后台

    C 代码 string str Newtonsoft Json JsonConvert SerializeObject Model JS代码 var theString str theString theString replace quo
  • C语言实验——求两个整数之和

    C语言实验 求两个整数之和 C语言实验 求两个整数之和 求两个整数之和 不从键盘输入数据 直接使用赋值语句 a 123 b 456 输入数据 然后计算两个整数之和输出 Input 无输入数据 Output 输出a和b之和 Sample Ou
  • 5.Java中的基本数据类型有哪些?

    Java中的基本数据类型有哪些 Java是一个强类型语言 Java中的数据必须明确数据类型 在Java中的数据类型包括基本数据类型和引用数据类型两种 Java中的基本数据类型 数据类型 关键字 内存占用 成员变量初始值 取值范围 整数类型
  • Coursera

    该系列仅在原课程基础上部分知识点添加个人学习笔记 或相关推导补充等 如有错误 还请批评指教 在学习了 Andrew Ng 课程的基础上 为了更方便的查阅复习 将其整理成文字 因本人一直在学习英语 所以该系列以英文为主 同时也建议读者以英文为
  • Qt 判断QString是否为空

    isEmpty QString isEmpty returns true QString isEmpty returns true QString x isEmpty returns false QString abc isEmpty re
  • Linux 存储结构

    软硬链接 windows中的快捷方式 ln 参数 目标 参数 使用 s s表示创建软链接 默认创建的是硬链接 f 强制创建文件或目录的链接 i 覆盖先询问 v 显示创建过程 echo hello wolrd gt readme txt 创建
  • 相关性分析的五种方法

    相关分析 Analysis of Correlation 是网站分析中经常使用的分析方法之一 通过对不同特征或数据间的关系进行分析 发现业务运营中的关键影响及驱动因素 并对业务的发展进行预测 本篇文章将介绍5种常用的分析方法 在开始介绍相关
  • 【H.264/AVC视频编解码技术详解】十二、解析H.264码流的宏块结构(下):H.264帧内编码宏块的预测结构

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