mpeg4 码流格式及判断关键帧

2023-11-11

MPEG4码流视频关键帧头部16个字节,非关键帧8个字节(均包含四字节ID),说明如下:

关键帧:

字节

0

1

2

3

4

5

6

7

8

9

A

B

C

D

E

F

0

0

1

FB

XX

R

W&H

Date time

Length

含义

ID



图像大小

时间戳

帧长度

非关键帧

字节

0

1

2

3

4

5

6

7

0

0

1

FA

Length

含义

ID

帧长度

  • XX:保留。

  • RATE:帧率,低5位表示帧率,目前取值从130,高三位表示解交错,可选012其中0做解交错,2不做解交错。

  • WIDTHHEIGHT表示视频数据高度和宽度,一个字节最大256,所以存储的信息为真实高度和宽度的1/8

  • TIMESTAMP:帧时间戳:

struct DateTime

{

DWORDsecond :6; // 1-60

DWORDminute :6; // 1-60

DWORDhour :5; // 1-24

DWORDday :5; // 1-31

DWORDmonth :4; // 1-12

DWORDyear :6; // 2000-2063

};

非关键帧的时间戳是根据帧率和对关键帧的偏移计数计算出来的。

  • LENGTH:帧长度,低字节优先,不包括帧头长度(16字节或者8字节,这个需要注意)

  • H.264码流跟MPEG4的最大不同在于ID,关键帧ID000001FD,非关键帧ID000001FC


给一个例子:







测试解码器测试了很久,由于需要将H264和MPEG4的码流进行分析和判断,并逐帧输入解码器进行测试,如何正确的分析码流,并将Video送给我们的解码器做Decode的呢?耐着性子找了很多资料,主要也因为我本身对MPEG4和H264的码流的格式并不懂,自己在视频编码方面的积累也实在是太少了,所以也确实挺头疼的。后来就直接在网上找是否有对码流的各个部分意义的解释,开始搜索码流中的的StartCode。高兴的是,最终找到了一些有用的讯息,得以继续进行测试代码的撰写。

今天就把MPEG4码流的分析和它的I,P,B Frame的判定方法在这里简要记录一下吧,供日后的翻看和大家的参考。!

MPEG4码流分析:

0x00, 0x00, 0x01, 0xB0作为一个VOS的开始;

0x00, 0x00, 0x01, 0xB6作为一个VOP的开始,紧跟着VOP开始的,有一个2bit 的标志,用来表示这个Frame到底是一个 I Frame,P Frame,B Frame抑或是S Frame(GMS-VOP)

标志如下:

00: I Frame

01: P Frame

10: B Frame

11: S Frame

但是,有关这 2bit 是在0xB6的后面字节的高位还是低位,却没有很明确的描述。

于是又回头开始针对某个MPEG4编码好的文件开始分析,结果终于发现,判定方法如下:

1.可以写一个判定VOP,或者VOS开头的函数:

 
 
  1. static unsigned char *Find_VOP_Start(unsigned char *addrp, unsigned int FindSizes) 
  2.        while(pos < FindSizes) 
  3.        { 
  4.               if(addrp[pos] == 0x00) 
  5.                      if(addrp[pos + 1] == 0x00)   
  6.                             if(addrp[pos + 2] == 0x01)   
  7.                                    if(addrp[pos + 3] == 0xB0) 
  8.                                           break;//判断是否是VOS头; 
  9.                                    if(addrp[pos] == 0x00) 
  10.                                           if(addrp[pos + 1] == 0x00)   
  11.                                                  if(addrp[pos + 2] == 0x01)   
  12.                                                      if(addrp[pos + 3] == 0xB6) 
  13.                                                         break;//判断是否是VOP头 
  14. pos++; 
  15.        } 
  16.        if(pos< FindSizes - 4) 
  17.        {     
  18.               return addrp+pos+4; 
  19.        } 
  20.        else   
  21.               return NULL; 

2. 读一个MPEG4码流文件,然后利用刚才写的函数搜索StartCode:

 
 
  1. size_t nRead = fread(lpSrc, 1, lSize, fp); 
  2. fseek(fp, 0, SEEK_SET); 
  3. while (!feof(fp)) 
  4. unsigned char *p=Find_VOP_Start(lpSrc,lSize); 
  5. if (pos)    //pos为文件当前指针 
  6. length=pos-poslast+header;   //每帧长度为两个StartCode之间的字节数; 
  7. if (length<MAX_HEADERLEN)   
  8. //长度小于一定值,则不够一帧大小,表示在I frame前面的VOS,VO,VOL头 
  9. header=length; 
  10. else 
  11. header=0; 
  12. if (0==(nInput=fread(buffer,1,length,fp))) break//读取一帧大小数据, 
  13. //调用解码器接口,进行解码测试操作;…… 
  14. if (p==NULL) break
  15. //判定VOS是哪种profile 
  16. if (*(p-1)==0xB0) 
  17. if (*p==0xF5)  printf("VOS Header start,Advanced Simple Profile level 5!/n"); 
  18. else if (*p==0x1) printf("VOS Header start,Simple Profile level 1!/n"); 
  19. else if (*p==0x2)  printf("VOS Header start,Simple Profile level 2/n!"); 
  20.      …… 
  21. else  printf("VOS Header Start,Other profile@level/n!"); 
  22. if (*(p-1)==0xB6) 
  23. //判定是I,P,B ,S  Frame 
  24. if ((*p & 0xC0)==0x00)printf("VOP-I frame # %d, ", frames++); 
  25. else if ((*p & 0xC0)==0x40) printf("VOP-P frame # %d, ", frames++); 
  26. else if ((*p & 0xC0)==0x80) printf("VOP-B frame # %d, ", frames++); 
  27. else if ((*p & 0xC0)==0xC0) printf("VOP-S frame # %d, ", frames++); 
  28. else   printf("VOP-unknown type frame # %d, ",frames++); 
  29. //继续查找下一个VOS/VOP的StartCode 
  30. poslast=pos; 
  31. pos=pos+4;    

可以简单拿个图说明一下,下图中,第一个VOS的开头,第二个是一个I Frame:

MPEG4二进制码流

 

by lydia


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

mpeg4 码流格式及判断关键帧 的相关文章

  • 为 iOS6.0 ARMv7 处理器构建 FFMPEG 库

    WARNING 我刚刚被另一位用户告知 在 iOS 上使用 FFMPEG 存在一些法律问题 请在此处留下链接http multinc com 2009 08 24 compatibility Between the iphone app s
  • 删除 PHP 中的标头

    为了允许缓存 PHP 生成的文件 我想确保 Pragma no cache 标头是not放 但是 如何删除可能已经设置的标头 这就对了could有可能 有人在代码中的某个地方写了header Pragma no cache 现在我想确保标头
  • 在 R 中导入 png 文件并转换为动画(.mp4)

    我正在尝试用 R 中的几个 png 文件创建一个简短的动画 我尝试了 packagemagick但只有当我将它们保存为 gif 时它才有效 当我尝试另存为 mp4 时 它将生成一个 mp4 文件 但一旦打开它 只会显示第一张图像 我的代码是
  • 如何在 PHP 中运行 ffmpeg 命令

    我需要在 PHP 中运行 ffmpeg 命令 但是 php ffmpeg 不再支持最新版本并且已经过时 我可以知道在网络文件中运行 ffmpeg 命令的替代方法吗 PHP Javascript jQuery 我尝试exec and shel
  • FFmpeg - H264 编码器找不到有效设备并且无法配置编码器

    我尝试使用 H264 编码器进行编码 但是当我这样做时 出现以下错误 h264 v4l2m2m 0x55682d2416c0 Could not find a valid device h264 v4l2m2m 0x55682d2416c0
  • 使用 MediaRecorder 录制屏幕特定视图

    我想录制特定的屏幕视频View链接只想记录里面执行的动作LinearLayout 现在 MediaRecorder正在录制整个屏幕 如何录制屏幕的特定部分 MediaRecorder 通过媒体投影API 记录整个屏幕 至少从 Android
  • 如何避免函数的多重定义(Linux、GCC/G++、Code::Blocks)

    我有一个代码块项目 它使用许多不同的文件 通常是由其他程序员编写的 目前我遇到的情况是 我有两个不同的子项目 其中包含以相同方式命名的函数 比方说 F int x 因此 F int x 是在两个不同位置的两个源文件中定义的 并且它们有两个不
  • Google Cloud Platform:将上传的 MP4 文件转换为 HLS 文件

    我正在构建一个平台 允许用户将一些视频文件 20 40 秒 从手机上传到服务器 所有这些上传目前都运行良好 文件通过nodejs云功能存储在谷歌存储桶中 现在我想创建一个 gcp 转码器作业 它将上传的 mp4 视频文件转换为 hls 视频
  • 访问 AVFrame 的每个像素

    我需要访问 FFMPEG 的 AVFrame 对象的每个像素信息 如果是 RGB 则每个像素的每种颜色 R G 和 B 我怎样才能做到这一点 如果您已经前进到正确的框架 类似于 img convert ctx ffmpeg sws getC
  • 用于裁剪和转置视频的 FFMPEG 命令放大后质量较差

    我正在尝试将尺寸通常为 960x720 的 mp4 视频转换为方形 480 480 视频 但它通常看起来被压扁 命令是 y i s vf crop 480 480 transpose d threads 5 metadata s v rot
  • Python 用静态图像将 mp3 转换为 mp4

    我有x文件包含一个列表mp3我想转换的文件mp3文件至mp4文件带有static png photo 似乎这里唯一的方法是使用ffmpeg但我不知道如何实现它 我编写了脚本来接受输入mp3文件夹和一个 png photo 然后它将创建新文件
  • H264 字节流到图像文件

    第一次来这里所以要温柔 我已经在给定的 H 264 字节流上工作了几个星期 一般注意事项 字节流不是来自文件 它是从外部源实时提供给我的 字节流使用 Android 的媒体编解码器进行编码 当将流写入扩展名为 H264的文件时 VLC能够正
  • FFmpeg 不适用于 android 10,直接进入 onFailure(String message) 并显示空消息

    我在我的一个项目中使用 FFmpeg 进行视频压缩 在 Android 10 Google Pixel 3a 上 对于发送执行的任何命令 它会直接进入 onFailure String message 并显示空消息 所以我在我的应用程序 g
  • 使用 Ffmpeg 编辑视频元数据

    我想更改视频元数据 原始视频信息 ffmpeg i video mp4 Metadata major brand mp42 minor version 0 compatible brands isomavc1mp42 creation ti
  • 适用于 iPhone 和 HTTP 直播的实时视频聊天

    所以一般来说 我想为 iPhone 制作一个具有视频聊天功能的应用程序 但经过多次搜索 我仍然找不到任何成功的结果 是否有任何公共或私有 API 可用于在 iPhone 上执行此操作 如果您的答案是 是 请帮助我 基本上 我想要的是读取连接
  • 在 ffmpeg 中,如何使用scale2ref 过滤器缩放 dvdsub 字幕以匹配视频大小?

    我有一个从直播电视录制的 mpeg 文件 其中包含视频以及多个音频和字幕流 我的最终目标是能够创建较小的视频文件 因为 mpeg 文件大小为数 GB 我在这条道路上的第一步只是能够选择视频 音频和字幕流中的每一个并将它们复制到 mkv 文件
  • OpenCV IP 相机应用程序崩溃 [h264 @ 0xxxxx] 访问单元中缺少图片

    我在 cpp 中有一个 opencv 应用程序 它使用 opencv 的简单结构捕获视频流并将其保存到视频文件中 它与我的网络摄像头完美配合 但是 当我运行它从 IP 摄像机捕获流时 它可能会在大约十秒后崩溃 我的编译命令是 g O3 IP
  • HTTP Header Key 可以重复吗?

    在 JAVA HttpUrlConnection 中 请求 Header 设置的主要逻辑代码如下 public synchronized void set String k String v for int i nkeys i gt 0 i
  • 我什么时候应该使用 -inl.h 文件?

    我刚刚注意到这个项目 http google styleguide googlecode com svn trunk cppguide xml showone The inl h Files The inl h Files in the G
  • 如何仅在使用 ffmpeg 添加相同速度的分离音频流时更改视频速度?

    我正在使用 ffmpeg 作为视频过滤器 但是 当我改变视频速度时 我遇到了问题 音频比视频长 ffmpeg i INPUT mp4 filter v setpts 0 5 PTS shortest y preset ultrafast O

随机推荐

  • GDB 多线程调试

    http hi baidu com hcq11 blog item 9f5bfc6e696209d680cb4a25 html http hi baidu com litto blog item 759389dd198111375882dd
  • Win10使用.bat命令 获取本机设备信息/MAC信息/IP信息,转存为txt文件并保存至目标目录

    精简版 echo off title kotori poi color 0a echo 计算机S N码 gt dp0systemcheck txt wmic bios get serialnumber find v SerialNumber
  • 大数据学习——2PC算法

    分布式下数据一致性问题 对于一个将数据副本分布在不同得分布式下的系统来说 如果对一个节点的数据进行更新 但是其他节点的数据却没有进行相应的更新 于是在读取其他节点的数据时 便不是最新的数据 即脏数据 这就是典型的数据不一直问题 为解决这个问
  • (5)unix套接字sendmsg消息返回权限错误(EPERM)

    Unix套接字sendmsg消息返回权限错误 Author onceday date 2023年8月16日 解决linux设备上unix套接字sendmsg的一种错误情景 1 问题 unix套接字有一种udp类传输 即数据报服务 这个套接字
  • 教妹学Java(十五):for循环详解

    你好呀 我是沉默王二 一枚颜值与才华俱在的程序员 本篇教程通过我和三妹对话的形式来谈一谈 for while do while 循环之间的差别 以及重点介绍一下 for 循环 while do while 会在接下来的教程中单独介绍 教妹学
  • 记录写论文时添加Latex参考文献的方法

    第一步 在谷歌学术找到对应的文章 第二步 点击引用 得到bibtex的格式 第三步 保存在ref bib文件中 用回车隔开 第四步 先PDFlatex编译一次 再BibTex编译一次 再PDFlatex编译两次 结果就成功了 注意事项 每次
  • 机器学习:fit,transform,fit_transform区别(附代码)

    导论 在机器学习中 我们需要对数据集的数据进行处理 进而使用sklearn库中的一些函数对数据进行数据特征提取 训练模型 其中fit transform fit transform是进行数据的预处理 函数解释 fit Method calc
  • BootStrap分析

    Bootstrap是由Twitter的MarkOtto和JacobThornton共同开发 用于快速开发Web应用程序和网站的前端框架 提供更多的CSS样式和JS规 则 JavaScript jQuery EasyUI BootStrap
  • 前端组件化和模块化最大的区别是什么_组件化开发和模块化开发概念辨析

    网上有许多讲组件化开发 模块化开发的文章 但大家一般都是将这两个概念混为一谈的 并没有加以区分 而且实际上许多人对于组件 模块的区别也不甚明了 甚至于许多博客文章专门解说这几个概念都有些谬误 想分清这两个概念我觉得结合一下软件的渐进式开发场
  • 非可视化虚拟机安装

    virt install connect qemu system 连接默认本机hypervisor virt type kvm 虚拟化类型为kvm vcpus 1 vcpu为1 name centos 虚拟机名称 ram 512
  • js右键双击事件

    鼠标左击双击事件dblclick 那右击双击事件呢 在开发中遇到一个需求 左键双击下钻 右键双击上钻 貌似没有右键双击事件 自己手写一个 let t 0 total 0 document addEventListener mousedown
  • 学习笔记——python中为什么需要使用“if __name__ == ‘__main__‘”语句

    学习过程中又又又疑问了 为啥有时候必须要用 if name main 语句 感觉就跟其他语言中的main函数一样 转载一篇文章 嘻嘻 主要是讲的太好了 就不加我个人见解了 首先用最简洁的语言来说明一下 if name main 的作用 防止
  • 各种环境下正确应对-微信40001-invalid credential, access_token is invalid or not latest

    这个Bug是微信开发常见Bug之一了 意思access token失效了 网上很多解答都只针对某种情况 笔者解决这个问题也是经历了痛苦的过程 根据实战经验总结供同仁参考 方案思路 根据微信官方文档 access token的有效期是7200
  • vue中使用elementUI使用el-tabs,切换Tab如何实现实时加载,以及el-table表格使用总结

    当我们在开发中遇到tab切换 这时候用el的el tabs感觉很方便 但当我在把代码都写完后 发现一个问题就是页面打开时 虽然我们只能看见当前一个tab页 但是vue会帮你把你写的所有tab页的内容都渲染出来了 只是其他的隐藏了 同时其他t
  • React学习第二天元素渲染

    一 前言 1 对于一个单页面应用 我们最终要将react元素挂载到页面根节点 通常设置为root根节点 该节点内的所有内容都将由 React DOM 管理 2 挂载的过程就是渲染的过程 react提供了相应是api实现这个过程 二 元素渲染
  • Java如何实现统计在线人数的功能?

    很多人在笔试或者面试中问到 现在要你实现一个统计在线人数的功能 你该怎么设计 不知道的朋友 这篇文章告诉你 先说答案 可以利用监听器Listener来实现 目录 1 监听器的简介 2 Java监听器的类型 1 ServletContextL
  • 深入理解“字符编码模型”

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • Python基于OpenCV库Adaboost实现人脸识别功能详

    本文实例讲述了Python基于OpenCV库Adaboost实现人脸识别功能 分享给大家供大家参考 具体如下 以前用Matlab写神经网络的面部眼镜识别算法 研究算法逻辑 采集大量训练数据 迭代 计算各感知器的系数 相当之麻烦 而现在运用调
  • STDOUT/STDERR重定向到ALOG中

    说下背景 现在众多Android开发者新添加的Google暂时并不会支持的功能 比如拨号上网 USB打印机等等 一般的实现方法就是静态编译Linux的相对开源库和程序 一般是C C 语言 然后由Apk一层一层调用 最终是调用这个命令来实现的
  • mpeg4 码流格式及判断关键帧

    MPEG4码流视频关键帧头部16个字节 非关键帧8个字节 均包含四字节ID 说明如下 关键帧 字节 0 1 2 3 4 5 6 7 8 9 A B C D E F 值 0 0 1 FB XX R W H Date time Length 含