SkeyePlayer(Windows)中录像采用GPAC的MP4Box库来封装MP4,下面我将简单介绍MP4的封装调用流程和需要注意的点;
一、GPAC库的编译,GPAC是跨平台的库,windows和linux都能很方便多编译,再次不做过多赘述,大家可去GPAC官网或者Github上下载;
二、创建MP4
bool SkeyeMP4Writer::CreateMP4File(char*filename,int flag)
{
SaveFile();
m_audiostartimestamp=-1;
m_videostartimestamp=-1;
if(filename==NULL)
{
char filename2[256]={0};
sprintf(filename2,"%d-gpac%d.mp4",time(NULL),rand());
p_file=gf_isom_open(filename2,GF_ISOM_OPEN_WRITE,NULL);//打开文件
}else
p_file=gf_isom_open(filename,GF_ISOM_OPEN_WRITE,NULL);//打开文件
if (p_file==NULL)
{
return false;
}
gf_isom_set_brand_info(p_file,GF_ISOM_BRAND_MP42,0);
//if(flag&ZOUTFILE_FLAG_VIDEO)
//{
// m_videtrackid=gf_isom_new_track(p_file,0,GF_ISOM_MEDIA_VISUAL,1000);
// gf_isom_set_track_enabled(p_file,m_videtrackid,1);
//}
//if(flag&ZOUTFILE_FLAG_AUDIO)
//{
// m_audiotrackid=gf_isom_new_track(p_file,0,GF_ISOM_MEDIA_AUDIO,1000);
// gf_isom_set_track_enabled(p_file,m_audiotrackid,1);
//}
m_nCreateFileFlag = flag;
return true;
}
创建MP4很简单,调用gf_isom_open函数就能轻松搞定,gf_isom_set_brand_info函数设置当前写MP4的版本为MP4V2;值得注意的地方是:
1>. 创建文件之前需要对所有的参数进行初始化,以及如果文件正在写入则需要将其关闭,这个操作主要是32位程序写的MP4文件大于4G可能出现不能播放的问题,为了方便写MP4文件进行分片,这个将在系列文章后续中进行讲解;
2>. 大家可以看到上段代码有屏蔽了部分代码flag&ZOUTFILE_FLAG_VIDEO和flag&ZOUTFILE_FLAG_AUDIO的判断,这两段代码是用来在MP4文件中创建音频轨和视频轨(默认各只创建一个),请注意:如果这里已经创建了音频和视频轨,然而后续的写入过程中如果只写音频或者视频的话,某些播放器可能是播不出来的(比如windows自带的播放器),所以,如果只写音频的话只需要创建音频轨就可以了,视频同理。
三、写入视频H264的SPS和PPS头信息
bool SkeyeMP4Writer::WriteH264SPSandPPS(unsigned char*sps,int spslen,unsigned char*pps,int ppslen,int width,int height)
{
if