Lässt sich ziemlich einfach selber programmieren wenn du einen MP3 Codec und das DirectShow 9 SDK (Software Development Kit) installiert hast.
Zuerst enumerierst du alle verfügbaren Codes....
HRESULT hr;
IMoniker* pMoniker = NULL;
ICreateDevEnum* pSysDevEnum = NULL;
IEnumMoniker* pEnum = NULL;
// System Device Enumerator
hr = ::CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**) &pSysDevEnum);
if (S_OK != hr)
{
// Error
return FALSE;
}
// Moniker Enumerator
hr = pSysDevEnum->CreateClassEnumerator ([COLOR=red]CLSID_AudioCompressorCategory[/COLOR], &pEnum, 0);
if (S_OK != hr)
{
// Error
pSysDevEnum->Release ();
return FALSE;
}
if (NULL == pEnum)
{
return FALSE;
}
// Cycle throught IMoniker collection
while (S_OK == pEnum->Next (1, &pMoniker, NULL))
{
// New instance of CDSCodec
CDSCodec *pCodec = new CDSCodec ();
pCodec->m_pMoniker = pMoniker;
// Retrieve codec name
IPropertyBag *pPropertyBag = NULL;
hr = pMoniker->BindToStorage(NULL, NULL, IID_IPropertyBag, (void**) &pPropertyBag);
if (SUCCEEDED(hr))
{
VARIANT var;
VariantInit (&var);
pPropertyBag->Read (L"FriendlyName", &var, NULL);
CString szTempName (var.bstrVal);
pCodec->m_szCodecName = szTempName;
VariantClear (&var);
// Add new instance to collection
Add (pCodec);
pCodec->BuildCodecFormatArray ();
}
else
{
delete pCodec;
}
}
pEnum->Release ();
pSysDevEnum->Release ();
Alles anzeigen
Und dann musst du nur von den Codecs die unterstützten Formate enumerieren....
(Tipp: Anstelle der Audio Codecs kannst du auch die Video Codecs enumerieren)
HRESULT hr;
IBaseFilter *pBaseFilter = NULL;
// Retrieve the IBaseFilter
hr = m_pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**) &pBaseFilter);
if (FAILED(hr)) {
// ERROR HERE
return;
}
// Enumerate Pin
IEnumPins *pEnumPins = NULL;
hr = pBaseFilter->EnumPins(&pEnumPins);
if (FAILED(hr)) {
// ERROR HERE
pBaseFilter->Release();
return;
}
// Find the output Pin
IPin *pPin = NULL;
while (S_OK == pEnumPins->Next (1, &pPin, 0))
{
PIN_DIRECTION direction;
pPin->QueryDirection (&direction);
//if (direction == PINDIR_OUTPUT)
{
// Retrieve the IAMStreamConfig
IAMStreamConfig *pStreamConfig = NULL;
hr = pPin->QueryInterface(IID_IAMStreamConfig, (void**) &pStreamConfig);
if (SUCCEEDED(hr)) {
int nCount = 0, nSize = 0;
pStreamConfig->GetNumberOfCapabilities(&nCount, &nSize);
for (int i=0; i<nCount; i++) {
AM_MEDIA_TYPE* pMediaType = NULL;
AUDIO_STREAM_CONFIG_CAPS confCaps;
hr = pStreamConfig->GetStreamCaps(i, &pMediaType, (BYTE*)&confCaps);
if (SUCCEEDED(hr)) {
CDSCodecFormat *pCodecFormat = new CDSCodecFormat();
pCodecFormat->m_pMediaType = pMediaType;
Add(pCodecFormat);
}
}
pStreamConfig->Release();
}
}
pPin->Release();
}
pEnumPins->Release();
pBaseFilter->Release();
Alles anzeigen
Passenden Codec und Format auswählen, die einen Render Graph erzeugen und RenderFile aufrufen.
Fertig!