Поделиться через


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

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