您的位置:首页 > 其它

MP4V2 录制mp4(h264+aac) 接口介绍

2014-12-24 10:52 288 查看
MP4录制程序是根据mpeg4ip中mpeg4ip-1.5.0.1\server\mp4live\file_mp4_recorder.cpp文件改的。程序支持h264+aac(raw 流)的写入方式,用到了动态库mp4v2-2.0.0,不要用mpeg4ip中那个较老的版本,因为在录制大文件时会有效率问题,下面是一些mp4v2接口的简介。

MP4FileHandle MP4Create (const char* fileName,uint32_t flags)

功能:创建MP4文件句柄。

返回:MP4文件句柄。

参数:fileName 要录制的MP4文件名;flags 创建文件类型,如果要创建普通文件用默认值0就可以,如要录制大于4G的MP4文件此处要设置MP4_CREATE_64BIT_DATA。

bool MP4SetTimeScale( MP4FileHandle hFile, uint32_t value )

功能:设置时间标度。

返回:成功返回true,失败返回false。

参数:hFile MP4文件句柄,value 要设置的值(每秒的时钟ticks数)。

MP4TrackId MP4AddH264VideoTrack(MP4FileHandle hFile,

uint32_t timeScale,

MP4Duration sampleDuration,

uint16_t width,

uint16_t height,

uint8_t AVCProfileIndication,

uint8_t profile_compat,

uint8_t AVCLevelIndication,

uint8_t sampleLenFieldSizeMinusOne)

功能:添加h264视频track。

返回:返回track id号。

参数:hFile MP4文件句柄,timeScale 视频每秒的ticks数(如90000),sampleDuration 设置为 MP4_INVALID_DURATION,width height 视频的宽高,AVCProfileIndication profile (baseline profile, main profile, etc. see),profile_compat compatible profile,AVCLevelIndication levels,sampleLenFieldSizeMinusOne
设置为3.

注意: AVCProfileIndication,profile_compat, AVCLevelIndication,这三个参数值是在h264流中得到的。

MP4TrackId MP4AddAudioTrack(

MP4FileHandle hFile,

uint32_t timeScale,

MP4Duration sampleDuration,

uint8_t audioType)

功能:添加音频(aac)track。

返回:返回track id号。

参数:hFile MP4句柄,timeScale音频每秒的ticks数(如16000),下面两参数设置为MP4_INVALID_DURATION和MP4_MPEG4_AUDIO_TYPE。

bool MP4SetTrackESConfiguration(

MP4FileHandle hFile,

MP4TrackId trackId,

const uint8_t* pConfig,

uint32_t configSize );
功能:设置音频解码信息(如果设置错误会导致没有声音)。

返回:成功返回true,失败返回false。

参数:hFile 文件句柄,trackId 音频的track id,pConfig 记录解码信息的二进制流,configSize 解码串的长度。

注意:mpeg4ip 使用faac进行aac音频编码的,在编码时可以调用相应的函数得到二进制串pConfig和长度configSize,但是如果aac不是用faac编码的,这是需要自己填充pConfig,可以参考faac的实现,下面是一个填充结构例子:

前五个字节为 AAC object types LOW 2

接着4个字节为 码率index 16000 8

接着4个字节为 channels 个数 1

应打印出的正确2进制形式为 00010 | 1000 | 0001 | 000

2 8 1

bool MP4WriteSample(

MP4FileHandle hFile,

MP4TrackId trackId,

const uint8_t* pBytes,

uint32_t numBytes,

MP4Duration duration DEFAULT(MP4_INVALID_DURATION),

MP4Duration renderingOffset DEFAULT(0),

bool isSyncSample DEFAULT(true) );
功能:写一帧视频数据或写一段音频数据。

返回:成功返回true,失败返回false。

参数:hFile 文件句柄,trackId 音频或视频的track id,pBytes为要写的数据流指针,numBytes为数据字节长度,duration为前一视频帧与当前视频帧之间的ticks数,或这是前一段音频数据和当前音频数据之间的ticks。isSyncSample 对视频来说是否为关键帧。

注意:1,duration这个参数是用来实现音视频同步用的,如果设置错了会造成音视频不同步,甚至会出现crash现象(一般出现在调用MP4Close是crash)。 2,对于视频流MP4WriteSample函数每次调用是录制前一帧数据,用当前帧的时间戳和前一帧的时间戳计算duration值,然后把当前帧保存下来用做下次调用MP4WriteSample时用,写音频数据一样。

void MP4AddH264SequenceParameterSet(

MP4FileHandle hFile,

MP4TrackId trackId,

const uint8_t* pSequence,

uint16_t sequenceLen );



void MP4AddH264PictureParameterSet(

MP4FileHandle hFile,

MP4TrackId trackId,

const uint8_t* pPict,

uint16_t pictLen );
功能:添加序列参数集,添加图像参数集。

参数:hFile 文件句柄,trackId 视频track id,pSequence和pPict为要写入的序列图像参数集的数据指针,sequenceLen和pictLen为串长度。

注意:当检测到序列参数集或图像参数集更新时要调用MP4AddH264SequenceParameterSet或MP4AddH264PictureParameterSet进行更新。

void MP4Close(

MP4FileHandle hFile,

uint32_t flags DEFAULT(0) );

功能:关闭以打开的MP4文件。

参数:hFile 文件句柄,flags 是否允许在关闭MP4文件前做一些额外的优化处理。

注意:在录制较小的MP4文件时可以把flags设置为默认值,如果录制较大的文件最好把flags设置为MP4_CLOSE_DO_NOT_COMPUTE_BITRATE否则调用MP4Close函数会用掉很长的时间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: