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