Using IAMStreamSelect To Select a Specific Audio Stream From an MPEG File With Multiple Audio Streams

The IAMStreamSelect is a Direct Show interface for selecting which streams are played and retrieving information about them. An example of logical stream selection would be selecting a particular language (English, German, or French for example) from a set of audio streams that encode different national languages.

To use IAMStreamSelect to select a specific audio stream from an MPEG file with multiple audio streams, perform the following steps:

1.

Create an instance of ltmmPlay class:

C Source

IltmmPlay* pPlay;
CoCreateInstance(&CLSID_ltmmPlay, NULL, CLSCTX_INPROC_SERVER, &IID_IltmmPlay, (void**) &pPlay);

C++ Source

IltmmPlay* pPlay;
CoCreateInstance(&CLSID_ltmmPlay, NULL, CLSCTX_INPROC_SERVER, &IID_IltmmPlay, (void**) &pPlay);

2.

Set the source file:

C Source

BSTR bstr; 

// create a string containing the source file path
bstr = SysAllocString(L"C:\\MultipleAudio.mpg"); 

// assign the source file path to the play object
IltmmPlay__put_SourceFile(pPlay,  bstr); 

// free the string
SysFreeString(bstr);

C++ Source

BSTR bstr; 

// create a string containing the source file path
bstr = SysAllocString(L"C:\\MultipleAudio.mpg");

// assign the source file path to the play object
pPlay->put_SourceFile(bstr); 

// free the string
SysFreeString(bstr);

3.

The IAMStreamSelect is usually exposed by the file splitter (Demultiplexer), so you need to get a pointer to the splitter object:

C Source

IUnknown* pSplitter;
IltmmPlay_GetSubObject (pPlay ,ltmmPlay_Object_Splitter, & pSplitter);

C++ Source

IUnknown* pSplitter;
pPlay->GetSubObject (ltmmPlay_Object_Splitter, & pSplitter);

4.

Query for the IAMStreamSelect interface:

C Source

IAMStreamSelect *pStreamSel = NULL;
IUnknown_QueryInterface(pSplitter, &IID_IAMStreamSelect, (void**)& pStreamSel);
IUnknown_Release(pSplitter);

C++ Source

IAMStreamSelect *pStreamSel = NULL;
pSplitter->QueryInterface(&IID_IAMStreamSelect, (void**)&pStreamSel);
pSplitter->Release();

5.

Use the IAMStreamSelect interface to select one of the available audio streams in the file:

C Source

// retrieve the number of available streams in the file
DWORD dwCount;
int nIndex;
BOOL bAudio = FALSE;
BOOL bEnable = FALSE;
   AM_MEDIA_TYPE *pmt;
   DWORD dwFlags;
   LCID lcid;
   DWORD dwGroup;
   WCHAR *pszName;
   IUnknown *pObject;
   IUnknown *pUnk;
IAMStreamSelect_Count(pStreamSel , &dwCount);
for( nIndex = 0; nIndex<dwCount; nIndex++ )
{
   // get information about the stream, and decide if this is an audio stream and you want to enable it:
   IAMStreamSelect_Info(pStreamSel , nIndex, &pmt, &dwFlags, &lcid, &dwGroup, &pzsName, &pObject, &pUnk);
   
   // based on your selection criterion
   if( bAudio && bEnable )
      IAMStreamSelect_Enable(pStreamSel, nIndex, AMSTREAMSELECTENABLE_ENABLE);
}
IUnknown_Release(pStreamSel);

C++ Source

// retrieve the number of available streams in the file
DWORD dwCount;
int nIndex;
BOOL bAudio = FALSE;
BOOL bEnable = FALSE;
   AM_MEDIA_TYPE *pmt;
   DWORD dwFlags;
   LCID lcid;
   DWORD dwGroup;
   WCHAR *pszName;
   IUnknown *pObject;
   IUnknown *pUnk;
   
pStreamSel->Count(&dwCount);
for( nIndex = 0; nIndex<dwCount; nIndex++ )
{
      // get information about the stream, and decide if this is an audio stream and you want to enable it:
      pStreamSel->Info(nIndex, &pmt, &dwFlags, &lcid, &dwGroup, &pzsName, &pObject, &pUnk);
      
// based on your selection criterion
      if( bAudio && bEnable )
         pStreamSel->Enable(nIndex,       AMSTREAMSELECTENABLE_ENABLE);
}
pStreamSel->Release();

6.

Play the file:

C Source

IltmmPlay_Run (pPlay);

C++ Source

pPlay->Run ();