Festlegen des Gruppenmedientyps
[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]
[Diese API wird nicht unterstützt und kann in Zukunft geändert oder nicht mehr verfügbar sein.]
Alle Gruppen müssen einen unkomprimierten Medientyp definieren, entweder Audio oder Video. Der unkomprimierte Medientyp ist das Format, das die Betrachter während der Wiedergabe sehen oder hören. In der Regel erfolgt die endgültige Ausgabe in einem komprimierten Format. Weitere Informationen finden Sie unter Rendern eines Projekts.
Um das unkomprimierte Format festzulegen, erstellen Sie eine AM_MEDIA_TYPE-Struktur , und füllen Sie sie mit dem entsprechenden Haupttyp, Untertyp und Formatheader aus. Weisen Sie für Videos eine VIDEOINFOHEADER-Struktur für den Formatblock zu, und legen Sie die Breite, Höhe und Bittiefe fest. Ordnen Sie für Audio eine WAVEFORMATEX-Struktur für den Formatblock zu, und legen Sie die Abtastrate, die Bittiefe und die Anzahl der Kanäle fest. Wenn Sie nur den Haupttyp festlegen, stellt DES vernünftige Standardwerte für die anderen Werte bereit. In der Praxis sollten Sie die Werte explizit festlegen, um die Ausgabe zu steuern.
Nachdem Sie die Medientypstruktur initialisiert haben, rufen Sie die IAMTimelineGroup::SetMediaType-Methode auf, um den Medientyp für die Gruppe festzulegen.
Im folgenden Beispiel wird 16-Bit-RGB-Video mit einer Breite von 320 Pixeln und einer Höhe von 240 Pixel angegeben:
AM_MEDIA_TYPE mtGroup;
mtGroup.majortype = MEDIATYPE_Video;
mtGroup.subtype = MEDIASUBTYPE_RGB555;
// Set format headers.
mtGroup.pbFormat = (BYTE*)CoTaskMemAlloc(sizeof(VIDEOINFOHEADER));
if (mtGroup.pbFormat == NULL)
{
return E_OUTOFMEMORY;
}
VIDEOINFOHEADER *pVideoHeader = (VIDEOINFOHEADER*)mtGroup.pbFormat;
ZeroMemory(pVideoHeader, sizeof(VIDEOINFOHEADER));
pVideoHeader->bmiHeader.biBitCount = 16;
pVideoHeader->bmiHeader.biWidth = 320;
pVideoHeader->bmiHeader.biHeight = 240;
pVideoHeader->bmiHeader.biPlanes = 1;
pVideoHeader->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pVideoHeader->bmiHeader.biSizeImage = DIBSIZE(pVideoHeader->bmiHeader);
// Set the format type and size.
mtGroup.formattype = FORMAT_VideoInfo;
mtGroup.cbFormat = sizeof(VIDEOINFOHEADER);
// Set the sample size.
mtGroup.bFixedSizeSamples = TRUE;
mtGroup.lSampleSize = DIBSIZE(pVideoHeader->bmiHeader);
// Now use this media type for the group.
pGroup->SetMediaType(&mtGroup);
// Clean up.
CoTaskMemFree(mtGroup.pbFormat);
Im nächsten Beispiel wird eine Audiogruppe angegeben, indem der Gruppenmedientyp auf 16-Bit-Stereo festgelegt wird, 44100 Beispiele pro Sekunde:
AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = MEDIATYPE_Audio;
mt.subtype = MEDIASUBTYPE_PCM;
mt.formattype = FORMAT_WaveFormatEx;
// Set format block.
mt.pbFormat = (BYTE*)CoTaskMemAlloc(sizeof(WAVEFORMATEX));
if (mt.pbFormat == NULL)
{
return E_OUTOFMEMORY;
}
mt.cbFormat = sizeof(WAVEFORMATEX);
// Fill in the WAVEFORMATEX structure.
WAVEFORMATEX *wave = (WAVEFORMATEX*) mt.pbFormat;
wave->wFormatTag = WAVE_FORMAT_PCM;
wave->nChannels = 2; // Stereo
wave->nSamplesPerSec = 44100;
wave->wBitsPerSample = 16;
wave->nBlockAlign = wave->nChannels * wave->wBitsPerSample/8;
wave->nAvgBytesPerSec = wave->nSamplesPerSec * wave->nBlockAlign;
wave->cbSize = 0;
hr = pGroup->SetMediaType(&mt);
CoTaskMemFree(mt.pbFormat);
Sie können auch die CMediaType-Klasse in den DirectShow-Basisklassen verwenden, um Medientypen zu verwalten. Es enthält einige nützliche Hilfsmethoden und gibt den Formatblock automatisch frei.
Zugehörige Themen