mp4v2 基本知识

时间:2023-12-22 18:52:44

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.
20161024091151_180.MP4 :
Track Type Info
audio MPEG- AAC LC, 180.096 secs, kbps, Hz
video H264 Baseline@4.2, 180.000 secs, kbps, 1920x1080 @ 30.000000 fps
./mp4track 20161024091151_180.MP4 --list
track[] id=
type = audio
enabled = true
inMovie = false
inPreview = false
layer =
alternateGroup =
volume = 1.0000
width = 0.00000000
height = 0.00000000
language = Undetermined
handlerName =
userDataName = <absent>
track[] id=
type = video
enabled = true
inMovie = false
inPreview = false
layer =
alternateGroup =
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
./mp4trackdump version 2.0.
mp4file 20161024091151_180.MP4, track , samples , timescale
sampleId , size duration time ::00.000 S
sampleId , size duration time ::00.033
sampleId , size duration time ::00.066
sampleId , size duration time ::00.100
sampleId , size duration time ::00.133
sampleId , size duration time ::00.166
sampleId , size duration time ::00.200

这儿有一些关键信息:

sampleId 就是mp4 里面frame的索引;每个sampleId 对应一帧264的视频 
size 就是frame的大小 
duration 这个是给播放器使用的,播放器需要显示这一帧的时间就是 3000 / 90000 (timescale) 秒;这个视频是30帧的,就是1/30秒;后面的rtsp发流的时间撮也是根据这个时间来处理的; 
后面的时间就是转化为秒为单位的时间;

比如解析track 1 音频通道

./mp4trackdump 20161024091151_180.MP4  -t
./mp4trackdump version 2.0.
mp4file 20161024091151_180.MP4, track , samples , timescale
sampleId , size duration time ::00.000 S
sampleId , size duration time ::00.128 S
sampleId , size duration time ::00.256 S
sampleId , size duration time ::00.384 S
sampleId , size duration time ::00.512 S
sampleId , size duration time ::00.640 S
sampleId , size duration time ::00.768 S
sampleId , size duration time ::00.896 S
sampleId , size duration time ::01.024 S
sampleId , size duration time ::01.152 S

sampleId 就是mp4 里面aac frame的索引;每个sampleId 对应一阵aac的视频 
size 就是frame的大小 
duration 音频和视频一样,1024 就是在1024/8000 S时间内音频采样数据通过aac压缩算后得到的,其它音频算法压缩算法也基本一样; 
后面的时间就是转化为秒为单位的时间;

mp4v2的api就是隐藏了复杂的mp4结构解析流程,返回给用户直接是一帧帧数据的方式; 
你只需要通过对应的接口~以帧的方式读取处理即可;

简单高效,基本和其它的文件操作没啥区别;