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 type
bstrType = T2OLE(mtType);
IltmmMediaTypeDisp_put_Type(pmt, bstrType);
SysFreeString(bstrType);
// make the SampleTarget object accept connections of this media type
hr = IltmmSampleTarget_SetAcceptedMediaType(*ppSampleTarget, pmt);
IltmmMediaTypeDisp_Release(pmt);
pmt = NULL;
// set the output target object to be sample target
IltmmConvert_put_TargetObject(pSourceConvert, *ppSampleTarget);
// start the conversion, so I know the exact media type
IltmmConvert_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 sample
hr = IltmmMultiStreamSource_GetSampleBuffer(pVideoAndAudioSource, lStream, 2000, &pmsDst);
// copy the data to the source sample
hr = IltmmMediaSampleDisp_get_Buffer(pmsSrc, &vBuffer);
hr = IltmmMediaSampleDisp_get_ActualDataLength(pmsSrc, &lActualDataLength);
hr = IltmmMediaSampleDisp_SetData(pmsDst, lActualDataLength, vBuffer);
// copy the sample time
IltmmMediaSampleDisp_GetTime(pmsSrc, &lStartTimeHi, &lStartTimeLo, &lStopTimeHi, &lStopTimeLo);
IltmmMediaSampleDisp_SetTime(pmsDst, lStartTimeHi, lStartTimeLo, lStopTimeHi, lStopTimeLo);
// copy the other flags
IltmmMediaSampleDisp_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 sample
IltmmMediaSampleDisp_Release(pmsSrc);
pmsSrc = NULL;
// deliver the source sample
IltmmMultiStreamSource_DeliverSample(pVideoAndAudioSource, lStream, 2000, pmsDst);
// release the source sample
IltmmMediaSampleDisp_Release(pmsDst);
pmsDst = NULL;
}
// stop the conversion in the source control
IltmmConvert_StopConvert(pSourceCtrl);
// deliver end of stream for the current source stream
hr = 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 stream
Create a new pVideoTarget object and set as the sample target object in pVideoConvert
Set the stream media type for pin 0 of VideoAndAudioSource to be the same as the video media type
Also 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 stream
Create a new AudioTarget object and set as the sample target object in AudioCtrl
Set the stream media type for pin 1 of VideoAndAudioSource to be the same as the audio media type
Also starts the conversion in AudioCtrl
*/
PrepareSampleAndTarget(pAudioConvert, "C:\\Voice.wav", (char*)ltmmMEDIATYPE_Audio, &pAudioTarget, pVideoAndAudioSource, 1);
// prepare the destination file
IltmmConvert_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 file
CopySamples(pVideoConvert, pVideoTarget, pVideoAndAudioSource, 0);
// Copy all the audio samples from the Audio file to the destination file
CopySamples(pAudioConvert, pAudioTarget, pVideoAndAudioSource, 1);
// wait for the destination control to stop the conversion
IltmmConvert_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
Your email has been sent to support! Someone should be in touch! If your matter is urgent please come back into chat.
Chat Hours:
Monday - Friday, 8:30am to 6pm ET
Thank you for your feedback!
Please fill out the form again to start a new chat.
All agents are currently offline.
Chat Hours:
Monday - Friday
8:30AM - 6PM EST
To contact us please fill out this form and we will contact you via email.