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 hilfreich, 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) Hinweis: Diese Strukturen sind gleichwertig. |
MFInitMediaTypeFromAMMediaType |
BITMAPINFOHEADER- | MFCreateVideoMediaTypeFromBitMapInfoHeaderEx |
MFVIDEOFORMAT- | MFInitMediaTypeFromMFVideoFormat |
MPEG1VIDEOINFO | MFInitMediaTypeFromMPEG1VideoInfo |
MPEG2VIDEOINFO | MFInitMediaTypeFromMPEG2VideoInfo |
VIDEOINFOHEADER2 | MFInitMediaTypeFromVideoInfoHeader2 |
VIDEOINFOHEADER- | MFInitMediaTypeFromVideoInfoHeader |
WAVEFORMATEX oder WAVEFORMATEXTENSIBLE | MFInitMediaTypeFromWaveFormatEx |
Von einem Media Foundation-Typ zu einer Formatstruktur
Die folgenden Funktionen erstellen oder initialisieren eine Formatstruktur aus einem Media Foundation-Medientyp.
Formatzuordnungen
In den folgenden Tabellen sind die Media Foundation-Attribute 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 zur Referenz bereitgestellt.
AM_MEDIA_TYPE
Mitglied | Attribut |
---|---|
bTemporalCompression | MF_MT_ALL_SAMPLES_INDEPENDENT |
bFixedSizeSamples | MF_MT_FIXED_SIZE_SAMPLES |
lSampleSize | MF_MT_SAMPLE_SIZE |
WAVEFORMATEX, WAVEFORMATEXTENSIBLE
Mitglied | Attribut |
---|---|
wFormatTag- |
MF_MT_SUBTYPE Wenn wFormatTag- WAVE_FORMAT_EXTENSIBLE ist, befindet sich der Untertyp im SubFormat Member. |
nChannels- | MF_MT_AUDIO_NUM_CHANNELS |
nSamplesPerSec- | MF_MT_AUDIO_SAMPLES_PER_SECOND |
nAvgBytesPerSec- | MF_MT_AUDIO_AVG_BYTES_PER_SECOND |
nBlockAlign- | MF_MT_AUDIO_BLOCK_ALIGNMENT |
wBitsPerSample- | MF_MT_AUDIO_BITS_PER_SAMPLE |
wValidBitsPerSample- | MF_MT_AUDIO_VALID_BITS_PER_SAMPLE |
wSamplesPerBlock- | MF_MT_AUDIO_SAMPLES_PER_BLOCK |
dwChannelMask | MF_MT_AUDIO_CHANNEL_MASK |
SubFormat- | MF_MT_SUBTYPE |
Zusätzliche Daten | MF_MT_USER_DATA |
VIDEOINFOHEADER, VIDEOINFOHEADER2
Mitglied | Attribut |
---|---|
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_MODE |
dwCopyProtectFlags | Keine definierte Entsprechung |
dwPictAspectRatioX, dwPictAspectRatioY | MF_MT_PIXEL_ASPECT_RATIO; muss vom Seitenverhältnis des Bilds in das Seitenverhältnis des Bilds konvertiert werden. |
dwControlFlags- | MF_MT_PAD_CONTROL_FLAGS. Wenn das AMCONTROL_COLORINFO_PRESENT Flag vorhanden ist, legen Sie die erweiterten Farbattribute fest, die in erweiterten Farbinformationenbeschrieben 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_SAMPLE_SIZE |
Paletteninformationen | MF_MT_PALETTE |
Die folgenden Attribute können vom VIDEOINFOHEADER- oder VIDEOINFOHEADER2 Struktur abgeleitet werden, erfordern aber auch einige Kenntnisse der Formatdetails. Beispielsweise weisen unterschiedliche YUV-Formate unterschiedliche Stride-Anforderungen auf.
MPEG1VIDEOINFO
Mitglied | Attribut |
---|---|
dwStartTimeCode- | MF_MT_MPEG_START_TIME_CODE |
bSequenceHeader | MF_MT_MPEG_SEQUENCE_HEADER |
biXPelsPerMeter, biYPelsPerMeter | MF_MT_PIXEL_ASPECT_RATIO |
MPEG2VIDEOINFO
Mitglied | Attribut |
---|---|
dwStartTimeCode- | MF_MT_MPEG_START_TIME_CODE |
dwSequenceHeader | MF_MT_MPEG_SEQUENCE_HEADER |
dwProfile- | MF_MT_MPEG2_PROFILE |
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 gehen. Es kann jedoch hilfreich sein, wenn sie beispielsweise 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;
}
Verwandte Themen