Прямой видеопоток на сервере (ПК) из изображений, отправленных роботом через UDP

Хм. Я нашел это многообещающим:

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


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

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

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

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

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

Мои вопросы:

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

9
задан Richard Knop 27 October 2010 в 19:13
поделиться