Medientypkonvertierungen
Gelegentlich ist es erforderlich, zwischen Media Foundation Medientypen und den älteren Medientypstrukturen aus DirectShow oder dem Windows Media Format SDK zu konvertieren.
Von einer Formatstruktur zu einem Media Foundation Typ
Die folgenden Funktionen initialisieren einen Media Foundation Medientyp aus einer Formatstruktur. Diese Funktionen sind auch nützlich, wenn ein Datenstrom oder ein Dateiheader eine Formatstruktur enthält. Beispielsweise enthält der Dateiheader für WAVE-Audiodateien eine WAVEFORMATEX-Struktur.
| Zu konvertierende Struktur | Funktion |
|---|---|
| AM_MEDIA_TYPE (DirectShow) DMO_MEDIA_TYPE (DirectX-Medienobjekte) WM_MEDIA_TYPE (Windows Media Format SDK) [!Note] |
MFInitMediaTypeFromAMMediaType |
| BITMAPINFOHEADER | MFCreateVideoMediaTypeFromBitMapInfoHeaderEx |
| MFVIDEOFORMAT | MFInitMediaTypeFromMFVideoFormat |
| MPEG1VIDEOINFO | MFInitMediaTypeFromMPEG1VideoInfo |
| MPEG2VIDEOINFO | MFInitMediaTypeFromMPEG2VideoInfo |
| VIDEOINFOHEADER2 | MFInitMediaTypeFromVideoInfoHeader2 |
| VIDEOINFOHEADER | MFInitMediaTypeFromVideoInfoHeader |
| WAVEFORMATEX oder WAVEFORMATEXTENSIBLE | MFInitMediaTypeFromWaveFormatEx |
Von einem Media Foundation zu einer Formatstruktur
Die folgenden Funktionen erstellen oder initialisieren eine Formatstruktur aus einem Media Foundation Medientyps.
Formatzuordnungen
In den folgenden Tabellen sind die Media Foundation aufgeführt, die verschiedenen Formatstrukturen entsprechen. Nicht alle diese Attribute können direkt übersetzt werden. Um Konvertierungen durchzuführen, sollten Sie die im vorherigen Abschnitt aufgeführten Funktionen verwenden. diese Tabellen werden hauptsächlich als Referenz bereitgestellt.
_ _ AM-MEDIENTYP
| Member | attribute |
|---|---|
| bTemporalCompression | MF _ MT _ ALL _ SAMPLES _ INDEPENDENT |
| bFixedSizeSamples | BEISPIELE FÜR MF _ MT _ MIT FESTER _ _ GRÖßE |
| lSampleSize | MF _ _ MT-STICHPROBENGRÖßE _ |
WAVEFORMATEX, WAVEFORMATEXTENSIBLE
| Member | attribute |
|---|---|
| wFormatTag | MF _ _ MT-UNTERTYP Wenn wFormatTag WAVE _ FORMAT _ EXTENSIBLE ist, befindet sich der Untertyp im SubFormat-Member. |
| nChannels | MF _ MT AUDIO _ _ _ NUM-KANÄLE |
| nSamplesPerSec | MF _ _ MT-AUDIOBEISPIELE _ _ PRO _ SEKUNDE |
| nAvgBytesPerSec | MF _ MT _ AUDIO _ AVG _ BYTES _ PER _ SECOND |
| nBlockAlign | MF MT AUDIO BLOCK ALIGNMENT (MF _ _ MT-AUDIOBLOCKAUSRICHTUNG) _ _ |
| wBitsPerSample | MF _ _ MT-AUDIOBITS _ _ PRO _ BEISPIEL |
| wValidBitsPerSample | GÜLTIGE MF _ _ MT-AUDIOBITS _ _ PRO _ _ BEISPIEL |
| wSamplesPerBlock | MF _ _ MT-AUDIOBEISPIELE _ _ PRO _ BLOCK |
| dwChannelMask | MF _ MT _ AUDIO _ CHANNEL _ MASK |
| SubFormat | MF _ _ MT-UNTERTYP |
| Zusätzliche Daten | MF _ _ MT-BENUTZERDATEN _ |
VIDEOINFOHEADER, VIDEOINFOHEADER2
| Member | attribute |
|---|---|
| dwBitRate | MF _ MT _ AVG _ BITRATE |
| dwBitErrorRate | MF _ MT _ AVG _ BIT _ ERROR _ RATE |
| AvgTimePerFrame | MF _ MT _ FRAME _ RATE;Verwenden Sie MFAverageTimePerFrameToFrameRate, um diesen Wert zu berechnen. |
| dwInterlaceFlags | MF _ MT _ INTERLACE-MODUS _ |
| dwCopyProtectFlags | Keine definierte Entsprechung |
| dwPictAspectRatioX, dwPictAspectRatioY | MF _ MT _ PIXEL _ ASPECT _ RATIO;muss das Bild-Seitenverhältnis in das Bild-Seitenverhältnis konvertieren. |
| dwControlFlags | MF _ MT _ _ PAD-STEUERELEMENTFLAGS _. Wenn das FLAG AMCONTROL _ COLORINFO _ PRESENT vorhanden ist, legen Sie die erweiterten Farbattribute fest, die unter Erweiterte Farbinformationen beschrieben werden. |
| bmiHeader.biWidth, bmiHeader.biHeight | MF _ MT _ FRAME _ SIZE |
| bmiHeader.biBitCount | Implizit im Untertyp (MF _ MT _ SUBTYPE). |
| bmiHeader.biCompression | Implizit im Untertyp. |
| bmiHeader.biSizeImage | MF _ _ MT-STICHPROBENGRÖßE _ |
| Paletteninformationen | MF _ MT _ PALETTE |
Die folgenden Attribute können aus der VIDEOINFOHEADER- oder VIDEOINFOHEADER2-Struktur abgeleitet werden, erfordern jedoch auch kenntnisse der Formatdetails. Beispielsweise haben verschiedene YUV-Formate unterschiedliche Anforderungen.
MPEG1VIDEOINFO
| Member | attribute |
|---|---|
| dwStartTimeCode | MF _ MT _ MPEG _ START _ TIME _ CODE |
| bSequenceHeader | MF _ MT _ MPEG _ SEQUENCE _ HEADER |
| biXPelsPerMeter, biYPelsPerMeter | MF _ MT PIXEL _ _ _ SEITENVERHÄLTNIS |
MPEG2VIDEOINFO
| Member | attribute |
|---|---|
| dwStartTimeCode | MF _ MT _ MPEG _ START _ TIME _ CODE |
| dwSequenceHeader | MF _ MT _ MPEG _ SEQUENCE _ HEADER |
| dwProfile | MF _ MT _ _ MPEG2-PROFIL |
| dwLevel | MF _ MT _ MPEG2 _ LEVEL |
| dwFlags | MF _ MT _ _ MPEG2-FLAGS |
Beispiele
Der folgende Code füllt eine BITMAPINFOHEADER-Struktur aus einem Videomedientyp aus. Beachten Sie, dass bei diesen Konvertierungen einige der Formatinformationen (Interlacing, Framerate, erweiterte Farbdaten) verloren geht. Dies kann jedoch hilfreich sein, wenn Sie z. B. eine Bitmap aus einem Videoframe speichern.
#include <dshow.h>
#include <dvdmedia.h>
// Converts a video type to a BITMAPINFO structure.
// The caller must free the structure by calling CoTaskMemFree.
// Note that this conversion loses some format information, including
// interlacing, and frame rate.
HRESULT GetBitmapInfoHeaderFromMFMediaType(
IMFMediaType *pType, // Pointer to the media type.
BITMAPINFOHEADER **ppBmih, // Receives a pointer to the structure.
DWORD *pcbSize) // Receives the size of the structure.
{
*ppBmih = NULL;
*pcbSize = 0;
GUID majorType = GUID_NULL;
AM_MEDIA_TYPE *pmt = NULL;
DWORD cbSize = 0;
DWORD cbOffset = 0;
BITMAPINFOHEADER *pBMIH = NULL;
// Verify that this is a video type.
HRESULT hr = pType->GetMajorType(&majorType);
if (FAILED(hr))
{
goto done;
}
if (majorType != MFMediaType_Video)
{
hr = MF_E_INVALIDMEDIATYPE;
goto done;
}
hr = pType->GetRepresentation(AM_MEDIA_TYPE_REPRESENTATION, (void**)&pmt);
if (FAILED(hr))
{
goto done;
}
if (pmt->formattype == FORMAT_VideoInfo)
{
cbOffset = (FIELD_OFFSET(VIDEOINFOHEADER,bmiHeader));
}
else if (pmt->formattype == FORMAT_VideoInfo2)
{
cbOffset = (FIELD_OFFSET(VIDEOINFOHEADER2,bmiHeader));
}
else
{
hr = MF_E_INVALIDMEDIATYPE; // Unsupported format type.
goto done;
}
if (pmt->cbFormat - cbOffset < sizeof(BITMAPINFOHEADER))
{
hr = E_UNEXPECTED; // Bad format size.
goto done;
}
cbSize = pmt->cbFormat - cbOffset;
pBMIH = (BITMAPINFOHEADER*)CoTaskMemAlloc(cbSize);
if (pBMIH == NULL)
{
hr = E_OUTOFMEMORY;
goto done;
}
CopyMemory(pBMIH, pmt->pbFormat + cbOffset, cbSize);
*ppBmih = pBMIH;
*pcbSize = cbSize;
done:
if (pmt)
{
pType->FreeRepresentation(AM_MEDIA_TYPE_REPRESENTATION, pmt);
}
return hr;
}