Сведения о типах мультимедиа (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, это означает, что все кадры являются ключевыми.

Граф фильтра и его компоненты