H264视频编码原理基础分析

2023-05-16

引言

  • 本文章旨在记录本人学习有关音视频时对H264码流视频编解码原理部分的内容,如有不对请留言指出

1、音视频封装格式

​ 我们一般下载或者播放的视频文件常见都是以 xxx.mp4、xxx.flv、xxx.mkv等标识结尾,其实这都是对视频+音频的进一步封装,详见如下视频文件的经典图:

在这里插入图片描述

通过上图我们知道一个视频需要播放起来能看,经过的步骤

①解封装格式→ ②视频解码 → ③音视频同步,

H264视频压缩数据就在视频解封装格式后这步。所以单纯的想要播放有画面的视频只需要拿到xxx.h264文件即可。

通过FFmpeg工具即可直接得到一个视频的h264视频压缩文件。

FFmpeg 工具抽取视频的H264文件命令:

1)mp4视频文件抽取H264视频文件命令:
ffmpeg.exe -i 源视频名.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 输出视频文件名.h264
(2)播放H264文件
ffplay.exe (h264文件名).h264

在这里插入图片描述
在这里插入图片描述

2、H264介绍

​ 关于H264的由来介绍可参考以下几篇文章,就不过多记录了

​ 1)H264百度百科:https://baike.baidu.com/item/H.264/1022230?fromtitle=H264&fromid=7338504&fr=aladdin

​ 2)H264由来介绍:

3、H264文件分析

​ 首先我们还是用FFmpeg工具将之前抽取到的视频压缩H264文件进一步抽取出原始视频数据 yuv文件:

1)H264文件抽取yuv视频文件命令:
ffmpeg.exe -i out.h264 -s 544x960 -pix_fmt yuv420p out.yuv
解释:
out.h264:(h264源文件名)
544x960:(视频分辨率)
yuv420p:(编码格式)
out.yuv: (输出的yuv文件名)
(2)播放yuv文件命令:
ffplay.exe -video_size 544x960 -i out.yuv
解释:
544x960:(视频分辨率)
out.yuv:(yuv文件名)

在这里插入图片描述

​ 然后看个文件大小数据对比:

源视频 【2.79MB】←pk→ H264文件【2.65MB】 ←pk→ yuv【454MB】文件

​ 裸数据从454MB直接压缩到2.65MB,直接压缩了差不多200倍,逆天了。真的是极大的节约了存储空间

在这里插入图片描述

H264说到底就是对视频数据进行压缩的技术,主要采用了以下几种方法对视频数据进行压缩

  • 帧内预测压缩,解决的是空域数据冗余问题
  • 帧间预测压缩(运动估计与补偿),解决的是时域数据冗徐问题
  • 整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据然后进行量化
  • CABAC压缩

​ 经过压缩后的帧分为:I帧,P帧、B帧

  • I帧:关键帧,采用帧内压缩技术
  • P帧:向前参考帧,在压缩时,只参考前面已经处理的帧。采用帧音压缩技术
  • B帧:双向参考帧,在压缩时,它即参考前而的帧,又参考它后面的帧。采用帧间压缩技术

​ 除了I/P/B帧外,还有图像序列GOP

​ GOP:两个I帧之间是一个图像序列,在一个图像序列中只有一个I帧。如下图所示:

在这里插入图片描述

4、H264压缩技术过程

…由于此压缩技术过程篇幅过长,可看此篇记录文章

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

H264视频编码原理基础分析 的相关文章

  • 视频编解码(一):ffmpeg编码H.264帧类型判断

    本文主要讲述ffmpeg编码过程中是如何设置I帧 B帧及P帧的 以及如何通过代码判断帧类型 之前看过很多网上的文章 讲述如何判断I帧 B帧 P帧 然而都是停留在H 264官方文档中的定义 如果不结合ffmpeg 就仿佛纸上谈兵 有点不切实际
  • Android下基于Http协议的网络摄像机开发

    这段时间在做Android平台下的网络摄像机的兼容 摄像机的通讯采用Http1 1协议 现将遇到的问题简单总结一下 1 Http协议中需要用到身份认证部分 不同厂家的摄像机所采取的方案可能有所不同 但是大体无外乎都是将摄像机的用户名和密码简
  • H.264 编解码器解释[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在制作一个支持视频通话的应用程序 并且正在寻找解释 h 264 编解码器结构的教程 文档 我希望能够打包流 将其包装在数据报中 在接收端发送和解
  • h.264 视频无法在 iOS 上播放

    我有一个用 h 264 编码的视频文件无法在 iOS 上播放 我想知道原因 这是 HTML
  • MP4 / ISO 14496-12:如何找到视频和音频访问单元?

    我正在编写一个用于检查 MP4 文件 又名 ISO 基本媒体文件格式 ISO 14496 第 12 部分 的工具 我可以解释 ISO 14496 12 中列出的由 OSS 生成的大部分框 我还没有弄清楚如何提取单独的视频访问单元和音频访问单
  • 如何从 C# 中的一组图像创建 H.264 编码的电影?

    我今天做了很多搜索 C 库 这将允许我创建 H 264 编码的视频文件 有谁知道是否存在这样的库或第三方组件 Use ffmpeg 我建议直接运行 ffmpeg 进程 如本示例所示 http jasonjano wordpress com
  • OpenCV:FFMPEG:编解码器不支持标签 0x34363268/'h264'

    像在 Mac OS 10 13 6 上一样安装 opencv 后 conda install c conda forge ffmpeg conda install c conda forge opencv 并使用fourcc cv2 Vid
  • h264 idea 比特流是如何组织的? / 标头起始码

    我试图通过使用十六进制编辑器查看视频文件的比特流来了解一些有关 h264 的知识 我发现here视频对象平面 0x000001b6 和 i 帧 0x000001b600 的起始码 但我在视频文件中找不到很多这样的字节 大多数情况下 这些起始
  • 无法播放某些视频

    我正在尝试通过我们的服务器在 Android 设备上播放电影 它不是一个媒体服务器 只是一个普通的 Apache 服务器 我们使用相同的 API 来访问 iPhone 上的视频 效果很好 在 Android 设备上 某些视频可以播放 而另一
  • android mediacodec:实时解码h264 nals

    我正在尝试使用 android 低级媒体 api 实时解码 h264 nals 每个 nal 包含一个完整的帧 所以我希望在用我的 nal 提供输入并调用之后dequeueOutputBuffer它会 立即 当然有一点延迟 显示我的框架 但
  • 从 H.264 中删除 EIA-608 隐藏式字幕而不重新编码

    我希望从 H 264 视频 包含为 mkv 中删除隐藏字幕 EIA 608 而不需要重新编码 我最接近的是使用 ffmpeg ffmpeg f lavfi i movie input mkv out subcc map 0 0 output
  • 如何定量测量源和显示器之间的 gstreamer H264 延迟?

    我有一个项目 我们使用 gstreamer x264 等将视频流通过本地网络多播到多个接收器 连接到显示器的专用计算机 我们在视频源 摄像机 系统和显示监视器上使用 gstreamer 我们使用 RTP 有效负载 96 和 libx264
  • 检测到损坏的 ffmpeg 默认设置

    我在使用 X264 Fourcc 编解码器的 VideoWrite 时遇到 ffmpeg 错误 我已经安装了所有依赖项 如何纠正此问题 我一直在使用的示例代码如下 VideoWriter oVideoWriter path mp4 CV F
  • 为什么 AVSampleBufferDisplayLayer 会失败并出现操作中断 (-11847)?

    我正在使用一个AVSampleBufferDisplayLayer解码并显示从服务器流式传输的 H 264 视频 当我的应用程序进入后台然后返回前台时 解码过程就会搞砸 并且AVSampleBufferDisplayLayer失败 我看到的
  • H264解析-切片头检测

    我知道在 h264 中我们可以通过位模式检测 NAL 单元0x000001 是否有等效的方法来检测 NAL 单元中的切片标头 如何处理多切片 NAL 单元 目前我正在使用 h264 的解析代码并获取相应结构中的切片标头 切片头语法在第 36
  • 使用 Android MediaCodec 从摄像头编码 H.264

    我正在尝试让它在 Android 4 1 上运行 使用升级的 Asus Transformer 平板电脑 谢谢亚历克斯对我之前问题的回答 https stackoverflow com a 13420558 726156 我已经能够将一些原
  • 使用 libx264 压缩一组图像时,为什么帧速率会影响最终输出大小?

    我正在使用 ffmpeg 使用 libx264 编解码器将一组图像编码为短延时视频 我的第一次尝试以 30 FPS 的速度进行编码 使用 ffmpeg r 30 pattern type glob i jpg vcodec libx264
  • 非 IDR 图片 NAL 单元 - 0x21 和 0x61 含义

    有谁知道是什么0x21 and 0x61是指在 h 264 编码的视频流中吗 我知道0x01意味着它是一个b frame and 0x41意味着它是一个p frame 我的编码视频给了我两个0x21帧后跟一帧b frame I 21 21
  • Apple HLS 中的 PES 数据包内的访问单元如何对齐?

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

    是否可以使用 ffmpeg 从 H264 编码视频创建原始 YUV 视频 我想用 matlab 打开视频并逐帧访问 Luma Cb 和 Cr 分量 是的 您可以 您只需指定像素格式即可 要获取格式的完整列表 ffmpeg pix fmts

随机推荐

  • linux Argument list too long错误解决方法

    linux Argument list too long错误解决方法 今日需要删除 tmp目录下的所有文件 xff0c 文件数量比较多 ls lt tmp wc l 385412 使用 rm 后 xff0c 系统提示错误 Argument
  • WordPress 文章内容添加分页的方法

    WordPress 文章内容添加分页的方法 我们发布文章时 xff0c 如果文章比较长 xff0c 页面就会太长 xff0c 影响用户阅读 把文章内容分页后 xff0c 能提高用户阅读体验 xff0c 并能对SEO优化 WordPress系
  • windows获取本机MAC地址并写入文件的bat

    windows获取本机MAC地址并写入文件的bat MAC Media Access Control 地址 xff0c 或称为 MAC地址 硬件地址 xff0c 用来定义网络设备的位置 bat代码如下 xff1a 64 echo off e
  • php 获取Youtube某个User所有Video信息

    php 获取Youtube某个User所有Video信息 因工作需要 xff0c 获取Youtube上某个用户的所有视频信息 xff0c 写了这个类 xff0c 分享给大家 YTUserVideo class php lt php 获取Yo
  • php 字符编码转换类,支持ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom 互相转换

    php 字符编码转换类 xff0c 支持ANSI Unicode Unicode big endian UTF 8 UTF 8 43 Bom 互相转换 四种常见文本文件编码方式 ANSI编码 xff1a 无文件头 文件编码开头标志性字节 A
  • linux ps 查看进程命令

    linux 中ps 命令是Process Status 的缩写 ps命令可以列出系统中当前运行的进程 xff0c 所列出的进程是执行ps命令这个时刻正在运行的进程 如果要动态显示进程信息 xff0c 需要使用top命令 通过ps命令 xff
  • linux 使用rename命令批量重命名文件

    linux 使用rename命令批量重命名文件 命令格式 xff1a Usage rename v n f perlexpr filenames 参数说明 xff1a v 显示文件重命名的细节 n 不执行重命名 xff0c 但会模拟执行重命
  • mysql workbench中PK,NN,UQ,BIN,UN,ZF,AI字段类型标识说明

    使用mysql workbench建表时 xff0c 字段中有PK NN UQ BIN UN ZF AI几个基本字段类型标识 它们分别代表的意思是 xff1a PK xff1a primary key 主键 NN xff1a not nul
  • 电脑连得上Wifi打开网页速度慢,但使用热点却没问题怎么解决

    这是我个人的一个问题解决帖 xff0c 当时电脑出来这个问题用了很多方法都没有解决 xff0c 而宽带和网卡也都是没有任何问题 xff0c 最后是学校里一个大佬跟我分享的一个解决方法 用ipconfig release 和 ipconfig
  • 系统中有两个version的PHP存在,导致phpunit测试出现问题的解决方法

    今天要搭建本机的LAMP 开发环境 xff0c 因系统自带的php版本是5 5 14 xff0c 但开发要使用的是php 5 6 以上 xff0c 因此安装了php 5 6 7 这样导致了系统中有两个版本的php存在 正常开发是没有问题的
  • eclipse 更改编辑器风格方法

    eclipse 更改编辑器风格方法 1 打开eclipse 选择菜单Help gt Install New Software 2 在Work with 中 xff0c 按Add xff0c 然后在Location中填入 xff1a http
  • mongodb 地理位置搜寻

    LBS xff0c 存储每个地点的经纬度坐标 xff0c 搜寻附近的地点 xff0c 建立地理位置索引可提高查询效率 mongodb地理位置索引 xff0c 2d 和2dsphere xff0c 对应平面和球面 1 创建lbs集合存放地点坐
  • php 版本处理类

    php 版本处理类 例如记录app版本 xff0c 或某些版本数据 xff0c 如果使用1 0 0这种版本格式记录入库 xff0c 在需要筛选查询时会比较麻烦 而把版本字符串转为数字保存 xff0c 可以方便版本间的比较和筛选 例如 xff
  • PDO 查询mysql返回字段整型变为String型解决方法

    PDO 查询mysql返回字段整型变为String型解决方法 使用PDO查询mysql数据库时 xff0c 执行prepare execute后 xff0c 返回的字段数据全都变为字符型 例如id在数据库中是Int的 xff0c 查询后返回
  • nginx access.log 忽略favicon.ico访问记录的方法

    favicon ico 文件是浏览器收藏网址时显示的图标 xff0c 当第一次访问页面时 xff0c 浏览器会自动发起请求获取页面的favicon ico文件 当 favicon ico文件不存在时 xff0c 服务器会记录404日志 12
  • php根据地理坐标获取国家、省份、城市,及周边数据类

    功能 xff1a 当App获取到用户的地理坐标时 xff0c 可以根据坐标知道用户当前在那个国家 省份 城市 xff0c 及周边有什么数据 原理 xff1a 基于百度Geocoding API 实现 xff0c 需要先注册百度开发者 xff
  • Mac查看本机IP地址方法

    Mac查看本机IP地址方法 1 使用command 43 shift 43 u 打开实用工具 2 选择 终端 打开 3 输入 ifconfig grep inet grep v 127 0 0 1 显示 inet 开头的那行就是本机的IP地
  • 使用ssh-keygen生成私钥和公钥

    1 使用ssh keygen生成私钥和公钥 命令如下 xff1a ssh span class hljs attribute keygen span span class hljs attribute t span rsa 例子 xff1a
  • 代码简短且隐蔽的后门木马

    本文将介绍一个代码很简短 xff0c 而且很隐蔽的后门木马 xff0c 以便让大家在检测程序时可以避免被挂木马 文件内容如下 xff1a lt php 64 span class hljs variable span 61 span cla
  • H264视频编码原理基础分析

    引言 本文章旨在记录本人学习有关音视频时对H264码流视频编解码原理部分的内容 xff0c 如有不对请留言指出 1 音视频封装格式 我们一般下载或者播放的视频文件常见都是以 xxx mp4 xxx flv xxx mkv等标识结尾 xff0