Преобразования типов мультимедиа
Иногда требуется преобразовать типы мультимедиа Media Foundation и старые структуры типов мультимедиа из DirectShow или пакета SDK для формата Windows Media.
Из структуры форматирования в тип Media Foundation
Следующие функции инициализируют тип мультимедиа Media Foundation из структуры формата. Эти функции также полезны, если поток данных или заголовок файла содержит структуру формата. Например, заголовок файла для звуковых файлов WAVE содержит структуру WAVEFORMATEX .
Преобразуемая структура | Функция |
---|---|
AM_MEDIA_TYPE (DirectShow) DMO_MEDIA_TYPE (объекты мультимедиа DirectX) WM_MEDIA_TYPE (пакет SDK для формата Windows Media) Примечание: Эти структуры эквивалентны. |
MFInitMediaTypeFromAMMediaType |
BITMAPINFOHEADER | MFCreateVideoMediaTypeFromBitMapInfoHeaderEx |
MFVIDEOFORMAT | MFInitMediaTypeFromMFVideoFormat |
MPEG1VIDEOINFO | MFInitMediaTypeFromMPEG1VideoInfo |
MPEG2VIDEOINFO | MFInitMediaTypeFromMPEG2VideoInfo |
VIDEOINFOHEADER2 | MFInitMediaTypeFromVideoInfoHeader2 |
VIDEOINFOHEADER | MFInitMediaTypeFromVideoInfoHeader |
WAVEFORMATEX ИЛИ WAVEFORMATEXTENSIBLE | MFInitMediaTypeFromWaveFormatEx |
От типа Media Foundation до структуры форматирования
Следующие функции создают или инициализируют структуру формата из типа мультимедиа Media Foundation.
Сопоставления форматов
В следующих таблицах перечислены атрибуты Media Foundation, соответствующие различным структурам формата. Не все эти атрибуты можно преобразовать напрямую. Для выполнения преобразований следует использовать функции, перечисленные в предыдущем разделе; Эти таблицы предоставляются в основном для справки.
AM_MEDIA_TYPE
Член | attribute |
---|---|
bTemporalCompression | MF_MT_ALL_SAMPLES_INDEPENDENT |
bFixedSizeSamples | MF_MT_FIXED_SIZE_SAMPLES |
lSampleSize | MF_MT_SAMPLE_SIZE |
WAVEFORMATEX, WAVEFORMATEXTENSIBLE
Член | attribute |
---|---|
wFormatTag |
MF_MT_SUBTYPE Если wFormatTag WAVE_FORMAT_EXTENSIBLE, подтип находится в элементе SubFormat . |
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 |
Дополнительные данные | MF_MT_USER_DATA |
VIDEOINFOHEADER, VIDEOINFOHEADER2
Член | attribute |
---|---|
dwBitRate | MF_MT_AVG_BITRATE |
dwBitErrorRate | MF_MT_AVG_BIT_ERROR_RATE |
AvgTimePerFrame | MF_MT_FRAME_RATE; Используйте MFAverageTimePerFrameToFrameRate для вычисления этого значения. |
dwInterlaceFlags | MF_MT_INTERLACE_MODE |
dwCopyProtectFlags | Нет определенного эквивалента |
dwPictAspectRatioX, dwPictAspectRatioY | MF_MT_PIXEL_ASPECT_RATIO; должен преобразовывать пропорции изображения в пропорции изображения. |
dwControlFlags | MF_MT_PAD_CONTROL_FLAGS. Если флаг AMCONTROL_COLORINFO_PRESENT присутствует, задайте расширенные атрибуты цвета, описанные в разделе Расширенные сведения о цвете. |
bmiHeader.biWidth, bmiHeader.biHeight | MF_MT_FRAME_SIZE |
bmiHeader.biBitCount | Неявно в подтипе (MF_MT_SUBTYPE). |
bmiHeader.biCompression | Неявно в подтипе. |
bmiHeader.biSizeImage | MF_MT_SAMPLE_SIZE |
Сведения о палитре | MF_MT_PALETTE |
Следующие атрибуты могут быть выведены из структуры VIDEOINFOHEADER или VIDEOINFOHEADER2 , но также требуют некоторых знаний о форматировании. Например, разные форматы YUV имеют разные требования к шагу.
MPEG1VIDEOINFO
Член | attribute |
---|---|
dwStartTimeCode | MF_MT_MPEG_START_TIME_CODE |
bSequenceHeader | MF_MT_MPEG_SEQUENCE_HEADER |
biXPelsPerMeter, biYPelsPerMeter | MF_MT_PIXEL_ASPECT_RATIO |
MPEG2VIDEOINFO
Член | attribute |
---|---|
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 |
Примеры
Следующий код заполняет структуру BITMAPINFOHEADER из типа видеофайла. Обратите внимание, что при этом преобразования теряются некоторые сведения о формате (переплетение, частота кадров, расширенные данные цвета). Однако это может быть полезно, например, при сохранении растрового изображения из видеокадра.
#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;
}
Связанные темы