потоковое видео в и из нескольких источников - PullRequest
5 голосов
/ 14 января 2010

Я хотел бы получить некоторые идеи о том, как некоторые из вас подойдут к этой проблеме. У меня есть робот, который работает под управлением Linux и использует веб-камеру (с драйвером v4l2) в качестве одного из своих датчиков. Я написал панель управления с помощью gtkmm. И сервер, и клиент написаны на C ++. Сервер - это робот, клиент - это «панель управления». На роботе выполняется анализ изображения, и я хотел бы передать видео с камеры на панель управления по двум причинам: А) для прикола Б) наложить результаты анализа изображения

Итак, мой вопрос: каковы хорошие способы для потоковой передачи видео с веб-камеры на панель управления, а также для того, чтобы отдать приоритет коду робота для его обработки? Я не заинтересован в том, чтобы написать свою собственную схему сжатия видео и пропустить ее через существующий сетевой порт. Я думаю, что лучше всего использовать новый сетевой порт (выделенный для видеоданных). Вторая часть проблемы заключается в том, как я могу отобразить видео в gtkmm? Видеоданные поступают асинхронно, и я не могу контролировать main () в gtkmm, поэтому я думаю, что это будет сложно.

Я открыт для использования таких вещей, как vlc, gstreamer или любых других общих библиотек сжатия, о которых я не знаю.

спасибо!

EDIT: Робот оснащен процессором с тактовой частотой 1 ГГц, работает под управлением настольной версии Linux, но не X11.

Ответы [ 3 ]

2 голосов
/ 15 января 2010

Gstreamer решает почти все это за вас, без особых усилий, а также прекрасно интегрируется с системой событий Glib. GStreamer включает в себя плагины источника V4L, виджеты вывода gtk +, различные фильтры для изменения размера / кодирования / декодирования видео и, что самое главное, сетевой приемник и источники для перемещения данных между компьютерами.

Для прототипа вы можете использовать инструмент gst-launch для сборки видео-конвейеров и их тестирования, тогда довольно просто программно создавать конвейеры в вашем коде. Найдите «Потоковая сеть GStreamer», чтобы увидеть примеры людей, которые делают это с помощью веб-камер и т. П.

1 голос
/ 14 января 2010

Я не уверен насчет используемых технологий, но это может привести к огромной синхронизации *****, если вы хотите избежать пропущенных кадров. Я передавал видео в файл и по сети одновременно. В конечном итоге я использовал большой круговой буфер с тремя указателями: один для записи и два для чтения. Было три управляющих потока (и некоторые дополнительные потоки кодирования): одна запись в буфер, которая остановилась бы, если бы достигла точки в буфере, не считанной обоими другими, и два потока чтения, которые читали из буфера и записывали в файл / сеть (и пауза, если они опередили производителя). Поскольку все было записано и прочитано как кадры, накладные расходы на синхронизацию могут быть сведены к минимуму.

Мой производитель был транскодером (из другого источника файлов), но в вашем случае вы можете захотеть, чтобы камера генерировала целые кадры в любом формате, который она обычно делает, и выполняла только транскодирование (с чем-то вроде ffmpeg) для сервера, пока робот обрабатывает изображение.

Тем не менее, ваша проблема немного сложнее, поскольку роботу требуется обратная связь в режиме реального времени, поэтому он не может остановиться и дождаться, пока потоковый сервер не догонит. Таким образом, вы можете захотеть как можно быстрее передавать кадры в систему управления и помещать их в кольцевой буфер отдельно для потоковой передачи на «панель управления». Некоторые кодеки обрабатывают пропущенные кадры лучше, чем другие, поэтому, если сеть отстает, вы можете начать перезаписывать кадры в конце буфера (следя за тем, чтобы их не читали).

0 голосов
/ 14 января 2010

Когда вы говорите «новый видеопорт», а затем начинаете говорить о vlc / gstreaming, мне трудно решить, что вы хотите. Очевидно, что эти пакеты программного обеспечения помогут в потоковой передаче и сжатии через ряд протоколов, но, очевидно, вам понадобится «сетевой порт», а не «видеопорт» для отправки потока.

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

Двигаемся дальше. Я сделал много потоков по протоколам MMS / UDP, и vlc отлично справляется с этим (как сервер, так и клиент). Однако он предназначен для настольных ПК и может быть не таким легким, как вы хотите. Я думаю, что что-то вроде gstreamer, mencoder или ffmpeg с другой стороны будет лучше. Какой тип процессора у робота? Вам нужно немного ворчать, если вы планируете сжатие в реальном времени.

На стороне клиента, я думаю, вы найдете несколько виджетов для обработки видео в GTK. Я хотел бы изучить это, прежде чем беспокоиться о деталях интерфейса.

...