Прямая трансляция видео на сервер (ПК) с изображений, отправленных роботом через UDP
Хм. Я нашел это, которое кажется многообещающим:
http://sourceforge.net/projects/mjpg-streamer/
Хорошо. Я постараюсь объяснить, что я пытаюсь сделать, ясно и более подробно.
У меня маленький человекоподобный робот с камерой и вайфай (это робот). Средняя скорость передачи Wi-Fi робота робота составляет 1769 КБ / с. Робот имеет 500 МГц ЦП и 256 МБ ОЗУ, поэтому этого недостаточно для серьезных вычислений (более того, на роботе уже работает пара модулей для движения, зрения, сонара, речи и т. Д.).
У меня есть компьютер, с которого я управляю роботом. Я пытаюсь заставить робота ходить по комнате и смотреть прямую трансляцию того, что робот видит в ПК.
На что я уже работаю. Робот идет так, как я хочу, и снимает на камеру. Изображения отправляются по протоколу UDP на ПК, где я их получаю (я проверил это, сохранив входящие изображения на диск).
Камера возвращает изображения размером 640 x 480 пикселей в цветовом пространстве YUV442. Я отправляю изображения со сжатием с потерями (JPEG), потому что я пытаюсь получить наилучший FPS на ПК. Я делаю сжатие в JPEG на роботе с библиотекой PIL.
Мои вопросы:
Может, кто-нибудь подскажет, как конвертировать входящие изображения JPEG в потоковое видео? Я понимаю, что для этого мне понадобится видеокодер. Какой видеокодер вы рекомендуете? FFMPEG или что-то еще? Я очень плохо знаком с потоковым видео, поэтому я хочу знать, что лучше для этой задачи. Я бы предпочел использовать Python для написания этого, поэтому я бы предпочел некоторый видеокодер или библиотеку, которая имеет Python API. Но я думаю, что если у библиотеки есть хороший API для командной строки, это не обязательно должно быть в Python.
Каков лучший FPS, который я мог получить из этого? Учитывая среднюю скорость передачи Wi-Fi 1769 КБ / с и размеры изображений? Должен ли я использовать сжатие, отличное от 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