这是代码:
//写视频数据
BOOL WriteVideoData(RECORD_PARAM *struRecordParam, char* pVideoData, int nSize, int iFrameRate, int iType, long lTimestemp){
BOOL bResult = FALSE;
if(struRecordParam==NULL || struRecordParam->mp4FileHandle<=0 || struRecordParam->isOpen==FALSE) return FALSE;
// if (struRecordParam->videoId == MP4_INVALID_TRACK_ID) {
//
// return FALSE;
// }
if (nSize==0) {//写空帧
if (!MP4WriteSample(struRecordParam->mp4FileHandle,
struRecordParam->videoId,
(const uint8_t*)pVideoData,
nSize,
lTimestemp,
0,
true)) {
return FALSE;
}
return TRUE;
}
//
if ((pVideoData[4]&0x1f) == 7) {
NSLOGE("writeVideoFrame: if 7");
if (struRecordParam->hasSPS) {
return FALSE;
}
NSLOGE("to MP4AddH264VideoTrack ");
struRecordParam->videoId = MP4AddH264VideoTrack(struRecordParam->mp4FileHandle,
struRecordParam->nVideoTimeScale,
(struRecordParam->nVideoTimeScale/struRecordParam->nVideoFrameRate),
struRecordParam->nVideoWidth,
struRecordParam->nVideoHeight,
pVideoData[5],
pVideoData[6],
pVideoData[7],
3);
if (struRecordParam->videoId == MP4_INVALID_TRACK_ID) {
return FALSE;
}
MP4SetVideoProfileLevel(struRecordParam->mp4FileHandle, 0x7F);
MP4AddH264SequenceParameterSet(struRecordParam->mp4FileHandle,
struRecordParam->videoId,
(const uint8_t*)(pVideoData+4),
nSize-4);
struRecordParam->hasSPS = TRUE;
NSLOGE("MP4AddH264VideoTrack ok");
} else if ((pVideoData[4]&0x1f) == 8) {
NSLOGE("writeVideoFrame: if 8");
if (struRecordParam->hasPPS) {
return FALSE;
}
MP4AddH264PictureParameterSet(struRecordParam->mp4FileHandle,
struRecordParam->videoId,
(const uint8_t*)(pVideoData+4),
nSize-4);
struRecordParam->hasPPS = TRUE;
} else {
NSLOGE("writeVideoFrame: if else");
pVideoData[0] = (nSize-4) >> 24;
pVideoData[1] = (nSize-4) >> 16;
pVideoData[2] = (nSize-4) >> 8;
pVideoData[3] = (nSize-4) & 0xff;
if (!MP4WriteSample(struRecordParam->mp4FileHandle,
struRecordParam->videoId,
(const uint8_t*)(pVideoData),
nSize,
MP4_INVALID_DURATION,
0,
true)) {
return FALSE;
}
}
return TRUE;
}
//写空帧
BOOL WriteEmptyVideoData(RECORD_PARAM *struRecordParam){
if(struRecordParam==NULL || struRecordParam->isOpen==FALSE) return FALSE;
if (!MP4WriteSample(struRecordParam->mp4FileHandle,
struRecordParam->videoId,
NULL,
0,
MP4_INVALID_DURATION,
0,
true)) {
return FALSE;
}
return TRUE;
}
//写音频数据
BOOL WriteAudioData(RECORD_PARAM *struRecordParam, char* pAudioData, int nSize, long lTimestemp){
if(struRecordParam==NULL || struRecordParam->mp4FileHandle<=0 || struRecordParam->isOpen==FALSE) return FALSE;
BOOL bResult = FALSE;
uint8_t *bufaudio = (uint8_t*)pAudioData;
if (struRecordParam->audioId == MP4_INVALID_TRACK_ID)
{
//添加aac音频
NSLOGE("MP4AddAudioTrack");//add for test
struRecordParam->audioId = MP4AddAudioTrack(struRecordParam->mp4FileHandle, 48000, MP4_INVALID_DURATION, MP4_MPEG4_AUDIO_TYPE);
if (struRecordParam->audioId == MP4_INVALID_TRACK_ID)
{
return bResult;
}
NSLOGE("MP4SetAudioProfileLevel");//add for test
MP4SetAudioProfileLevel(struRecordParam->mp4FileHandle, 0x02);
NSLOGE("MP4SetTrackESConfiguration");//add for test
MP4SetTrackESConfiguration(struRecordParam->mp4FileHandle, struRecordParam->audioId, &bufaudio[0], nSize);
}
if (struRecordParam->audioId != MP4_INVALID_TRACK_ID) {
NSLOGE("MP4WriteSample audio");//add for test
MP4WriteSample(struRecordParam->mp4FileHandle,
struRecordParam->audioId,
&bufaudio[7],
nSize-7,
lTimestemp,
0,
true);
}
bResult = TRUE;
return bResult;
}