Я новичок в DirectShow. Я, как и многие другие, пытаюсь создать решение для потоковой передачи P2P на основе сокетов для карточной игры на основе WPF. Я хочу, чтобы каждый игрок мог видеть друг друга через маленькие видеоокна.
Мои вопросы двоякие. Во-первых, как снизить частоту дискретизации кадров и разрешение? Я считаю, что 320x200 x 15-20 кадров в секунду должно быть достаточно. Я использую обратный вызов SampleGrabber для захвата данных кадра и отправки их через сокет; который на самом деле работает без сжатия при разрешении 640x480.
Мой второй вопрос заключается в том, что, поскольку каждый кадр содержит 921 600 байт, это действительно увязает, и я получаю очень медленный рендеринг только через мою локальную сеть, подключенную к Wi-Fi. Я добавил простое сжатие MJPEG (желая позже переключиться на h.264) и заметил, что байты упали примерно до 330-360 КБ. Не плохое улучшение.
На принимающей стороне Нужно ли мне создавать пользовательский пин-код источника DirectShow, чтобы обслуживать байты, полученные из сокета, чтобы я мог подключить декодер и отображать байты в окне?
Я просто хотел сначала спросить об этом, так как кажется, что нужно много работать, чтобы создать новый COM-объект (не делал этого примерно 15 лет!), зарегистрировать его и использовать/отладить.
Возможно, есть другой способ?
Кроме того, если это путь, я должен использовать SampleGrabber на принимающей стороне и создать BitmapSource из распакованных байтов, или я должен позволить DirectShow создать дочернее окно? Дело в том, что я хочу иметь более одного другого игрока, и я устанавливаю дополнительный байт в сокете, чтобы указать, в какой позиции таблицы они находятся. Как я могу отображать каждую позицию по очереди?