如何实现超轻量级MP4封装的最佳方法?
摘要:liwen01 2023.12.17 前言 MP4是目前非常常用的一种视频封装格式,关于MP4的介绍资料也非常多。我们常用的封装库或工具有:ffmpeg,libmp4v2,GPAC,MP4.js,它们的优点是功能基本上都是比较全面,缺点就是
liwen01 2023.12.17
前言
MP4是目前非常常用的一种视频封装格式,关于MP4的介绍资料也非常多。我们常用的封装库或工具有:ffmpeg,libmp4v2,GPAC,MP4.js,它们的优点是功能基本上都是比较全面,缺点就是它们占用的资源相对来说也是非常多的。
在嵌入式系统中,不管是RAM还是FLASH空间,一般都是非常小,这个时候,如果要将音视频封装成MP4,或是解码MP4格式就会显得非常困难,因为上面介绍的那些库都放不下或是因为内存不够运行不起来,只能根据MP4协议自己去解析。
这里介绍一个轻量级的MP4封装方法(minimp4),集成MP4编码,解码,信息查询功能,整体执行文件大小如下:
biao@ubuntu:~/minimp4_test$ mips-linux-uclibc-gnu-size test
text data bss dec hex filename
354696 1460 13624 369780 5a474 t
biao@ubuntu:~/minimp4_test$
(一)功能需求介绍
在一般嵌入式设备上,我们一般只需要MP4的一些简单操作,比如封装,解封装及文件信息查看。具体功能要求如下:
支持合入H.264 和H.265 视频格式视频
支持合入AAC音频
支持MP4格式文件解封装
支持获取MP4文件信息
性能上的限制,我们希望:
代码空间小于500K
运行内存小于100K
要在有限的资源上实现上面这些功能,我们可以在minimp4的基础再进一步完善。
minimp4的源代码可以直接在github上下载,官方有个minimp4_test.c,里面有些使用的demo,但不是非常完善,可以参考使用。
(二)支持H.264与H.265格式
(1)H.264与H.265的区别
使用工具打开官方自带的foreman.264文件,我们可以看到:
该文件中包含SPS,PPS,IDR,P帧,在其它文件中,可能还会有B帧
头标签为00 00 00 01,后面一个是帧类型
视频分辨率352*288
流类型AVC/H.264
总共300帧
另外打开一个H.265文件
我们可以看到:
该文件中包含VPS SPS,PPS,IDR,TRAIL_R,TRAIL_N帧
头标签为00 00 00 01,后面是帧类型
视频分辨率1280*720
流类型HEVC/H.265
总共770帧
从应用的角度看,H.265 是有多一个VPS帧,它主要是用来描述视频中各种类型帧(比如I帧、P帧、B帧)的使用和顺序,以及它们之间的相关性.
在实际使用的时候,需要注意VPS、SPS、PPS这些帧的封装和解析。
