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

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

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


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

у меня есть маленький гуманоидный робот с камерой и wifi stick (это робот). Средняя скорость передачи данных WiFi stick робота составляет 1769KB / s. Робот имеет 500MHz CPU и 256MB RAM, поэтому его недостаточно для серьезных вычислений (кроме того, на роботе уже есть пара модулей для движения, зрения, сонара, речи и т. д.).

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

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

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

мои вопросы:

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

  2. каков лучший FPS, который я мог бы получить от этого? С учетом средняя скорость передачи данных wifi 1769KB/s и размеры изображений? Должен ли я использовать другое сжатие, чем 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 ответов


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

некоторые вдоль линий того, что вы хотите.

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


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

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