LPOLESTR T2OLE(LPCTSTR lpt){static OLECHAR lpw[512];if(!lpt)return NULL;lpw[0] = L'\0';MultiByteToWideChar(CP_ACP, 0, lpt, -1, lpw, 512);return lpw;}void PrepareSampleAndTarget(IltmmConvert* pSourceConvert, char pszSourceFile[256], char mtType[40], IltmmSampleTarget** ppSampleTarget, IltmmMultiStreamSource* pVideoAndAudioSource, long lStream){IltmmMediaTypeDisp *pInsertedMeidaType;IltmmMediaTypeDisp *pmt;BSTR bstrSourceFile;HRESULT hr;BSTR bstrType;bstrSourceFile = T2OLE(pszSourceFile);IltmmConvert_put_SourceFile(pSourceConvert, bstrSourceFile);SysFreeString(bstrSourceFile);hr = CoCreateInstance(&CLSID_ltmmSampleTarget, NULL, CLSCTX_INPROC_SERVER, &IID_IltmmSampleTarget, (void**) ppSampleTarget);if(FAILED(hr)){return;}hr = CoCreateInstance(&CLSID_ltmmMediaType, NULL, CLSCTX_INPROC_SERVER, &IID_IltmmMediaTypeDisp, (void**) &pmt);if(FAILED(hr)){return;}// create a ltmmMediaType and indicate the accepted typebstrType = T2OLE(mtType);IltmmMediaTypeDisp_put_Type(pmt, bstrType);SysFreeString(bstrType);// make the SampleTarget object accept connections of this media typehr = IltmmSampleTarget_SetAcceptedMediaType(*ppSampleTarget, pmt);IltmmMediaTypeDisp_Release(pmt);pmt = NULL;// set the output target object to be sample targetIltmmConvert_put_TargetObject(pSourceConvert, *ppSampleTarget);// start the conversion, so I know the exact media typeIltmmConvert_StartConvert(pSourceConvert);// set the media type for the source stream to be the same as the media type in the input file (video or audio)IltmmSampleTarget_GetConnectedMediaType(*ppSampleTarget, &pmt);IltmmMultiStreamSource_SetMediaType(pVideoAndAudioSource, lStream, pmt);// check set sucess:IltmmMultiStreamSource_GetMediaType(pVideoAndAudioSource, lStream, &pInsertedMeidaType);if (pInsertedMeidaType)IltmmMediaTypeDisp_Release(pInsertedMeidaType);}void CopySamples(IltmmConvert* pSourceCtrl, IltmmSampleTarget* pSampleTarget, IltmmMultiStreamSource *pVideoAndAudioSource, long lStream){IltmmMediaSampleDisp* pmsSrc = NULL;IltmmMediaSampleDisp* pmsDst = NULL;long lStartTimeHi;long lStartTimeLo;long lStopTimeHi;long lStopTimeLo;HRESULT hr;VARIANT vBuffer;long lActualDataLength;VARIANT_BOOL vBool;for ( ; ; ){hr = IltmmSampleTarget_GetSample(pSampleTarget, 3000, &pmsSrc);if (!pmsSrc)break;// get a source samplehr = IltmmMultiStreamSource_GetSampleBuffer(pVideoAndAudioSource, lStream, 2000, &pmsDst);// copy the data to the source samplehr = IltmmMediaSampleDisp_get_Buffer(pmsSrc, &vBuffer);hr = IltmmMediaSampleDisp_get_ActualDataLength(pmsSrc, &lActualDataLength);hr = IltmmMediaSampleDisp_SetData(pmsDst, lActualDataLength, vBuffer);// copy the sample timeIltmmMediaSampleDisp_GetTime(pmsSrc, &lStartTimeHi, &lStartTimeLo, &lStopTimeHi, &lStopTimeLo);IltmmMediaSampleDisp_SetTime(pmsDst, lStartTimeHi, lStartTimeLo, lStopTimeHi, lStopTimeLo);// copy the other flagsIltmmMediaSampleDisp_get_Discontinuity(pmsSrc, &vBool);IltmmMediaSampleDisp_put_Discontinuity(pmsDst, vBool);IltmmMediaSampleDisp_get_Preroll(pmsSrc, &vBool);IltmmMediaSampleDisp_put_Preroll(pmsDst, vBool);IltmmMediaSampleDisp_get_SyncPoint(pmsSrc, &vBool);IltmmMediaSampleDisp_put_SyncPoint(pmsDst, vBool);//release the source sampleIltmmMediaSampleDisp_Release(pmsSrc);pmsSrc = NULL;// deliver the source sampleIltmmMultiStreamSource_DeliverSample(pVideoAndAudioSource, lStream, 2000, pmsDst);// release the source sampleIltmmMediaSampleDisp_Release(pmsDst);pmsDst = NULL;}// stop the conversion in the source controlIltmmConvert_StopConvert(pSourceCtrl);// deliver end of stream for the current source streamhr = IltmmMultiStreamSource_DeliverEndOfStream(pVideoAndAudioSource, lStream, 5000);}int ReplaceAudiousingIltmmMultiStreamSourceandIltmmMultiStreamTarget_Example ( ){IltmmConvert* pVideoConvert;IltmmConvert* pAudioConvert;IltmmConvert* pDestConvert;HRESULT hr;IltmmSampleTarget* pVideoTarget = NULL;IltmmSampleTarget* pAudioTarget = NULL;IltmmMultiStreamSource *pVideoAndAudioSource = NULL;BSTR bstr;long lState;pVideoConvert = NULL;pAudioConvert = NULL;pDestConvert = NULL;CoInitialize(NULL);hr = CoCreateInstance(&CLSID_ltmmConvert, NULL, CLSCTX_INPROC_SERVER, &IID_IltmmConvert, (void**) &pVideoConvert);if(FAILED(hr)){MessageBox(0, "Can't instantiate convert library", "Error", 0);return -1;}hr = CoCreateInstance(&CLSID_ltmmConvert, NULL, CLSCTX_INPROC_SERVER, &IID_IltmmConvert, (void**) &pAudioConvert);if(FAILED(hr)){MessageBox(0, "Can't instantiate convert library", "Error", 0);return -1;}hr = CoCreateInstance(&CLSID_ltmmConvert, NULL, CLSCTX_INPROC_SERVER, &IID_IltmmConvert, (void**) &pDestConvert);if(FAILED(hr)){MessageBox(0, "Can't instantiate convert library", "Error", 0);return -1;}hr = CoCreateInstance(&CLSID_ltmmMultiStreamSource, NULL, CLSCTX_INPROC_SERVER, &IID_IltmmMultiStreamSource, (void**) &pVideoAndAudioSource);if(FAILED(hr)){MessageBox(0, "Can't instantiate convert library", "Error", 0);return -1;}IltmmMultiStreamSource_put_StreamCount(pVideoAndAudioSource, 2);/*Prepare pVideoConvert and set its source file to VideoFile.Convert only the video streamCreate a new pVideoTarget object and set as the sample target object in pVideoConvertSet the stream media type for pin 0 of VideoAndAudioSource to be the same as the video media typeAlso starts the conversion in pVideoConvert*/PrepareSampleAndTarget(pVideoConvert, "c:\\Video.avi", (char*)ltmmMEDIATYPE_Video, &pVideoTarget, pVideoAndAudioSource, 0);/*Prepare AudioCtrl and set its source file to AudioFile.Convert only the audio streamCreate a new AudioTarget object and set as the sample target object in AudioCtrlSet the stream media type for pin 1 of VideoAndAudioSource to be the same as the audio media typeAlso starts the conversion in AudioCtrl*/PrepareSampleAndTarget(pAudioConvert, "C:\\Voice.wav", (char*)ltmmMEDIATYPE_Audio, &pAudioTarget, pVideoAndAudioSource, 1);// prepare the destination fileIltmmConvert_put_SourceObject(pDestConvert, pVideoAndAudioSource);IltmmConvert_put_TargetFormat(pDestConvert, ltmmConvert_TargetFormat_Avi);bstr = T2OLE("C:\\Video_And_Voice.avi");IltmmConvert_put_TargetFile(pDestConvert, bstr);SysFreeString(bstr);IltmmConvert_StartConvert(pDestConvert);// Copy all the video samples from the Video file to the destination fileCopySamples(pVideoConvert, pVideoTarget, pVideoAndAudioSource, 0);// Copy all the audio samples from the Audio file to the destination fileCopySamples(pAudioConvert, pAudioTarget, pVideoAndAudioSource, 1);// wait for the destination control to stop the conversionIltmmConvert_get_State(pDestConvert, &lState);if( lState == ltmmConvert_State_Running ){IltmmConvert_StopConvert(pDestConvert);}IltmmConvert_ResetSource(pDestConvert);if (pVideoConvert){IltmmConvert_Release(pVideoConvert);pVideoConvert = NULL;}if (pAudioConvert){IltmmConvert_Release(pAudioConvert);pAudioConvert = NULL;}if (pDestConvert){IltmmConvert_Release(pDestConvert);pDestConvert = NULL;}if (pVideoAndAudioSource){IltmmMultiStreamSource_Release(pVideoAndAudioSource);pVideoAndAudioSource = NULL;}CoUninitialize();return 0;}
Help Collections
Raster .NET | C API | C++ Class Library | HTML5 JavaScript
Document .NET | C API | C++ Class Library | HTML5 JavaScript
Medical .NET | C API | C++ Class Library | HTML5 JavaScript
Medical Web Viewer .NET
Multimedia
Direct Show .NET | C API | Filters
Media Foundation .NET | C API | Transforms
Supported Platforms
.NET, Java, Android, and iOS/macOS Assemblies
Imaging, Medical, and Document
C API/C++ Class Libraries
Imaging, Medical, and Document
HTML5 JavaScript Libraries
Imaging, Medical, and Document
