mp4v2库配置、交叉编译

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

你可能感兴趣的:(mp4v2库配置、交叉编译)