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