Поведение DirectShow SmartTee в Windows 8

Что я пытаюсь сделать

Я пытаюсь создать пример приложения для потоковой передачи с USB-камеры (более или менее похожего на стриптиз-версию amcap) с использованием инфраструктуры DirectShow на языке VC++ с использованием VS2008. Ниже приведена информация о графике фильтра, которую я использую для построения.

График фильтра

Веб-камера (Pin Capture) - Smart Tee (Preview Pin) - Преобразование фильтра, преобразование монохромного Y8 в YUY2 - Рендеринг микширования видео.

Дополнительная информация

  • Потоки веб-камеры с разрешением 640x480, Y8 @ 30FPS.
  • Протестировано на Windows 7 Professional, Intel i3 - Работает хорошо, умеет передавать потоковое видео VGA @ 30FPS.
  • В фильтре захвата видео отсутствует предварительный вывод.

вопрос

С той же настройкой графа фильтра я столкнулся с проблемой на Windows 8 Intel i3 PC. Но если я заменю фильтр Smart Tee на образец Infinte Tee, предоставленный в Microsoft SDK, он будет работать хорошо. Почему в Windows 8 не работает фильтр Smart Tee?

РЕДАКТИРОВАТЬ: Проблема в том, что я не могу подключить фильтр захвата видео к фильтру Smart Tee в Windows 8, но могу подключиться в Windows 7. Я попытался с помощью инструмента graphedit. Windows 8 пытается сформировать следующий график для подтипа медиа Y8 (YUY2 работает правильно).

Веб-камера (Pin Capture) - Преобразование фильтра, преобразовывающего монохромный Y8 в YUY2 - Smart Tee (Preview Pin) - Рендеринг микширования видео.

И когда я запускаю график, graphedit закрывается за исключением.

Если я не регистрирую фильтр преобразования, я получаю эту ошибку при подключении фильтра захвата с помощью смарт-тройника. "Эти фильтры не могут согласовать соединение. Проверьте совместимость типов входных и выходных контактов. Не удалось найти комбинацию промежуточного фильтра для подключения. (Код возврата = 0x80040217) '.

Кроме того, если я использую фильтр Infinte tee, через каждые несколько минут снижается частота кадров. В чем разница между фильтром Smart Tee в Windows 7 и Windows 8? Что можно использовать как альтернативу умной футболке?

Заранее спасибо за помощь.

2 ответа

Решение

Маловероятно, что Smart Tee Filter не очень хорош - он практически не отличается от такового в Windows 7. Вместо этого вероятным местом для проблемы является драйвер камеры и формат Y8 в частности. Я искал бы проблемы в этом типе носителя, которые вызывают проблемы с подключением ИЛИ вы можете выбрать более популярный формат, такой как YUY2/YV12 через IAMStreamConfig::SetFormat или через страницу свойств ИЛИ рассматриваемый формат Y8 чередуется и определяется VIDOINFOHEADER2 который не поддерживается тройником. Или вам может потребоваться обновление драйвера для оборудования камеры.

Проблема снижения скорости с Inf Tee Filter снова предполагает, что вам нужно проверить драйвер камеры.

Smart Tee vs. Infinite Pin Tee

Оба являются сплиттерами, и это типичный вопрос, когда есть проблема с одним, тогда, если действительно возможно заменить его другим.

Оба фильтра реализуют довольно простую задачу, и оба фильтра специально реализуют свой трюк. Фильтр Smart Tee удаляет временные метки, чтобы преобразовать прямую трансляцию в хорошую для предварительного просмотра. В целях захвата довольно часто вы не заботитесь о задержке, пока целостность потока не нарушена и кадры хороши относительно друг друга. Для целей презентации у вас обычно есть метки времени, сопоставляемые с часами, и вам не нужен их при предварительном просмотре в реальном времени, потому что все, что вам нужно, это отображать кадр как можно скорее, как только он у вас есть. Это то место, где применима Smart Tee, и это никуда не годится.

Напротив, фильтр Infinite Pin Tee дублирует входную подачу без изменений. поэтому он не делает то, что вы ожидаете от просмотра видео в реальном времени, и замена одного фильтра другим напрямую не выполняет ожидаемую работу. Фильтр даже не способен копировать / дублировать данные и по этой причине он разделяет распределитель памяти между своими выходными выводами, что потенциально создает ряд проблем. Все же это делает дублирующую работу и добавляет минимальные накладные расходы.

Кроме того, Inf Pin Tee-подобный фильтр доступен в исходном коде как пример Windows SDK. \Samples\multimedia\directshow\filters\inftee,

Быстрая и грязная замена фильтра Smart Tee с фильтром Inf Pin Tee выглядит следующим образом:

Capture -> Inf Tee -> Образец Grabber -> ...

Где Sample Grabber установлен для вызова SampleCB туда, где ваш обратный вызов удалит метки времени из видеокадров. Таким образом, вы можете заменить один тройник на другой для предварительного просмотра.

Надеюсь, теперь все ясно, как я определил свой фильтр преобразования Y8. И я проверяю в моем фильтре преобразования для VIDEOINFOHEADER, а не VIDEOINFOHEADER2.

 DEFINE_GUID(MEDIASUBTYPE_Y8, 
 0x20203859, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71);

// Media Types
const AMOVIESETUP_MEDIATYPE sudInputPinTypes[] =   
{ 
    {
        &MEDIATYPE_Video,
        &MEDIASUBTYPE_Y8
    }
};
const AMOVIESETUP_MEDIATYPE sudOutptuPinTypes[] =   
{ 
    {
        &MEDIATYPE_Video, 
        &MEDIASUBTYPE_YUY2
    }
};

// Pins
const AMOVIESETUP_PIN psudPins[] = 
{ 
    { 
        L"Input", 
        FALSE,
        FALSE, 
        FALSE, 
        FALSE, 
        &CLSID_NULL, 
        NULL,
        1, 
        sudInputPinTypes
    }, 
    { 
        L"Output", 
        FALSE, 
        TRUE, 
        FALSE, 
        FALSE, 
        &CLSID_NULL,
        NULL, 
        1, 
        sudOutptuPinTypes
    } 
};   

// Filters
const AMOVIESETUP_FILTER sudGrayScaleFilter =
{
    &CLSID_GrayScaleTransformFilter,        // Filter CLSID
    GRAYSCALE_FILTER_NAME,                  // String name
    MERIT_UNLIKELY,                         // Filter merit
    2,                                      // Number of pins
    psudPins                                // Pin information
};                   

// Templates
CFactoryTemplate g_Templates[]=
{
    { 
        GRAYSCALE_FILTER_NAME, 
        &CLSID_GrayScaleTransformFilter,
        CGrayScaleFilter::CreateInstance, 
        NULL, 
        &sudGrayScaleFilter
    }
};

Дайте мне знать, нужна ли вам дополнительная информация, чтобы помочь мне:-)

Спасибо.

Другие вопросы по тегам