mp4v2 库是一个专用于处理mp4容器的开源项目,其使用c++编写,并提供c语言接口。
下载mp4v2库的最新代码以后,使用标准linux configure 进行配置,以设置cross-compile、目录等,然后进行编译。具体过程整理如下:
1. 配置与编译mp4v2
配置 ./configure --help 可以查看所有配置选项。例如:
#--prefix 指向交叉编译的SYSROOT路径
#--CC 指向编译工具链的gcc
#--CXX 指向编译工具链的g++
export PATH=/opt/grape-buildhf/host/opt/ext-toolchain/bin/:$PATH
./configure --prefix=/opt/grape-buildhf/staging/ --host=arm-linux --disable-debug --enable-shared CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++
编译,安装目标文件到配置的地点 make ; make install
得到编译结果文件,没有设置编译路径。
则在编译目录下.libs,是隐藏文件夹,可以得到静态库目标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
网友评论