This example shows how to convert only one chapter in a DVD title and how to enable DVD subtitles during conversion when you use the DVD Source object.
// This function will select one chapter in a specified title
void SelectChapter(IltmmDVDTitle *pTitle, int nChapterIndex)
{
long nCount, i;
IltmmDVDTitle_get_ChapterCount(pTitle, &nCount);
for(i = 0; i < nCount; i++)
{
IltmmDVDChapter *pChapter;
if(IltmmDVDTitle_GetChapter(pTitle, i, &pChapter) == S_OK)
{
IltmmDVDChapter_put_Selected(pChapter, i == nChapterIndex ? VARIANT_TRUE : VARIANT_FALSE);
IltmmDVDChapter_Release(pChapter);
}
}
}
/*
This function will select the main title for conversion.
Within the main title, it will select only the second chapter.
It will also select the first subtitle stream.
*/
void SelectOneChapterAndSubtitles(IltmmConvert *pConvert)
{
IUnknown *punk;
IltmmDVDSource* pDVDSource;
// Get the DVD source interface
IltmmConvert_GetSubObject(pConvert, ltmmConvert_Object_SourceFilter, &punk);
if (punk)
{
IUnknown_QueryInterface(punk, &IID_IltmmDVDSource, (void**)&pDVDSource);
if (pDVDSource)
{
IltmmDVDTitle *pTitle;
long lCount, i;
long lVal;
// Select the main title
IltmmDVDSource_put_Selected(pDVDSource, ltmmDVDSource_Main_Selected);
// We now need to select one chapter and enable subtitles for this title.
// For that, we will loop through the titles and find out which one was selected above.
// Get the title count in the disc.
IltmmDVDSource_get_TitleCount(pDVDSource, &lCount);
for (i = 0; i < lCount; i++)
{
// Get the title interface
IltmmDVDSource_GetTitle(pDVDSource, i, &pTitle);
if (pTitle)
{
long bSelected;
IltmmDVDTitle_get_Selected(pTitle, &bSelected);
if(bSelected)
{
// we found the main title
// (Optional step). We will convert only one chapter to speed up the conversion.
// We will select the 2nd chapte, because the first chapter will sometimes have movie credits and little dialogue
// Chapters are 0-based, so the second chapter has index 1
SelectChapter(pTitle, 1);
// Get the subpicture stream count
IltmmDVDTitle_get_SubpictureStreamCount(pTitle, &lVal);
if(lVal > 0)
// Select the first subpicture stream
IltmmDVDTitle_put_SelectedSubpictureStream(pTitle, 0);
}
IltmmDVDTitle_Release(pTitle);
}
}
IltmmDVDSource_Release(pDVDSource);
}
IUnknown_Release(punk);
}
}
#define LEAD_MPEG2_ENCODER L"@device:sw:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\\LEAD MPEG2 Encoder (3.0)"
#define LEAD_MPEG_AUDIO_ENCODER L"@device:sw:{33D9A761-90C8-11D0-BD43-00A0C911CE86}\\LEAD MPEG Audio Encoder (2.0)"
// select a certain encoder
void SelectCompressor(IltmmCompressors *pCompressors, LPCWSTR pszCompressorName)
{
long index;
BSTR bstrCompressorName = SysAllocString(pszCompressorName);
IltmmCompressors_Find(pCompressors, bstrCompressorName, &index);
IltmmCompressors_put_Selection(pCompressors, index);
SysFreeString(bstrCompressorName);
}
// convert one chapter with subtitles (close captioning)
HRESULT ConvertOneChapterWithSubtitles()
{
IltmmConvert *pConvert;
IltmmCompressors *pCompressors;
HRESULT hr = CoCreateInstance(&CLSID_ltmmConvert, NULL, CLSCTX_INPROC_SERVER, &IID_IltmmConvert, (void**) &pConvert);
if(FAILED(hr))
return hr;
// use the DVD source for greater control over the DVD conversion process
IltmmConvert_put_UseDVDSource(pConvert, VARIANT_TRUE);
// set the source, compressors and target format
IltmmConvert_put_SourceFile(pConvert, L"e:\\video_ts\\video_ts.ifo");
IltmmConvert_put_TargetFormat(pConvert, ltmmConvert_TargetFormat_MPEG2_PROGRAM);
// select the mpeg2 encoder
IltmmConvert_get_VideoCompressors(pConvert, &pCompressors);
SelectCompressor(pCompressors, LEAD_MPEG2_ENCODER);
IltmmCompressors_Release(pCompressors);
// select the mpeg audio encoder
IltmmConvert_get_AudioCompressors(pConvert, &pCompressors);
SelectCompressor(pCompressors, LEAD_MPEG_AUDIO_ENCODER);
IltmmCompressors_Release(pCompressors);
IltmmConvert_put_TargetFile(pConvert, L"c:\\i\\1.mpg");
// this function is the interesting part of the example
SelectOneChapterAndSubtitles(pConvert);
hr = IltmmConvert_StartConvert(pConvert);
// wait for conversion to finish... Not very elegant, but we want to keep the example simple
MessageBox(NULL, TEXT("Wait to finish"), TEXT("wait"), MB_OK);
IltmmConvert_Release(pConvert);
return hr;
}
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.