您的位置:首页 > 运维架构 > Linux

利用mp4v2实现H.264裸码流实时封装

2017-03-24 16:55 162 查看

1. mp4v2库配置、交叉编译

mp4v2 库是一个专用于处理mp4容器的开源项目,其使用c++编写,并提供c语言接口。

下载mp4v2库的最新代码以后,使用标准linux configure 进行配置,以设置cross-compile、目录等,然后进行编译。具体过程整理如下:

配置
./configure --help
可以查看所有配置选项。例如:
./configure --prefix=/home/xxx/mp4v2_install_dir --host=arm-hisiv500-linux --disable-debug


编译,安装目标文件到配置的地点
make ; make install


得到编译结果文件

├── bin
│   ├── mp4art
│   ├── mp4chaps
│   ├── mp4extract
│   ├── mp4file
│   ├── mp4info
│   ├── mp4subtitle
│   ├── mp4tags
│   ├── mp4track
│   └── mp4trackdump
├── include
│   └── mp4v2
│       ├── chapter.h
│       ├── file.h
│       ├── file_prop.h
│       ├── general.h
│       ├── isma.h
│       ├── itmf_generic.h
│       ├── itmf_tags.h
│       ├── mp4v2.h
│       ├── platform.h
│       ├── project.h
│       ├── sample.h
│       ├── streaming.h
│       ├── track.h
│       └── track_prop.h
├── lib
│   ├── libmp4v2.a
│   ├── libmp4v2.la
│   ├── libmp4v2.so -> libmp4v2.so.2.0.0
│
4000
├── libmp4v2.so.2 -> libmp4v2.so.2.0.0
│   └── libmp4v2.so.2.0.0
└── share
└── man
└── man1
├── mp4art.1
├── mp4file.15r6
├── mp4subtitle.1
└── mp4track.1


其中,使用mp4v2有两种方式:使用编译完成的bin工具或者使用其API(库文件)

这里使用更为灵活的API方式完成MP4封装程序。

编译完成后在lib目录可以得到静态库目标libmp4v2.a和动态库目标libmp4v2.so.2.0.0,以及指向动态库的两个软链接文件。

在include目录下可以得到mp4v2库的所有头文件,其中mp4v2.h是顶层include文件。使用mp4v2库时,只需包含mp4v2.h即可。

2. 使用mp4v2库将H264裸流实时封装的过程

该示例只插入了视频码流,音频码流插入方法类似

准备工作

包含mp4v2头文件
#include "mp4v2/mp4v2.h"


在编译命令中加上链接mp4v2库libmp4v2.a或libmp4v2.so的代码
-static -lmp4v2
-lmp4v2


加入mp4v2库依赖的库libstdc++.so和libm.so
-lstdc++ -lm


代码

初始化文件

MP4FileHandle hMP4File = MP4CreateEx(strDstFileName,  0, 1, 1, 0, 0, 0, 0);
if (hMP4File == MP4_INVALID_FILE_HANDLE)    {
printf("open file fialed.\n");
return NULL;
}

MP4SetTimeScale(hMP4File, 90000);

MP4TrackId video = MP4AddH264VideoTrack(hMP4File, 90000, 90000 / 25, 3840, 2160,
0x64, //sps[1] AVCProfileIndication
0x00, //sps[2] profile_compat
0x1f, //sps[3] AVCLevelIndication
3); // 4 bytes length before each NAL unit
if (video == MP4_INVALID_TRACK_ID)    {
printf("add video track fialed.\n");
return;
}


写入H264帧(假设一帧数据缓存指针pBuf, 数据长度为nBuf)

while(!stream_end()){
MP4WriteSample(hMP4File, video, pBuf, nBuf , MP4_INVALID_DURATION, 0, 1);
}


关闭MP4文件

MP4Close(hMP4File, 0);


参考资料

【mp4文件格式解析】 http://blog.sina.com.cn/s/blog_48f93b530100jz4b.html
【RTP2MP4】 https://github.com/ZhengfengRao/rtp2mp4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息