⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mp4.cpp

📁 mpeg4 video codec mpeg4 video codec
💻 CPP
📖 第 1 页 / 共 5 页
字号:
extern "C" MP4TrackId MP4AddSceneTrack(MP4FileHandle hFile){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			return ((MP4File*)hFile)->AddSceneTrack();		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}	return MP4_INVALID_TRACK_ID;}extern "C" MP4TrackId MP4AddAudioTrack(	MP4FileHandle hFile, 	u_int32_t timeScale, 	MP4Duration sampleDuration, 	u_int8_t audioType){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			return ((MP4File*)hFile)->				AddAudioTrack(timeScale, sampleDuration, audioType);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}	return MP4_INVALID_TRACK_ID;}extern "C" MP4TrackId MP4AddEncAudioTrack(MP4FileHandle hFile, 					  u_int32_t timeScale, 					  MP4Duration sampleDuration, 					  u_int8_t audioType){  if (MP4_IS_VALID_FILE_HANDLE(hFile)) {    try {      return ((MP4File*)hFile)->	AddEncAudioTrack(timeScale, sampleDuration, audioType);    }    catch (MP4Error* e) {      PRINT_ERROR(e);      delete e;    }  }  return MP4_INVALID_TRACK_ID;}extern "C" MP4TrackId MP4AddVideoTrack(	MP4FileHandle hFile, 	u_int32_t timeScale, 	MP4Duration sampleDuration,	u_int16_t width, 	u_int16_t height, 	u_int8_t videoType){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			return ((MP4File*)hFile)->AddVideoTrack(				timeScale, sampleDuration, width, height, videoType);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}	return MP4_INVALID_TRACK_ID;}extern "C" MP4TrackId MP4AddEncVideoTrack(MP4FileHandle hFile, 					  u_int32_t timeScale, 					  MP4Duration sampleDuration,					  u_int16_t width, 					  u_int16_t height, 					  u_int8_t videoType){  if (MP4_IS_VALID_FILE_HANDLE(hFile)) {    try {      return ((MP4File*)hFile)->AddEncVideoTrack(timeScale, sampleDuration, 						 width, height, videoType);    }    catch (MP4Error* e) {      PRINT_ERROR(e);      delete e;    }  }  return MP4_INVALID_TRACK_ID;}extern "C" MP4TrackId MP4AddHintTrack(	MP4FileHandle hFile, MP4TrackId refTrackId){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			return ((MP4File*)hFile)->AddHintTrack(refTrackId);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}	return MP4_INVALID_TRACK_ID;}extern "C" MP4TrackId MP4CloneTrack(	MP4FileHandle srcFile, 	MP4TrackId srcTrackId,	MP4FileHandle dstFile){	MP4TrackId dstTrackId = MP4_INVALID_TRACK_ID;	if (dstFile == NULL) {		dstFile = srcFile;	}	const char* trackType = 		MP4GetTrackType(srcFile, srcTrackId);	if (!trackType) {		return dstTrackId;	}	if (MP4_IS_VIDEO_TRACK_TYPE(trackType)) {                MP4SetVideoProfileLevel(dstFile,                                         MP4GetVideoProfileLevel(srcFile));		dstTrackId = MP4AddVideoTrack(			dstFile,			MP4GetTrackTimeScale(srcFile, srcTrackId),			MP4GetTrackFixedSampleDuration(srcFile, srcTrackId),			MP4GetTrackVideoWidth(srcFile, srcTrackId),			MP4GetTrackVideoHeight(srcFile, srcTrackId),			MP4GetTrackEsdsObjectTypeId(srcFile, srcTrackId));	} else if (MP4_IS_AUDIO_TRACK_TYPE(trackType)) {                MP4SetAudioProfileLevel(dstFile,                                         MP4GetAudioProfileLevel(srcFile));		dstTrackId = MP4AddAudioTrack(			dstFile,			MP4GetTrackTimeScale(srcFile, srcTrackId),			MP4GetTrackFixedSampleDuration(srcFile, srcTrackId),			MP4GetTrackEsdsObjectTypeId(srcFile, srcTrackId));	} else if (MP4_IS_OD_TRACK_TYPE(trackType)) {		dstTrackId = MP4AddODTrack(dstFile);	} else if (MP4_IS_SCENE_TRACK_TYPE(trackType)) {		dstTrackId = MP4AddSceneTrack(dstFile);	} else if (MP4_IS_HINT_TRACK_TYPE(trackType)) {		dstTrackId = MP4AddHintTrack(			dstFile,			MP4GetHintTrackReferenceTrackId(srcFile, srcTrackId));	} else if (MP4_IS_SYSTEMS_TRACK_TYPE(trackType)) {		dstTrackId = MP4AddSystemsTrack(dstFile, trackType);	} else {		dstTrackId = MP4AddTrack(dstFile, trackType);	}	if (dstTrackId == MP4_INVALID_TRACK_ID) {		return dstTrackId;	}	MP4SetTrackTimeScale(		dstFile, 		dstTrackId,		MP4GetTrackTimeScale(srcFile, srcTrackId));	if (MP4_IS_AUDIO_TRACK_TYPE(trackType) 	    || MP4_IS_VIDEO_TRACK_TYPE(trackType)) {	// copy track ES configuration	u_int8_t* pConfig = NULL;	u_int32_t configSize = 0;	MP4GetTrackESConfiguration(		srcFile, 		srcTrackId,		&pConfig,		&configSize);	MP4SetTrackESConfiguration(		dstFile, 		dstTrackId,		pConfig,		configSize);		free(pConfig);	}	if (MP4_IS_HINT_TRACK_TYPE(trackType)) {		// probably not exactly what is wanted		// but caller can adjust later to fit their desires		char* payloadName = NULL;		char *encodingParms = NULL;		u_int8_t payloadNumber;		u_int16_t maxPayloadSize;		MP4GetHintTrackRtpPayload(			srcFile,			srcTrackId,			&payloadName,			&payloadNumber,			&maxPayloadSize,			&encodingParms);		MP4SetHintTrackRtpPayload(			dstFile,			dstTrackId,			payloadName,			&payloadNumber,			maxPayloadSize,			encodingParms);		MP4SetHintTrackSdp(			dstFile,			dstTrackId,			MP4GetHintTrackSdp(srcFile, srcTrackId));	}	return dstTrackId;}// Given a track, make an encrypted clone of it in the dest. fileextern "C" MP4TrackId MP4EncAndCloneTrack(MP4FileHandle srcFile, 					  MP4TrackId srcTrackId,					  MP4FileHandle dstFile){  MP4TrackId dstTrackId = MP4_INVALID_TRACK_ID;  if (dstFile == NULL) {    dstFile = srcFile;  }  const char* trackType =     MP4GetTrackType(srcFile, srcTrackId);  if (!trackType) {    return dstTrackId;  }  if (MP4_IS_VIDEO_TRACK_TYPE(trackType)) {    MP4SetVideoProfileLevel(dstFile, MP4GetVideoProfileLevel(srcFile));    dstTrackId = MP4AddEncVideoTrack(dstFile,				     MP4GetTrackTimeScale(srcFile, srcTrackId),				     MP4GetTrackFixedSampleDuration(srcFile, 								    srcTrackId),				     MP4GetTrackVideoWidth(srcFile, srcTrackId),				     MP4GetTrackVideoHeight(srcFile, srcTrackId),				     MP4GetTrackEsdsObjectTypeId(srcFile, 								 srcTrackId));  } else if (MP4_IS_AUDIO_TRACK_TYPE(trackType)) {    MP4SetAudioProfileLevel(dstFile, MP4GetAudioProfileLevel(srcFile));    dstTrackId = MP4AddEncAudioTrack(dstFile,				     MP4GetTrackTimeScale(srcFile, srcTrackId),				     MP4GetTrackFixedSampleDuration(srcFile, 								    srcTrackId),				     MP4GetTrackEsdsObjectTypeId(srcFile, 								 srcTrackId));  } else if (MP4_IS_OD_TRACK_TYPE(trackType)) {    dstTrackId = MP4AddODTrack(dstFile);  } else if (MP4_IS_SCENE_TRACK_TYPE(trackType)) {    dstTrackId = MP4AddSceneTrack(dstFile);      } else if (MP4_IS_HINT_TRACK_TYPE(trackType)) {    dstTrackId = MP4AddHintTrack(dstFile,				 MP4GetHintTrackReferenceTrackId(srcFile, 								 srcTrackId));  } else if (MP4_IS_SYSTEMS_TRACK_TYPE(trackType)) {    dstTrackId = MP4AddSystemsTrack(dstFile, trackType);      } else {    dstTrackId = MP4AddTrack(dstFile, trackType);  }  if (dstTrackId == MP4_INVALID_TRACK_ID) {    return dstTrackId;  }  MP4SetTrackTimeScale(dstFile, 		       dstTrackId,		       MP4GetTrackTimeScale(srcFile, srcTrackId));  if (MP4_IS_AUDIO_TRACK_TYPE(trackType)    || MP4_IS_VIDEO_TRACK_TYPE(trackType)) {    // copy track ES configuration    u_int8_t* pConfig = NULL;    u_int32_t configSize = 0;    if (MP4GetTrackESConfiguration(srcFile, srcTrackId,				   &pConfig, &configSize)) {          if (pConfig != NULL) {	MP4SetTrackESConfiguration(dstFile, dstTrackId,				   pConfig, configSize);      }    }    if (pConfig != NULL)      free(pConfig);    }  return dstTrackId;}extern "C" MP4TrackId MP4CopyTrack(MP4FileHandle srcFile, 				   MP4TrackId srcTrackId,				   MP4FileHandle dstFile, 				   bool applyEdits){  bool copySamples = true;	// LATER allow false => reference samples  MP4TrackId dstTrackId =    MP4CloneTrack(srcFile, srcTrackId, dstFile);  if (dstTrackId == MP4_INVALID_TRACK_ID) {    return dstTrackId;  }  bool viaEdits =    applyEdits && MP4GetTrackNumberOfEdits(srcFile, srcTrackId);  MP4SampleId sampleId = 0;  MP4SampleId numSamples =     MP4GetTrackNumberOfSamples(srcFile, srcTrackId);  MP4Timestamp when = 0;  MP4Duration editsDuration =     MP4GetTrackEditTotalDuration(srcFile, srcTrackId);  while (true) {    MP4Duration sampleDuration = MP4_INVALID_DURATION;    if (viaEdits) {      sampleId = MP4GetSampleIdFromEditTime(					    srcFile,					    srcTrackId,					    when,					    NULL,					    &sampleDuration);      // in theory, this shouldn't happen      if (sampleId == MP4_INVALID_SAMPLE_ID) {	MP4DeleteTrack(dstFile, dstTrackId);	return MP4_INVALID_TRACK_ID;      }      when += sampleDuration;            if (when >= editsDuration) {	break;      }    } else {      sampleId++;      if (sampleId > numSamples) {	break;      }    }    bool rc = false;        if (copySamples) {      rc = MP4CopySample(			 srcFile,			 srcTrackId,			 sampleId,			 dstFile,			 dstTrackId,			 sampleDuration);    } else {      rc = MP4ReferenceSample(			      srcFile,			      srcTrackId,			      sampleId,			      dstFile,			      dstTrackId,			      sampleDuration);    }    if (!rc) {      MP4DeleteTrack(dstFile, dstTrackId);      return MP4_INVALID_TRACK_ID;    }  }  return dstTrackId;}// Given a source track in a source file, make an encrypted copy of // the track in the destination file, including sample encryptionextern "C" MP4TrackId MP4EncAndCopyTrack(MP4FileHandle srcFile, 				      MP4TrackId srcTrackId,				      MP4FileHandle dstFile, 				      bool applyEdits){  bool copySamples = true;	// LATER allow false => reference samples  MP4TrackId dstTrackId =    MP4EncAndCloneTrack(srcFile, srcTrackId, dstFile);  if (dstTrackId == MP4_INVALID_TRACK_ID) {    return dstTrackId;  }  bool viaEdits =    applyEdits && MP4GetTrackNumberOfEdits(srcFile, srcTrackId);  MP4SampleId sampleId = 0;  MP4SampleId numSamples =     MP4GetTrackNumberOfSamples(srcFile, srcTrackId);  MP4Timestamp when = 0;  MP4Duration editsDuration =     MP4GetTrackEditTotalDuration(srcFile, srcTrackId);  while (true) {    MP4Duration sampleDuration = MP4_INVALID_DURATION;    if (viaEdits) {      sampleId = MP4GetSampleIdFromEditTime(srcFile,					    srcTrackId,					    when,					    NULL,					    &sampleDuration);      // in theory, this shouldn't happen      if (sampleId == MP4_INVALID_SAMPLE_ID) {	MP4DeleteTrack(dstFile, dstTrackId);	return MP4_INVALID_TRACK_ID;      }      when += sampleDuration;      if (when >= editsDuration) {	break;      }    } else {      sampleId++;      if (sampleId > numSamples) {	break;      }    }    bool rc = false;    if (copySamples) {      // will need to encrypt the sample here      rc = MP4CopySample(srcFile,			 srcTrackId,			 sampleId,			 dstFile,			 dstTrackId,			 sampleDuration);    } else {      rc = MP4ReferenceSample(srcFile,			      srcTrackId,			      sampleId,			      dstFile,			      dstTrackId,			      sampleDuration);    }    if (!rc) {      MP4DeleteTrack(dstFile, dstTrackId);      return MP4_INVALID_TRACK_ID;    }  }  return dstTrackId;}extern "C" bool MP4DeleteTrack(	MP4FileHandle hFile, 	MP4TrackId trackId){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			((MP4File*)hFile)->DeleteTrack(trackId);			return true;		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}	return false;}extern "C" u_int32_t MP4GetNumberOfTracks(	MP4FileHandle hFile, 	const char* type,	u_int8_t subType){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			return ((MP4File*)hFile)->GetNumberOfTracks(type, subType);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}	return 0;}extern "C" MP4TrackId MP4FindTrackId(	MP4FileHandle hFile, 	u_int16_t index, 	const char* type,	u_int8_t subType){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			return ((MP4File*)hFile)->FindTrackId(index, type, subType);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}	return MP4_INVALID_TRACK_ID;}extern "C" u_int16_t MP4FindTrackIndex(	MP4FileHandle hFile, MP4TrackId trackId){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			return ((MP4File*)hFile)->FindTrackIndex(trackId);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}	return (u_int16_t)-1;}/* specific track properties */extern "C" const char* MP4GetTrackType(	MP4FileHandle hFile, MP4TrackId trackId){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			return ((MP4File*)hFile)->GetTrackType(trackId);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}	return NULL;}extern "C" MP4Duration MP4GetTrackDuration(	MP4FileHandle hFile, MP4TrackId trackId){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			return ((MP4File*)hFile)->GetTrackDuration(trackId);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}	return MP4_INVALID_DURATION;}extern "C" u_int32_t MP4GetTrackTimeScale(	MP4FileHandle hFile, MP4TrackId trackId){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			return ((MP4File*)hFile)->GetTrackTimeScale(trackId);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}	return 0;}extern "C" bool MP4SetTrackTimeScale(	MP4FileHandle hFile, MP4TrackId trackId, u_int32_t value){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			((MP4File*)hFile)->SetTrackTimeScale(trackId, value);			return true;		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}	return false;}// This function should not be used anymore  // use MP4GetTrackEsdsObjectTypeId instead extern "C" u_int8_t MP4GetTrackAudioType(     MP4FileHandle hFile, MP4TrackId trackId){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {		  		  return ((MP4File*)hFile)->GetTrackAudioType(trackId);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}	return MP4_INVALID_AUDIO_TYPE;}extern "C" u_int8_t MP4GetTrackAudioMpeg4Type(	MP4FileHandle hFile, MP4TrackId trackId){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			return ((MP4File*)hFile)->GetTrackAudioMpeg4Type(trackId);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}	return MP4_MPEG4_INVALID_AUDIO_TYPE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -