热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从MP4头信息中提取sps和pps数据

一、MP4格式基本概念MP4格式对应标准MPEG-4标准(ISOIEC14496)二、MP4封装格式核心概念1MP4封装格式对应标准为ISO

一、MP4格式基本概念

MP4格式对应标准MPEG-4标准(ISO/IEC14496)

 


二、MP4封装格式核心概念

1  MP4封装格式对应标准为 ISO/IEC 14496-12(信息技术 视听对象编码的第12部分: ISO 基本媒体文件格式/Information technology Coding of audio-visual objects Part 12: ISO base media file format)

 附-- 标准免费下载: Freely Available Standards    http://standards.iso.org/ittf/PubliclyAvailableStandards/index.html

 

2  MP4封装格式是基于QuickTime容器格式定义,媒体描述与媒体数据分开,目前被广泛应用于封装h.264视频和ACC音频,是高清视频/HDV的代表。


 

 MP4文件中所有数据都封装在box中(对应QuickTime中的atom),即MP4文件是由若干个box组成,每个box有长度和类型,每个box中还可以包含另外的子box(称container box)。

 一个MP4文件首先会有且只有一个“ftyp”类型的box,作为MP4格式的标志并包含关于文件的一些信息;之后会有且只有一个“moov”类型的box(Movie Box),它是一种container box,子box包含了媒体的metadata信息;MP4文件的媒体数据包含在“mdat”类型的box(Midia Data Box)中,该类型的box也是container box,可以有多个,也可以没有(当媒体数据全部引用其他文件时),媒体数据的结构由metadata进行描述。


 

4   MP4中box存储方式为大端模式。一般,标准的box开头会有四个字节的box size。




好的,铺垫做好了,下面直接进入正题!

近期本人在用自己的开发板对ffmpeg解码做一些改进,目标是将ffmpeg的解码部分交给硬件编解码单元VPU(Video Processing Unit)去做,而ffmpeg用来读取文件,并解析文件,以加快解码速度,并释放CPU资源(事实上单核ARM cotexA9解码1920x1088的视频,根本解不动啊...)。

这里补充两个概念:
解析:即解封装,封装格式有很多种,常见的如avi、mp4、rmvb等等。
解码:将压缩的多媒体数据格式还原,视频数据压缩格式也有很多,目前比较流行的有H.264、mpeg2、mpeg4等等。

使用VPU进行解码的时候,交给VPU的数据必须是严格的H.264数据,否则VPU是不认的。本以为ffmpeg的解析工作可以和VPU的解码完美配合,但事与愿违,ffmpeg解析后的一个packet(即一个视频帧)的格式为4byte的box大小+帧数据,而真正的H.264的数据为4byte的头(00 00 00 01)+帧数据。因此,每一帧的数据在丢给VPU之前,需要将头部的4bit用00 00 00 01替换。下图为ffmpeg提取的packet数据(我打印出来每个packet的前5位,和packet size)。


可以看到,每一个packet的前4byte是帧大小(mp4是大端存储),如第一组数据:0x14efa = 85754,即出去前4byte后的大小。

在使用VPU进行H.264解码的时候,还需要sps和pps数据,第一帧的数据头应当包含sps和pps。(至于这两个参数是干什么的,这里就不赘述了,网上的资料很多)。好的,下面来说如何找出sps和pps:
1、找到avcC,在mp4的包头中,包含了avcC这4个字母的asic码,对应的十六进制数分别是61 76 63 43。因此,需要在mp4包头中找出avcC。下图为用altraedit查看的mp4的包头数据。

可以看到,61 76 63 43对应了avcC。至于前面的mp4包头信息,可以参考mp4官方文档给出的解释,这里不再解释。

2、根据下表所示的信息,找出对应的sps和pps位:



因此,对应上表,可以得出如下信息:

avcC 61 76 63 43
版本号 1
AVCProfileIndication 64
profile_compatibility 0
AVCLevelIndication 29
reserved(6bit)+NALU长度(2bit) ff
reserver(3bit)+sps个数(5bit) E1
sps长度 00 0B
sps内容 67 64 00 29 AC CE C0 78 02 26 40
pps个数 01
pps长度 00 04
pps内容 68 EA 5B 83


好的,到此为止就在mp4的包头中找到了sps和pps数据,可以根据此方法写出你的code啦,很简单吧!







推荐阅读
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • 创建项目:Visual Studio Online 入门指南
    本文介绍如何使用微软的 Visual Studio Online(VSO)创建和管理开发项目。作为一款基于云计算的开发平台,VSO 提供了丰富的工具和服务,简化了项目的配置和部署流程。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
author-avatar
mobiledu2502875007
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有