2010-01-14 4 views
5

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

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

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

спасибо!

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

+0

просто мысль: возможно ли использовать библиотеку vlc в пользовательском приложении для получения потокового видео vlc? Если это возможно, у меня может быть поток vlc, а затем анализ изображения будет получать видеоданные из петлевого соединения, а панель управления сделает то же самое, но удаленно. –

+1

не уверен в vlc, но ffserver довольно легко вставлять. –

+0

btw, vlc и ffserver оба основаны на ffmpeg (libavcodec/ibavformat) –

ответ

1

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

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

0

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

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

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

+0

Я не против падения кадров. В любом случае обработка видео не может обрабатывать все. –

0

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

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

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

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

+0

Да, извините. Я имел в виду «новый сетевой порт» для видеоданных. Сделано редактирование, чтобы отразить это. Также отредактирован для информации о CPU. Я не очень беспокоюсь о виджетах gtkmm, я знаю, что могу просто использовать какой-то виджет SDL, если мне нужно ... но конкретный видео был бы еще лучше. –

Смежные вопросы