📄 mp4.cpp
字号:
SetAmrVendor(trackId, vendor); } catch (MP4Error* e) { PRINT_ERROR(e); delete e; } }}extern "C" void MP4SetAmrDecoderVersion( MP4FileHandle hFile, MP4TrackId trackId, u_int8_t decoderVersion){ if (MP4_IS_VALID_FILE_HANDLE(hFile)) { try { ((MP4File*)hFile)-> SetAmrDecoderVersion(trackId, decoderVersion); } catch (MP4Error* e) { PRINT_ERROR(e); delete e; } }}extern "C" void MP4SetAmrModeSet( MP4FileHandle hFile, MP4TrackId trackId, u_int16_t modeSet){ if (MP4_IS_VALID_FILE_HANDLE(hFile)) { try { ((MP4File*)hFile)-> SetAmrModeSet(trackId, modeSet); } catch (MP4Error* e) { PRINT_ERROR(e); delete e; } }}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, mp4v2_ismacrypParams *icPp, u_int8_t videoType ){ if (MP4_IS_VALID_FILE_HANDLE(hFile)) { try { return ((MP4File*)hFile)->AddEncVideoTrack(timeScale, sampleDuration, width, height, videoType, icPp->scheme_type, icPp->scheme_version, icPp->key_ind_len, icPp->iv_len, icPp->selective_enc, icPp->kms_uri); } catch (MP4Error* e) { PRINT_ERROR(e); delete e; } } return MP4_INVALID_TRACK_ID;}extern "C" MP4TrackId MP4AddH263VideoTrack( MP4FileHandle hFile, u_int32_t timeScale, MP4Duration sampleDuration, u_int16_t width, u_int16_t height, u_int8_t h263Level, u_int8_t h263Profile, u_int32_t avgBitrate, u_int32_t maxBitrate){ if (MP4_IS_VALID_FILE_HANDLE(hFile)) { try { return ((MP4File*)hFile)-> AddH263VideoTrack(timeScale, sampleDuration, width, height, h263Level, h263Profile, avgBitrate, maxBitrate); } catch (MP4Error* e) { PRINT_ERROR(e); delete e; } } return MP4_INVALID_TRACK_ID;}extern "C" void MP4SetH263Vendor( MP4FileHandle hFile, MP4TrackId trackId, u_int32_t vendor){ if (MP4_IS_VALID_FILE_HANDLE(hFile)) { try { ((MP4File*)hFile)-> SetH263Vendor(trackId, vendor); } catch (MP4Error* e) { PRINT_ERROR(e); delete e; } }}extern "C" void MP4SetH263DecoderVersion( MP4FileHandle hFile, MP4TrackId trackId, u_int8_t decoderVersion){ if (MP4_IS_VALID_FILE_HANDLE(hFile)) { try { ((MP4File*)hFile)-> SetH263DecoderVersion(trackId, decoderVersion); } catch (MP4Error* e) { PRINT_ERROR(e); delete e; } }}extern "C" void MP4SetH263Bitrates( MP4FileHandle hFile, MP4TrackId trackId, u_int32_t avgBitrate, u_int32_t maxBitrate){ if (MP4_IS_VALID_FILE_HANDLE(hFile)) { try { ((MP4File*)hFile)-> SetH263Bitrates(trackId, avgBitrate, maxBitrate); } catch (MP4Error* e) { PRINT_ERROR(e); delete e; } }}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 dstHintTrackReferenceTrack){ 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)) { if (dstHintTrackReferenceTrack == MP4_INVALID_TRACK_ID) { dstTrackId = MP4_INVALID_TRACK_ID; } else { dstTrackId = MP4AddHintTrack( dstFile, dstHintTrackReferenceTrack); } } 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);#if 0 MP4SetHintTrackSdp( dstFile, dstTrackId, MP4GetHintTrackSdp(srcFile, srcTrackId));#endif } return dstTrackId;}// Given a track, make an encrypted clone of it in the dest. fileextern "C" MP4TrackId MP4EncAndCloneTrack(MP4FileHandle srcFile, MP4TrackId srcTrackId, mp4v2_ismacrypParams *icPp, MP4FileHandle dstFile, MP4TrackId dstHintTrackReferenceTrack ){ 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), icPp, MP4GetTrackEsdsObjectTypeId(srcFile, srcTrackId) ); } else if (MP4_IS_AUDIO_TRACK_TYPE(trackType)) { MP4SetAudioProfileLevel(dstFile, MP4GetAudioProfileLevel(srcFile)); dstTrackId = MP4AddEncAudioTrack(dstFile, MP4GetTrackTimeScale(srcFile, srcTrackId), MP4GetTrackFixedSampleDuration(srcFile, srcTrackId), icPp, 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)) { if (dstHintTrackReferenceTrack == MP4_INVALID_TRACK_ID) { dstTrackId = MP4_INVALID_TRACK_ID; } else { 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); } // Bill's change to MP4CloneTrack 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); #if 0 MP4SetHintTrackSdp( dstFile, dstTrackId, MP4GetHintTrackSdp(srcFile, srcTrackId));#endif } return dstTrackId;}extern "C" MP4TrackId MP4CopyTrack(MP4FileHandle srcFile, MP4TrackId srcTrackId, MP4FileHandle dstFile, bool applyEdits, MP4TrackId dstHintTrackReferenceTrack){ bool copySamples = true; // LATER allow false => reference samples MP4TrackId dstTrackId = MP4CloneTrack(srcFile, srcTrackId, dstFile, dstHintTrackReferenceTrack); 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, mp4v2_ismacrypParams *icPp, encryptFunc_t encfcnp, u_int32_t encfcnparam1, MP4FileHandle dstFile, bool applyEdits, MP4TrackId dstHintTrackReferenceTrack ){ bool copySamples = true; // LATER allow false => reference samples MP4TrackId dstTrackId = MP4EncAndCloneTrack(srcFile, srcTrackId, icPp, dstFile, dstHintTrackReferenceTrack); 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) { // encrypt and copy rc = MP4EncAndCopySample(srcFile, srcTrackId, sampleId, encfcnp, encfcnparam1, dstFile, dstTrackId, sampleDuration); } else { // not sure what these are - encrypt? 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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -