首页 > 教程 > 如何将H.264裸流封装为MP4文件并在网络上传输

如何将H.264裸流封装为MP4文件并在网络上传输

时间:2024-06-29 | 来源: | 阅读:99

话题: T 2 K PEG 开发 网络

?《FFmpeg开发实战:从零基础到短视频上线》一书的“3.4.3 把原始的H264文件封装为MP4格式”介绍了如何把H.264裸流封装为MP4文件。那么在网络上传输的H.264裸流是怎样被接收端获取视频格式的呢?前文指出H.264流必定以“SPS帧→PPS帧→IDR帧”开头,接下来就来验证是否确实

《FFmpeg开发实战:从零基础到短视频上线》一书中介绍了如何将H.264裸流封装为MP4文件。但在网络上传输的H.264裸流是如何被接收端获取视频格式的呢?本文将探讨这一问题。

雷霄骅雷神编写的H264分析器是本文使用的工具。该软件的初始界面如下图所示:

单击文件路径栏右边的打开按钮,在弹出的文件对话框中选择某个H.264裸流文件,再单击界面右下角的开始按钮,分析器便开始分析H264文件的内容格式,分析后的结果界面如下图所示:

从分析结果可见,H.264裸流的开头三帧果然是“SPS帧→PPS帧→IDR帧”。单击列表中的某个帧,界面右侧会显示该帧的详细字段信息。

然而,分析器只能读取H.264裸流文件。如果让分析器读取MP4文件,就无法正常读出各帧信息。那么流媒体服务器又是如何将MP4文件转化为H.264裸流的呢?

以ZLMediaKit为例,它在向推流序列插入I帧时做了特殊处理,一旦出现I帧,就自动插入SPS与PPS等配置帧。具体代码在ZLMediaKit框架的ext-codec/H264.cpp,查看该源码的H264Track::inputFrame_l函数,找到以下的代码片段,可见程序在判断关键帧之后调用了insertConfigFrame函数。

找到insertConfigFrame函数的定义代码如下,函数内容依次插入了SPS帧和PPS帧:

由此可见,ZLMediaKit在每个关键帧前面都额外插入了SPS帧和PPS帧,确保H.264裸流维持着形如“SPS帧→PPS帧→IDR帧”的队形。如果不添加SPS和PPS,客户端在拉流时会报错。

只有加上SPS与PPS,客户端才能正常拉流解析数据,才能正常渲染视频画面。

更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。


湘ICP备2022002427号-10湘公网安备:43070202000427号
© 2013~2019 haote.com 好特网