потоковая передача видео в несколько источников и из них

StackOverflow https://stackoverflow.com/questions/2061558

  •  20-09-2019
  •  | 
  •  

Вопрос

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

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

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

Спасибо!

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top