Сведения о типах медиа (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, который определяет формат более точно. Например, в основном типе видео существуют подтипы RGB-24, RGB-32, UYVY и т. д. В аудиоформатах присутствуют PCM, MPEG-1 и другие. Подтип предоставляет больше сведений, чем основной тип, но он не определяет все о формате. Например, подтипы видео не определяют размер изображения или частоту кадров. Форматный блок, описанный ниже, определяет их.
блок форматирования: блок форматирования — это блок данных, описывающий формат подробно. Блок форматирования выделяется отдельно от структуры AM_MEDIA_TYPE. Элемент pbFormat структуры AM_MEDIA_TYPE указывает на блок форматирования.
Элемент pbFormat вводится void*, так как макет блока форматирования изменяется в зависимости от типа носителя. Например, звук PCM использует структуру WAVEFORMATEX. Видео использует различные структуры, включая VIDEOINFOHEADER и VIDEOINFOHEADER2. Тип формата элемент структуры 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, это означает, что все кадры являются ключевыми кадрами.
Связанные разделы