利用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
相关文章推荐
- 利用Directsound编程实现实时混音
- 利用SharpZipLib实现实时zip压缩下载整个目录
- 利用GSM短信实现实时数据通信
- 利用VC++实现局域网实时视频传输
- 利用ARCGIS FLEX API实现实时内插并显示结果图
- 利用脚本封装,方便实现网站悬浮广告
- SPCAMLEditor使用系列(3)--利用SPCamlEditor实现 时间字段跟当前时间进行实时比较计算
- 利用Ajax生成ProgressBar:实现同类大批量数据批量生成Html,并实时显示进度条,可查看处理日志
- 利用FileWatcher实现文件实时监视
- 利用Directsound编程实现实时混音
- 利用VC++实现局域网实时视频传输
- 利用VC 实现局域网实时视频传输
- 利用Directsound编程实现实时混音
- 利用Google和CSDN的API实现手机实时接收论坛信息
- 利用Protothread实现实时多任务系统
- 利用USB2.0接口的芯片CY7C68013和单片机实现全数字图像的实时采集
- 利用VC++实现局域网实时视频传输
- 利用Directsound编程实现实时混音
- (转)利用VC++实现局域网实时视频传输(网络视频)
- 利用SharpZipLib实现实时zip压缩下载整个目录