Прямая трансляция видео на сервер (ПК) с изображений, отправленных роботом через UDP - PullRequest
9 голосов
/ 27 октября 2010

Хм.Я нашел это, которое кажется многообещающим:

http://sourceforge.net/projects/mjpg-streamer/


Хорошо.Я постараюсь объяснить, что я пытаюсь сделать, ясно и более подробно.

У меня есть маленький человекоподобный робот с камерой и wifi-картой ( это робот ).Средняя скорость передачи Wi-Fi робота робота составляет 1769 КБ / с.Робот имеет 500 МГц ЦП и 256 МБ ОЗУ, поэтому этого недостаточно для серьезных вычислений (более того, на роботе уже работает пара модулей для движения, зрения, сонара, речи и т. Д.).

У меня есть компьютеркоторый я управляю роботом.Я пытаюсь заставить робота ходить по комнате и смотреть прямую трансляцию видео того, что робот видит в ПК.

То, что у меня уже есть, работает.Робот идет так, как я хочу, и снимает на камеру.Изображения отправляются по протоколу UDP на компьютер, на котором я их получаю (я подтвердил это, сохранив входящие изображения на диске).

Камера возвращает изображения размером 640 x 480 пикселей в цветовом пространстве YUV442.,Я отправляю изображения со сжатием с потерями (JPEG), потому что я пытаюсь получить наилучший FPS на ПК.Я делаю сжатие в JPEG на роботе с библиотекой PIL.

Мои вопросы:

  1. Может, кто-нибудь подскажет, как конвертировать входящие изображения JPEGв прямом эфире видео?Я понимаю, что для этого мне понадобится видеокодер.Какой видеокодер вы рекомендуете?FFMPEG или что-то еще?Я очень плохо знаком с потоковым видео, поэтому я хочу знать, что лучше для этой задачи.Я бы предпочел использовать Python для написания этого, поэтому я бы предпочел некоторый видеокодер или библиотеку, которая имеет Python API.Но я думаю, что если у библиотеки есть какой-то хороший API командной строки, он не обязательно должен быть в Python.

  2. Какой самый лучший FPS я мог бы получить из этого?Учитывая среднюю скорость передачи Wi-Fi 1769 КБ / с и размеры изображений?Должен ли я использовать сжатие, отличное от JPEG?

  3. Я буду рад увидеть примеры кода.Ссылки на статьи, объясняющие, как это сделать, тоже подойдут.

Некоторые примеры кода.Вот как я отправляю изображения в формате JPEG от робота на ПК (сокращенный упрощенный фрагмент).Это работает на роботе:

# lots of code here

UDPSock = socket(AF_INET,SOCK_DGRAM)

  while 1:
    image = camProxy.getImageLocal(nameId)
    size = (image[0], image[1])
    data = image[6]
    im = Image.fromstring("YCbCr", size, data)
    s = StringIO.StringIO()
    im.save(s, "JPEG")

    UDPSock.sendto(s.getvalue(), addr)

    camProxy.releaseImage(nameId)

  UDPSock.close()

  # lots of code here

Вот как я получаю изображения на ПК.Это работает на ПК:

  # lots of code here

  UDPSock = socket(AF_INET,SOCK_DGRAM)
  UDPSock.bind(addr)

  while 1:
    data, addr = UDPSock.recvfrom(buf)
    # here I need to create a stream from the data
    # which contains JPEG image

  UDPSock.close()

  # lots of code here

Ответы [ 2 ]

1 голос
/ 28 октября 2010

Попробуйте pyffmpeg и протестируйте каждый доступный кодек для лучшей производительности. Вам, вероятно, нужен очень легкий кодек, такой как Smoke или низкопрофильный H263 или x264, и вам, вероятно, нужно уменьшить разрешение до 320x240.

У вас есть компромисс между задержкой кодирования и декодирования видео и используемой полосой пропускания, вы можете найти снижение до 160x120 с необработанными пакетами для быстрого анализа сцены и только периодической передачи полного кадра. Вы также можете смешивать необработанный канал с низкой задержкой, низким разрешением и высокой скоростью обновления с высокой степенью сжатия, высокой задержкой, высоким разрешением и низкой скоростью обновления.

1 голос
/ 27 октября 2010

Проверка вашего первого вопроса. Хотя решение здесь использует не потоковый набор картинок. Это может помочь. В примере используется pyMedia.

Некоторые в соответствии с тем, что вы хотите.

Если вам нужно отредактировать двоичный поток:

...