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


Возможности видео

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

Метод IAMStreamConfig::GetStreamCaps представляет возможности видео в массиве пар структур AM_MEDIA_TYPE и VIDEO_STREAM_CONFIG_CAPS . Его можно использовать для предоставления всех форматов и разрешений, поддерживаемых контактом, как описано ниже.

Примеры GetStreamCaps, связанные со звуком, см. в разделе Возможности звука.

Предположим, что ваш карта записи поддерживает формат JPEG при всех разрешениях от 160 x 120 до 320 x 240 пикселей включительно. Разница между поддерживаемыми разрешениями в этом случае составляет один, так как вы добавляете или вычитаете один пиксель из каждого поддерживаемого разрешения, чтобы получить следующее поддерживаемого разрешения. Это различие в поддерживаемых разрешениях называется степенью детализации.

Предположим, карта также поддерживает размер 640 x 480. Ниже показано одно разрешение и указанный выше диапазон разрешений (все размеры от 160 x 120 до 320 x 240 пикселей).

разрешение от 160 x 120 до 320 x 240 пикселей плюс 640 x 480 пикселей

Кроме того, предположим, что он поддерживает 24-разрядный цветной RGB-формат с разрешениями от 160 x 120 до 320 x 240, но с степенью детализации 8. На следующем рисунке показаны некоторые допустимые размеры в этом случае.

разрешение от 160 x 120 до 320 до 240 с степенью детализации = 8

Иными словами, и перечисление дополнительных разрешений, все ниже приведены в списке допустимых разрешений.

  • 160 x 120
  • 168 x 120
  • 168 x 128
  • 176 x 128
  • 176 x 136
  • ... дополнительные разрешения ...
  • 312 x 232
  • 320 x 240

Используйте GetStreamCaps для предоставления этих возможностей цветового формата и измерения, предлагая тип мультимедиа 320 x 240 JPEG (если это ваш размер по умолчанию или предпочтительный размер) в сочетании с минимальными возможностями 160 x 120, максимальными возможностями 320 x 240 и степенью детализации 1. Следующая пара, которую вы предоставляете с помощью GetStreamCaps , — это тип мультимедиа 640 x 480 JPEG в сочетании с минимумом 640 x 480 и максимальным значением 640 x 480 и степенью детализации 0. Третья пара включает тип мультимедиа 320 x 240, 24-разрядный RGB с минимальными возможностями 160 x 120, максимальные возможности 320 x 240 и степень детализации 8. Таким образом, вы можете опубликовать практически все форматы и возможности, поддерживаемые карта. Приложение, которое должно знать, какие форматы сжатия вы предоставляете, может получить все пары и составить список всех уникальных подтипов типов мультимедиа.

Фильтр получает исходные и целевые прямоугольники типа носителя из элементов rcSource и rcTarget структуры VIDEOINFOHEADER соответственно. Фильтры не должны поддерживать исходные и целевые прямоугольники.

Прямоугольник обрезки, описанный в документации по IAMStreamConfig, совпадает с прямоугольником rcSource структуры VIDEOINFOHEADER для выходного контакта.

Выходной прямоугольник, описанный в документации по IAMStreamConfig , совпадает с элементами biWidth и biHeight структуры BITMAPINFOHEADER выходного контакта (см. раздел Dv Data in the AVI File Format.).

Если выходной контакт фильтра подключен к типу мультимедиа с непустыми прямоугольниками источника и целевого объекта, фильтр должен растянуть подрезку исходного формата входных данных в целевую подрезку формата вывода. Подпроект источника хранится в элементе InputSizeструктуры VIDEO_STREAM_CONFIG_CAPS.

Например, рассмотрим следующий сценарий видеокомпрессора: входное изображение имеет формат RGB и размер 160 x 120 пикселей. Верхний левый угол исходного прямоугольника находится в координате (20,20), а правый нижний угол — в (30,30). Выходное изображение в формате MPEG размером 320 x 240. Левый верхний угол целевого прямоугольника находится в (0,0), а правый нижний угол — в (100 100). В этом случае фильтр должен принимать 10 x 10 частей исходного растрового изображения RGB 160 x 120 и заполнять его верхней областью 100 x 100 растрового изображения 320 x 240, оставляя остальную часть растрового изображения 320 x 240 нетронутыми. На следующем рисунке показан этот сценарий.

растяжение подрезки

Фильтр может не поддерживать эту функцию и может не подключиться к типу мультимедиа, где rcSource и rcTarget не пусты.

Структура VIDEOINFOHEADER предоставляет сведения о возможностях фильтрации скорости передачи данных. Например, предположим, что вы подключили выходной контакт к следующему фильтру с определенным типом мультимедиа (напрямую или с помощью типа мультимедиа, переданного функцией CMediaType::SetFormat ). Просмотрите элемент dwBitRate структуры формата VIDEOINFOHEADER этого типа мультимедиа, чтобы узнать, в какую скорость данных следует сжать видео. Если умножить количество единиц времени на кадр в элементе AvgTimePerFrame структуры VIDEOINFOHEADER на скорость данных в элементе dwBitRate и разделить на 10 000 000 (количество единиц в секунду), можно выяснить, сколько байтов должно быть для каждого кадра. Можно создать кадр меньшего размера, но никогда не больший. Чтобы определить частоту кадров для видеокомпрессора или фильтра захвата, используйте AvgTimePerFrame из типа носителя выходного контакта.