Как визуализировать байтовый массив из сокета / приложения, используя DirectShow? - PullRequest
0 голосов
/ 27 июня 2011

У меня есть приложение. У меня будет ситуация, когда я получу большой массив закодированных байтов. Я должен расшифровать их и отрендерить. Для декодирования я использую пользовательский класс декодера. После декодирования, как я могу построить граф DirectShow, который будет получать входные данные от декодера? Пожалуйста, дайте некоторые направления / образцы по этому вопросу.

1 Ответ

2 голосов
/ 27 июня 2011

Посмотрите пример PushSource в DirectShow SDK. В этом примере показано, как создать исходный фильтр, который можно визуализировать. Все дело в том, чтобы правильно настроить тип выходного носителя вашего фильтра, чтобы можно было визуализировать остальную часть графика. В примере также показано, как передать образцы мультимедиа в остальную часть конвейера мультимедиа. В вашем случае, что вы декодируете? Пример PushSource выводит RGB24 IIRC.

Кроме того, похоже, что вы декодируете в том же фильтре, что и принимаемые байты? Обычно в DirectShow вы пишете фильтр источника, который может принимать байты из сети и выводить выборки в закодированном формате. Затем вы должны подключить этот фильтр к настраиваемому фильтру декодера, который затем выводит либо RGB24, либо какой-либо формат необработанного мультимедиа, понятный DirectShow. Аналогично для аудио, вы можете вывести, скажем, PCM.

Edit: Я использовал тот же подход (CSource, CSourceStream). Это верно, DoBufferProcessingLoop вызывает FillBuffer. Мой общий подход состоял в том, чтобы использовать шаблон производитель-потребитель. Поток сетевого чтения заполняет очередь примерами, и в моем переопределенном DoBufferProcessingLoop я проверяю, есть ли в очереди какие-либо данные, вызывая FillBuffer, если есть данные. Конечно, вы можете попробовать другие методы, такие как ожидание событий (доступность кадра). Чтобы увидеть подход, который я использовал, вы можете скачать исходный код примера исходного фильтра RTSP по адресу http://sourceforge.net/projects/videoprocessing/ и посмотреть, подходит ли вам это. Лучшее, что я могу сказать, - это просто пробовать что-то и учиться на ходу.

...