Сведения о типах мультимедиа (DirectShow)
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]
Так как DirectShow является модульным, ему требуется способ описания формата данных в каждой точке графа фильтра. Например, рассмотрим воспроизведение AVI. Данные поступают в граф в виде потока блоков RIFF. Они анализируются в видео- и аудиопотоки. Видеопоток состоит из видеокадров, которые, вероятно, сжаты. После декодирования видеопоток представляет собой серию несжатых растровых изображений. Аудиопоток проходит через аналогичный процесс.
Типы мультимедиа: как DirectShow представляет форматы
Тип мультимедиа — это универсальный и расширяемый способ описания форматов цифровых мультимедиа. Когда два фильтра подключаются, они согласовывают тип мультимедиа. Тип носителя определяет тип данных, которые фильтр вышестоящий доставляет нижестоящему фильтру, а также физический макет данных. Если два фильтра не могут согласовать тип мультимедиа, они не будут подключаться.
Для некоторых приложений вам никогда не придется беспокоиться о типах мультимедиа. Например, при воспроизведении файлов DirectShow обрабатывает все сведения. Другим типам приложений может потребоваться работать непосредственно с типами мультимедиа.
Типы мультимедиа определяются с помощью структуры AM_MEDIA_TYPE . Эта структура содержит следующие сведения:
Основной тип. Основной тип — это GUID, определяющий общую категорию данных. К основным типам относятся видео, аудио, поток байтов без анализа, данные MIDI и т. д.
Подтип. Подтип является другим ИДЕНТИФИКАТОРом GUID, который дополнительно определяет формат. Например, в основном типе video существуют подтипы RGB-24, RGB-32, UYVY и т. д. В звуке есть звук PCM, полезные данные MPEG-1 и другие. Подтип предоставляет больше сведений, чем основной тип, но он не определяет весь формат. Например, подтипы видео не определяют размер изображения или частоту кадров. Они определяются блоком форматирования, описанным ниже.
Блок форматирования. Блок форматирования — это блок данных, подробно описывающий формат. Блок формата выделяется отдельно от структуры AM_MEDIA_TYPE . Элемент pbFormat структуры AM_MEDIA_TYPE указывает на блок форматирования.
Элемент pbFormat имеет тип void* , так как макет блока форматирования изменяется в зависимости от типа носителя. Например, звук PCM использует структуру WAVEFORMATEX . Видео использует различные структуры, включая VIDEOINFOHEADER и VIDEOINFOHEADER2. Элемент formattype структуры AM_MEDIA_TYPE — это GUID, указывающий, какая структура содержится в блоке форматирования. Каждой структуре формата назначается GUID. Элемент cbFormat указывает размер блока форматирования. Всегда проверка эти значения перед разыменовыванием указателя pbFormat.
Если блок форматирования заполнен, то основной тип и подтип содержат избыточные сведения. Однако основной тип и подтип предоставляют удобный способ идентификации форматов без полного блока форматирования. Например, можно указать универсальный 24-разрядный формат RGB (MEDIASUBTYPE_RGB24), не зная всех сведений, необходимых для структуры VIDEOINFOHEADER , таких как размер изображения и частота кадров.
Например, фильтр может использовать следующий код для проверка типа носителя:
HRESULT CheckMediaType(AM_MEDIA_TYPE *pmt)
{
if (pmt == NULL) return E_POINTER;
// Check the major type. We're looking for video.
if (pmt->majortype != MEDIATYPE_Video)
{
return VFW_E_INVALIDMEDIATYPE;
}
// Check the subtype. We're looking for 24-bit RGB.
if (pmt->subtype != MEDIASUBTYPE_RGB24)
{
return VFW_E_INVALIDMEDIATYPE;
}
// Check the format type and the size of the format block.
if ((pmt->formattype == FORMAT_VideoInfo) &&
(pmt->cbFormat >= sizeof(VIDEOINFOHEADER) &&
(pmt->pbFormat != NULL))
{
// Now it's safe to coerce the format block pointer to the
// correct structure, as defined by the formattype GUID.
VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
// Examine pVIH (not shown). If it looks OK, return S_OK.
return S_OK;
}
return VFW_E_INVALIDMEDIATYPE;
}
Структура AM_MEDIA_TYPE также содержит некоторые необязательные поля. Их можно использовать для предоставления дополнительных сведений, но фильтры не требуются для их использования:
- lSampleSize. Если это поле не равно нулю, оно определяет размер каждой выборки. Если значение равно нулю, это означает, что размер выборки может измениться с выборки на выборку.
- bFixedSizeSamples. Если этот логический флаг имеет значение TRUE, это означает, что значение в lSampleSize является допустимым. В противном случае следует игнорировать lSampleSize.
- bTemporalCompression. Если этот логический флаг имеет значение FALSE, это означает, что все кадры являются ключевыми.
Связанные темы