у меня есть DirectShow Видео рендер восстановлен с CBaseVideoRenderer
, Средство визуализации используется в графике, который получает данные из живого источника (BDA). Похоже, что соединения установлены правильно, но рендеринг видео немедленно заканчивается, потому что нет образца. Тем не менее, аудио рендеринг работает, то есть я могу слышать звук во время DoRenderSample
моего рендерера никогда не называется.
Проходя по коду в отладчике, я обнаружил, что в CBaseRenderer::StartStreaming
, поток заканчивается немедленно, потому что член m_pMediaSample
является NULL
, Если я заменю мой рендерер на рендерер EVR, он показывает кадры, то есть поток не заканчивается перед первым кадром для рендерера EVR, а только для моего рендерера.
Почему это и как я могу это исправить? Я реализовал (по образцу http://www.codeproject.com/Articles/152317/DirectShow-Filters-Development-Part-Video-Render) что я понимаю под базовым интерфейсом (CheckMediaType
, SetMediaType
а также DoRenderSample
), поэтому я не вижу возможности повлиять на то, что здесь происходит …
Редактировать: Это график, как видно из ROT:
То, что я в основном пытаюсь сделать, это захват потока DVB, который использует VIDEOINFOHEADER2
, что не поддерживается стандартным образцом граббер. Хотя этот канал является общедоступным немецким телеканалом без шифрования, может ли это быть проблемой DRM?
Изменить 2: Я прикрепил мой рендерер к другому источнику (шаттл Blackmagic Intensity). Похоже, что источник вызывает проблему, потому что я получаю образцы на другом графике.
Изменить 3: Следуя предложению Романа, я создал фильтр преобразования. График выглядит так
к сожалению, та же проблема, то есть я не получаю образец (Transform
не называется).
Похоже, ваш декодер или разветвитель не демодулирует видеокадры. Посмотрите дальше по цепочке, чтобы увидеть, какие фильтры снабжают ваш вывод рендера данными, скорее всего, это единственное распознающее аудио.
Попробуйте перенести файл в Graphedit (кстати, лучше в Интернете) и посмотрите, какие фильтры он создает.
Затем посмотрите на образцы в DirectShow SDK.
Возможно, вы выбрали неверный путь извлечения видеокадров из медиа-конвейера. Таким образом, вы реализуете «сетевой рендер», который завершает конвейер для дальнейшей отправки данных в сеть.
Рендер, который принимает канал, звучит уместно. Реализация пользовательского рендерера, однако, является нетипичной задачей, и тогда об этом не так много информации. Кроме того, полнофункциональный рендерер, как правило, снабжен образцом планирования, который завершает доставку потока — вещи относительно легко сломать, когда вы настраиваете его через наследование от базовых классов. То есть, хотя подход звучит хорошо, вы можете сравнить его с другим вариантом, который у вас есть, который …
Комбинация Sample Grabber + Null Renderer, двух стандартных фильтров, к которым вы можете прикрепить свой обратный вызов и получить кадры с правильно завершенным конвейером. Проблема здесь в том, что стандартный Sample Grabber не поддерживает VIDEOINFOHEADER2
, С другим видео декодером вы могли бы иметь информацию о декодированной ленте VIDEOINFOHEADER
, который является одним из вариантов. А затем улучшение самого Sample Grabber — еще одно решение: Дополнительные возможности DirectX SDK, февраль 2005 г. (dxsdk_feb2005_extras.exe) был SDK, который включал фильтр, похожий на стандартный образец Grabber под названием Grabber \DirectShow\Samples\C++\DirectShow\Filters\Grabber
, Он / был доступен в исходном коде и снабжен хорошим текстовым файлом описания. Это относительно легко расширить, чтобы позволить ему принять VIDEOINFOHEADER2
и таким образом сделайте данные полезной нагрузки доступными для вашего приложения.
Самый простой способ получить данные из графика DirectShow, если вы не собираетесь использовать
MultiMedia Streaming, вероятно, написать свой собственный фильтр TransInPlace, подмножество
фильтра преобразования. Затем подключите этот фильтр к нужному потоку данных, который вы хотите
отслеживать, а затем запускать, приостанавливать, искать или иным образом контролировать график. Данные, как это проходит
через фильтр преобразования, можно манипулировать, как вы хотите. Мы называем этот вид
фильтр, «образец граббер». Microsoft выпустила образец граббера с ограниченной функциональностью
с DX8.0. Этот фильтр ограничен, потому что он не работает с данными DV или типами данных.
с форматом VideoInfo2. Это не позволяет пользователю получать предварительно проверенные образцы.
(Что такое предварительный образец? См. Документацию по DX8.1). В режиме «OneShot» также есть некоторые проблемы.
Чтобы добавить к этому, пример Grabber сам по себе довольно прост — возможно, 1000 строк кода вместе, включая комментарии.