Живой видеопоток на сервере (ПК) из изображений, отправленных роботом через 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.
мои вопросы:
может кто-нибудь дать мне некоторые идеи о том, как конвертировать входящие изображений JPEG в видео ручей? Я понимаю, что для этого мне понадобится видеокодер. Какой видеокодер вы рекомендуете? FFMPEG или что-то еще? Я очень новичок в потоковой передаче видео, поэтому я хочу знать, что лучше для этой задачи. Я бы предпочел использовать Python для написания этого, поэтому я бы предпочел некоторый видеокодер или библиотеку, которая имеет Python API. Но я думаю, если в библиотеке есть хороший API командной строки, он не должен быть в Python.
каков лучший FPS, который я мог бы получить от этого? С учетом средняя скорость передачи данных wifi 1769KB/s и размеры изображений? Должен ли я использовать другое сжатие, чем JPEG?
Я буду рад видеть любые примеры кода. Ссылки на статьи, объясняющие, как это сделать, тоже были бы прекрасны.
некоторые примеры кода. Вот как я отправляю 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 с высокой сжатой, высокой задержкой, высоким разрешением, низкой лентой обновления.