1. 程式人生 > >利用mp4v2實現H.264裸碼流實時封裝

利用mp4v2實現H.264裸碼流實時封裝

1. mp4v2庫配置、交叉編譯

mp4v2 庫是一個專用於處理mp4容器的開源專案,其使用c++編寫,並提供c語言介面。
下載mp4v2庫的最新程式碼以後,使用標準linux configure 進行配置,以設定cross-compile、目錄等,然後進行編譯。具體過程整理如下:

  1. 配置 ./configure --help 可以檢視所有配置選項。例如:./configure --prefix=/home/xxx/mp4v2_install_dir --host=arm-hisiv500-linux --disable-debug
  2. 編譯,安裝目標檔案到配置的地點 make ; make install
  3. 得到編譯結果檔案
├── 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裸流實時封裝的過程

該示例只插入了視訊碼流,音訊碼流插入方法類似

準備工作

  1. 包含mp4v2標頭檔案#include "mp4v2/mp4v2.h"
  2. 在編譯命令中加上鍊接mp4v2庫libmp4v2.a或libmp4v2.so的程式碼 -static -lmp4v2-lmp4v2
  3. 加入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);

參考資料