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
│ ├── 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