mp4v2 和mp4的一些基礎知識
由於項目需要做mp4文件的合成(264+aac)和mp4文件的解析;
MP4文件本身就是一個容器,對於視頻來說就是把不同的內容放按照mp4的規則存放而已;
如果完全自己寫代碼實現,可能需要完全理解mp4的規則;才能做好mp4文件的解析;
測試過程中,考慮到簡單易用性同時對生成mp4文件的兼容性考慮,採用開源項目mp4v2作爲mp4文件的muxer和demuxer工具;
1.mp4v2 源代碼下載.
http://www.codeforge.cn/article/259182
最新版本是mp4v2-2.0.0
2.mp4v2 linux編譯
./configure –prefix=/home/installtest/ –disable-debug –disable-shared
make
make install
3.mp4v2一些基本sample的使用
其實在sample下面這些基本的命令代碼基本以及包含常用mp4v2的api使用方法.
-rwxr-xr-x 1 ll ll 405K Nov 4 15:49 mp4art
-rwxr-xr-x 1 ll ll 598K Nov 4 15:49 mp4chaps
-rwxr-xr-x 1 ll ll 162K Nov 4 15:49 mp4extract
-rwxr-xr-x 1 ll ll 241K Nov 4 15:49 mp4file
-rwxr-xr-x 1 ll ll 511K Nov 4 15:49 mp4info
-rwxr-xr-x 1 ll ll 164K Nov 4 15:49 mp4subtitle
-rwxr-xr-x 1 ll ll 279K Nov 4 15:49 mp4tags
-rwxr-xr-x 1 ll ll 860K Nov 4 15:49 mp4track
-rwxr-xr-x 1 ll ll 98K Nov 4 15:49 mp4trackdump
4.mp4文件一些基礎知識
./mp4info 20161024091151_180.MP4
./mp4info version 2.0.0
20161024091151_180.MP4 :
Track Type Info
1 audio MPEG-4 AAC LC, 180.096 secs, 16 kbps, 8000 Hz
2 video H264 Baseline@4.2, 180.000 secs, 8381 kbps, 1920x1080 @ 30.000000 fps
./mp4track 20161024091151_180.MP4 --list
track[0] id=1
type = audio
enabled = true
inMovie = false
inPreview = false
layer = 0
alternateGroup = 0
volume = 1.0000
width = 0.00000000
height = 0.00000000
language = Undetermined
handlerName =
userDataName = <absent>
track[1] id=2
type = video
enabled = true
inMovie = false
inPreview = false
layer = 0
alternateGroup = 0
volume = 0.0000
width = 1920.00000000
height = 1080.00000000
language = Undetermined
handlerName =
userDataName = <absent>
解析mp4的一些基本內容;比如長寬 和trackid 音視頻的編碼算法等等基本知識;
比如解析track 2 是一個視頻通道,這個id從面mp4track 內容裏面獲取的.
./mp4trackdump 20161024091151_180.MP4 -t 2
./mp4trackdump version 2.0.0
mp4file 20161024091151_180.MP4, track 2, samples 5400, timescale 90000
sampleId 1, size 203970 duration 3000 time 0 00:00:00.000 S
sampleId 2, size 47935 duration 3000 time 3000 00:00:00.033
sampleId 3, size 62824 duration 3000 time 6000 00:00:00.066
sampleId 4, size 70342 duration 3000 time 9000 00:00:00.100
sampleId 5, size 20730 duration 3000 time 12000 00:00:00.133
sampleId 6, size 13241 duration 3000 time 15000 00:00:00.166
sampleId 7, size 6947 duration 3000 time 18000 00:00:00.200
這兒有一些關鍵信息:
sampleId 就是mp4 裏面frame的索引;每個sampleId 對應一幀264的視頻
size 就是frame的大小
duration 這個是給播放器使用的,播放器需要顯示這一幀的時間就是 3000 / 90000 (timescale) 秒;這個視頻是30幀的,就是1/30秒;後面的rtsp發流的時間撮也是根據這個時間來處理的;
後面的時間就是轉化爲秒爲單位的時間;
比如解析track 1 音頻通道
./mp4trackdump 20161024091151_180.MP4 -t 1
./mp4trackdump version 2.0.0
mp4file 20161024091151_180.MP4, track 1, samples 1403, timescale 8000
sampleId 1, size 249 duration 1024 time 0 00:00:00.000 S
sampleId 2, size 286 duration 1024 time 1024 00:00:00.128 S
sampleId 3, size 326 duration 1024 time 2048 00:00:00.256 S
sampleId 4, size 320 duration 1024 time 3072 00:00:00.384 S
sampleId 5, size 317 duration 1024 time 4096 00:00:00.512 S
sampleId 6, size 316 duration 1024 time 5120 00:00:00.640 S
sampleId 7, size 306 duration 1024 time 6144 00:00:00.768 S
sampleId 8, size 301 duration 1024 time 7168 00:00:00.896 S
sampleId 9, size 281 duration 1024 time 8192 00:00:01.024 S
sampleId 10, size 288 duration 1024 time 9216 00:00:01.152 S
sampleId 就是mp4 裏面aac frame的索引;每個sampleId 對應一陣aac的視頻
size 就是frame的大小
duration 音頻和視頻一樣,1024 就是在1024/8000 S時間內音頻採樣數據通過aac壓縮算後得到的,其它音頻算法壓縮算法也基本一樣;
後面的時間就是轉化爲秒爲單位的時間;
mp4v2的api就是隱藏了複雜的mp4結構解析流程,返回給用戶直接是一幀幀數據的方式;
你只需要通過對應的接口~以幀的方式讀取處理即可;簡單高效,基本和其它的文件操作沒啥區別;