嵌入式 H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

简介: 一、MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496)   二、MP4封装格式核心概念 1  MP4封装格式对应标准为 ISO/IEC 14496-12(信息技术 视听对象编码的第12部分: ISO 基本媒体文件格式/Information technol...

一、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的代表。


 

3  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。


 

5 几个名词 

track

表示一些sample的集合,对于媒体数据来说,track表示一个视频或音频序列。

hint track

特殊的track,并不包含媒体数据,包含的是一些将其他数据track打包成流媒体的指示信息。

sample

对于非hint   track来说,video sample即为一帧视频,或一组连续视频帧,audio sample即为一段连续的压缩音频,它们统称sample。

对于hint   track,sample定义一个或多个流媒体包的格式。

sample table

指明sampe时序和物理布局的表。

chunk

一个track的几个sample组成的单元。

 


三、MP4封装格式结构图

1 实例样本

来源于Android MediaRecoder视频录制,平台为华为T8300和TCL968,mp4info查看如下

EsEYE查看如下:

winhex分析如下:

 

2 box结构图

接下来对h264编码中有用的几个进行阐述,其它不再描述。

3 ftypfile type box

如下图所示,开始的四字节00 00 00 00 18表示该boxsize24字节(含头),然后66 74 79 70ftypBOX TYPE,其它是一些格式兼容等相关信息。

4  mdat

如下图所示,BOX YPE为6D 64 61 74 ,紧接着的00 00 09 39表示sliece长度

5 avcC

如下图所示,红色为BOX TYPE

 


四、MP4文件中h264 SPSPPS获取

1  【参考依据】ISO/IEC 14496-15 (下载

2  【综述】在H264中,SPS和PPS存在于NALU header中,而在MP4文件中,SPS和PPS存在于AVCDecoderConfigurationRecord, 首先要定位avcC.

3  【定义】

①参数集:一组很少改变的,为大量VCL NALU 提供解码信息的数据。

   序列参数集SPS作用于一系列连续的编码图像,而图像参数集PPS作用于编码视频序列中一个或多个独立的图像。

   如果解码器没能正确接收到这两个参数集,那么其他NALU 也是无法解码的。因此它们一般在发送其它 NALU 之前发送,并且使用不同的信道或者更加可靠的传输协议(如TCP)进行传输,也可以重复传输。

②关于AVCDecoderConfigurationRecord结构定义为  

4  【实例分析】 数据如上avcC图所示,现在对数据进行详细分析

所以,提取的SPSPPS分别为67 42 00 1E A6 81 41 F968 CE 38 80

 


五、MP4文件中的H264 data /NALU slice

1  【参考】H264官方文档(下载) + 毕书—新一代视频压缩编码标准(下载

2  【综述】

① MP4格式文件中,H264 slice并不是以00 00 00 01来作分割,而是存储在mdat box中。

②  H264基本码流由一些列的NALU组成。原始的NALU单元组成:[start code] + [NALU header] + [NALU payload]

 

start   code

1字节

00 00 01  00 00 00 01

需要添加的

NALU header

1字节

如下3

通过mdat定位

 

③  H264基本码流结构分两层:视频编码层VCL和网络适配层NAL,这样使信号处理和网路传输分离

 

VCL

负责高效视频内容表示

NAL

以网络所要求的恰当方式对数据进行打包和发送

 

3  【定义】 NALU header

+---------------+

|0|1|2|3|4|5|6|7|

+-+-+-+-+-+-+-+-+

|F|NRI| Type |

+---------------+

特别的,当值为78分别为SPSPPS

毕书(下载)(P191)上的定义为:

 

4  【实例分析】数据分析,数据如上图mdat所示

6D 64 61 74

mdat   BOX TYPE

00 00   09 39

silce长度,2361

 

接下来的65就是NALU header,可以由65&0x1F来求的后五个bit,从而得知此sliceI frame

注意,mdatsilce之间有可能存在若干占位符,我在TCL手机测试时就出现了连续的00的占位符,这样后面用H264硬编码时会比较麻烦一点。

目录
相关文章
|
编解码 移动开发 流计算
【开源视频联动物联网平台】流媒体传输协议HLS,FLV的功能和特点
【开源视频联动物联网平台】流媒体传输协议HLS,FLV的功能和特点
297 2
|
存储 Java 调度
Springboot集成Quartz(任务存储在数据库)
集成quartz实现定时调度,quartz是一个功能丰富的开源的任务调用系统,它可以定义很多job并发执行,支持事务和集群
1554 0
|
Java 应用服务中间件 nginx
GitLab 配置 OAuth2 实现第三方登录,简直太方便了!
GitLab 配置 OAuth2 实现第三方登录,简直太方便了!
GitLab 配置 OAuth2 实现第三方登录,简直太方便了!
|
11月前
|
应用服务中间件 Linux nginx
FFmpeg学习笔记(一):实现rtsp推流rtmp以及ffplay完成拉流操作
这篇博客介绍了如何使用FFmpeg实现RTSP推流到RTMP服务器,并使用ffplay进行拉流操作,包括在Windows和Linux系统下的命令示例,以及如何通过HTML页面显示视频流。
2375 0
|
11月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
606 4
|
11月前
|
编解码 语音技术 内存技术
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
《FFmpeg开发实战:从零基础到短视频上线》一书中的“5.1.2 把音频流保存为PCM文件”章节介绍了将媒体文件中的音频流转换为原始PCM音频的方法。示例代码直接保存解码后的PCM数据,保留了原始音频的采样频率、声道数量和采样位数。但在实际应用中,有时需要特定规格的PCM音频。例如,某些语音识别引擎仅接受16位PCM数据,而标准MP3音频通常采用32位采样,因此需将32位MP3音频转换为16位PCM音频。
286 0
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
|
人工智能 容器 运维
活动回顾丨AI 原生应用架构专场·北京站 PPT 下载
5 月 24 日,飞天技术沙龙首个 AI 原生应用架构专场在北京举办。
625 92
|
11月前
|
存储 C++ 内存技术
解码mp4文件分别存储为pcm,yuv文件
使用FFmpeg库在C++中解码MP4文件,并将音频数据存储为PCM格式,视频数据存储为YUV格式。
133 3
解码mp4文件分别存储为pcm,yuv文件
|
程序员 CDN
github Release 下载加速,绿色合法,遥遥领先
你有没有这样一个困惑,当你寻找了很久终于找到一个解决问题的方案,发现这个工具在 GitHub 上,接下来等待我们的就是遥遥无期的龟速下载。
877 0
github Release 下载加速,绿色合法,遥遥领先
|
Linux Apache C++
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
该文介绍了如何在Windows环境下为FFmpeg集成SRT协议支持库libsrt。首先,需要安装Perl和Nasm,然后编译OpenSSL。接着,下载libsrt源码并使用CMake配置,生成VS工程并编译生成srt.dll和srt.lib。最后,将编译出的库文件和头文件按照特定目录结构放置,并更新环境变量,重新配置启用libsrt的FFmpeg并进行编译安装。该过程有助于优化直播推流的性能,减少卡顿问题。
331 2
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt