День добрый. Пятый день общаюсь с linux, raspberry 2 и родным модулем камеры. Возник вопрос как передавать видео Full HD с камеры на сайт, который крутится на raspberry, для отображения его в теге <video>. Как я понял, существую стандартные способы. 1. VLC + RTSP, наспех попробовал, Full HD не получилось, задержки и дальше разбираться не стал, из-за сравнений в сети. 2. Gstreamer, еще не пробовал. 3. live555, не удалось запустить. Подробнее тут - http://www.sonsoftone.com/?page_id=287. 4. Motion еще не пробовал. 5. UV4L сейчас ковыряюсь в настройках. Видео мне понравилось, кроме задержки. Страницы сравнения подходов. 1. http://pnetherwood.blogspot.com.by/2015/04/raspberry-pi-video-streaming-to-android.html 2. http://stephane.lavirotte.com/perso/rov/video_streaming_pi2.html Но все эти решения, предназначены для вещания в интернет, подымаются сервера RTSP идет сжатие, отправка данных в сеть и т.д. А есть ли варианты на прямую получать видео поток на локальный сайт, ведь сайт и камера физически на 1 компьютере? Предполагаю, ответ нет, но вдруг я иду не в ту сторону и есть более элегантные решения. Если ответ нет, может я упустил какие-то достойные, готовые варианты потоковой передачи видео? UPD. По UV4L. JPEG и MJPEG качество ни чего (хотя хочется большего), но задержка не приятная. h264 качество получше, но там даже не задержка, а машина времени, которая отображает прошлое. Самая красивая задержка UV4L + WebRTC, но как выяснилось и разрешение в примере 640x320, как его настроить в конфигурации или средствами сервера UV4L, не нашел. Попробую исправить страницу примера. UPD 2. Решил прерваться, банально не хватает знаний по работе с linux и raspberry, поднакоплю и вернусь к проблеме. UPD 3. Motion большая задержка. Пока самое близкое решение UV4L с JPEG и MJPEG с разрешением HD, при Full HD задержка становится не приемлемой как и качество. В сети много примеров, но начинаешь делать, то git перенесли, то его удалили, особенно когда речь заходит о пользовательских библиотеках. То параметры уже поменялись и т.д., а вникать большой объем кода, без гарантии на результат пока не хочется.
Я рекомендую экспериментальную версию mjpg-streamer от: https://github.com/jacksonliam/mjpg-streamer Вроде бы только там пока видел поддержку родного модуля камеры для rappberry pi.
Спасибо за совет, попробую в понедельник, на выходных много дел по дому и надо подключить датчик давления на AVR. Не очень понял, родной модуль камеры поддерживается в UV4L, Gstreamer, live555 и т.д.. И они работают, Gstreamer может неплохо передавать видео с камеры по сети, если на другом компьютере установлен Gstreamer. live555 отлично работает локально, но вот в браузере, пока не смог их запустить. Хотя у людей получалось, возможно что-то делаю не так, но и туриалы не радуют, ошибка на ошибке и потом муторный поиск в сети. Так же хочется разобраться с передачей h264 по Rtmp и выбрать лучшее решение для меня.
У меня Arch Linux, возможно поэтому picam не поддерживает по умолчанию video4linux и открывается только спец утилитами. Пробовал input_uvc плагин но не взлетел с моим picam. А в этой репе есть специальный input плагин для чтения с picam: https://github.com/jacksonliam/mjpg...ental/plugins/input_raspicam/input_raspicam.c
Пока у меня Raspbian, да возможно дело в OS, хотя не берусь утверждать. Сами варианты с JPEG и MJPEG, меня не сильно впечатлили, надеюсь предложенный вариант Вами, все изменит. Да чуть не забыл, примеры для интересующихся. Gstreamer в Web - http://tpy.tw/?p=109 (Gstremer + RTMP + Browser), для отображения используется StorbeMediaPlayback. Поэтому c наложением текста придется помучится, не так удобно как с HTML5. ffmpeg в Web - http://pkula.blogspot.co.uk/2013/06/live-video-stream-from-raspberry-pi.html (ffmpeg+ RTMP + Browser). Аналогично для отображения используется StorbeMediaPlayback. С Gstreamer и ffmpeg, у многих получалось, но как писал мне не удалось установить и настроить их на Raspberry 2. live555 мало кто использовал, там используется RTSP, тем менее http://www.sonsoftone.com/?page_id=287. UV4L JPEG, MJPEG, H264, WebRTC, работа из коробки для Raspberry 2, просто следуйте инструкциям - http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=14. И тут - http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=16. По WebRTC маленькое разрешение и не страивается, по крайней мере не увидел в документации. H264 так себе, мне не понравилось. JPEG, MJPEG не плохо для HD, а вот Full HD не радует. Хотя может быть я слишком много хочу. Пока прервусь, надо разобраться почему библиотека от AVR 315 для TWI не работает с 1 датчиком, а 5 другими, работает как часы. Да и работы много, но останавливатся не собираюсь, хочу перепробовать все.
Не очень понял идею, предлагаете реализовать подобную передачу самому? Боюсь мне это не по плечу, поэтому в пробую готовые решения. UPD. Пришлось прерваться, увы познаний не хватает, а что нужно изучить растет как снежный ком Linux, Node.js и т.д. Вот так и стал вечным студентом. UPD 2. C Node + Socket + Serial разобрался вариант рабочий. Сегодня попробовал еще раз запустить live555 увы ни как. Работает локально, только если подключен монитор, если отключить монитор и зайти под VNC не работает, удалено по RTSP не запускается. UPD 3. Так же сегодня посмотрел RPi-Cam-Web-Interface, пока просто поставил и убедился, что видео идет в браузер. Великолепное описание установки от производителя, все просто, ошибиться негде - http://elinux.org/RPi-Cam-Web-Interface#Remote_access_to_website_with_User.2FPass_and_changing_port. Завтра буду изучать, что можно выжать из данного решения. UPD 4. Сделал вариант с gstreamer + nginx + StorbeMediaPlayback. Full HD есть, но задержка увы, аж 0,3с. В ближайшее время опишу установку.
Возможно кому-то будет полезно. Установка на Raspberry Pi 2 (Raspbian) по протоколу RTMP связки gstreamer (gst-rpicamsrc) + nginx (nginx-rtmp-module) + StorbeMediaPlayback. Потребуется PuTTY, WinSCP (под root, не хватило терпения сделать копирование, через команды). 1. Установка GStreamer Обновление всего Код (Bash): sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade sudo apt-get install rpi-update sudo rpi-update Перезагружаем, чтобы изменения вступили в силу Код (Bash): sudo reboot Устанавливаем программы необходимы для GStreamer Код (Bash): sudo apt-get install libglib2.0-dev bison flex libtool \ autoconf automake autopoint gtk-doc-tools libx264-dev liborc-0.4-dev \ nasm yasm cmake libmicrohttpd-dev libjansson-dev libnice-dev librtmp-dev Устанавливаем сам GStreamer Код (Bash): sudo apt-get install gstreamer1.0 Проверяем правильность установки, на Raspberry, запускаем команду, поменяв IP на свой (речь об IP для клиента/компьютера). Код (Bash): raspivid -n -t 0 -w 1200 -h 720 -fps 25 -b 25000000 -o - | gst-launch-1.0 -e -vvvv fdsrc ! h264parse ! rtph264pay pt=96 config-interval=5 ! udpsink host=192.168.1.100 port=5000 На клиенте под Windows (у меня 7 64bit) Код (Bash): E:\gstreamer\1.0\x86_64\bin>gst-launch-1.0 -e -v udpsrc port=5000 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false Путь E:\gstreamer\1.0\x86_64\bin> у Вас может быть другой. Не большое замечание по Gstreamer для Windows, последняя версия у меня не запустилась, загружал по рекомендации на одном из форумов - версию 1.3.91, взять можно тута - http://gstreamer.freedesktop.org/data/pkg/windows/. 2. Установка gst-rpicamsrc Код (Bash): git clone https://github.com/thaytan/gst-rpicamsrc.git sudo apt-get install autoconf libtool libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev cd /home/pi/gst-rpicamsrc ./autogen.sh sudo make sudo make install Проверка Код (Bash): gst-inspect-1.0 rpicamsrc Дополнительная проверка, на Raspberry, запускаем команду, поменяв IP на свой (речь об IP для клиента/компьютера). Код (Bash): gst-launch-1.0 rpicamsrc bitrate=5000000 ! "video/x-h264, width=1200, height=720, framerate=25/1" ! rtph264pay config-interval=1 pt=96 ! udpsink host=192.168.1.100 port=5000 На клиенте под Windows (у меня 7 64bit) Код (Bash): E:\gstreamer\1.0\x86_64\bin>gst-launch-1.0 -e -v udpsrc port=5000 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false 3. Устанавливаем Nginx + nginx-rtmp-module Код (Bash): sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev wget http://nginx.org/download/nginx-1.9.6.tar.gz wget https://github.com/arut/nginx-rtmp-module/archive/master.zip tar -zxvf nginx-1.9.6.tar.gz unzip master.zip cd nginx-1.9.6 ./configure --add-module=/home/pi/nginx-rtmp-module-master sudo make sudo make install Запуск nginx Код (Bash): sudo /usr/local/nginx/sbin/nginx Проверка. Набираем в браузере IP Raspberry, должна отобразиться следующая картинка 4. Настраиваем Nginx Код (Bash): sudo nano /usr/local/nginx/conf/nginx.conf Сами настройки привожу в файле nginx.conf.txt Перегружаем nginx Код (Bash): sudo /usr/local/nginx/sbin/nginx -s stop sudo /usr/local/nginx/sbin/nginx 5. Ставим StorbeMediaPlayback. Код (Bash): cd /usr/local/nginx/html Загружаем последнюю версию аж за 2011 в папку /usr/local/nginx/html я сделал при помощи WinSCP. Распаковываем. Код (Bash): sudo unzip StrobeMediaPlayback_1.6.328-full.zip Создаем папку strobe в /usr/local/nginx/html/. После чего копируем в нее содержимое папки StrobeMediaPlayback_1.6.328-full/for Flash Player 10.1/. Почему установка StorbeMediaPlayback не командами, Raspbian пару раз ругнулся на команды (какие-то нюансы с правами, sudo не помогло), после чего я быстро сделал это все в WinSCP под root. 6. Меняем страницу index.html Привожу в файле index.html.txt В нем нужно найти 192.168.1.102 и заменить на свой IP Raspberry. И поменять Код (Javascript): swfobject.embedSWF( "strobe/StrobeMediaPlayback.swf" , "StrobeMediaPlayback" , 1200 , 720 , "10.1.0" , "strobe/expressInstall.swf" , parameters , { allowFullScreen: "true" } , { name: "StrobeMediaPlayback" } ); Заменить 1200 , 720 на 1920, 1080 забыл поменять при заливке. 7. Запуск Код (Bash): sudo /usr/local/nginx/sbin/nginx gst-launch-1.0 rpicamsrc bitrate=5000000 rotation=90 ! video/x-h264,width=1920,height=1080,framerate=25/1 ! h264parse ! flvmux ! rtmpsink location='rtmp://localhost/rtmp/live live=1' Придется делать при каждой перезагрузке, или разобраться как прописывать выполнение скриптов при загрузке. Открываем браузер. Набираем в браузере IP Raspberry, смотрим видео. Ах да зачем все это. Вы сможете получить трансляцию видео в разрешение Full HD 1920×1080 25 кадров с задержкой около 0,3с. на Wi-FI (g 54Mbit\s). Правда вопросов очень много, почему при переходе на локальную сеть задержка не уменьшается, почему при работе с разрешением HD 25 кадров задержка остается той же и еще много всяких почему, но я упертый, разберусь. Увы мне не подходит Всего 15 кадров, этого мало. UPD. Уж больно хвалили данную связку на RTMP, поэтому хотел сделать ее, результат не плохой, но я ждал откровенно больше. Исправил название протокола RTMP, запутался в названиях . Буду вопросы спрашивайте, я и дальше попробую разобрать проверенные решения передачи видео на сайт, чтобы найти оптимальный.
Продолжим поиски идеального решения, сегодня и поговорим о UV4L + WebRTC (новомодной технологии), подробнее тут - https://ru.wikipedia.org/wiki/WebRTC. Вернутся к UV4L меня побудила следующая новость - http://www.linux-projects.org/modules/news/article.php?storyid=190. Выделим главное, добавлена поддержка разрешения HD со скоростью 30 кадров для технологии WebRTC с аппаратной поддержкой кодирования H.264 и минимальной загрузкой процессора. После обновления/установки, мы получим разрешение HD с частотой 30. Тесты показали, задержку около 0,2 секунд. На форуме в ближайшем будущем обещают поддержку Full HD, но когда появится, ни кто точно не говорит. Сама технология WebRTC в UV4L, реализована давно и позволяет не только вещать в сети с камеры самой Raspberry, но и получать доступ в браузере к камере, микрофону, монитору и т.д. Отличается очень простой установкой, подробное описание установки для Raspberry 1/2 (ОС Raspbian) - http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=14. Примеры работы - http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=16 (там есть и jpeg, mjpeg, работа с Motion, HTTP потоки, RTSP и т.д.). Вся документация на UV4L - http://www.linux-projects.org/modules/sections/index.php?op=listarticles&secid=2. Одним словом рекомендую ознакомится с данной программой, как перво очередной при работе с камерой в браузере. Фото получилось не очень, поэтому не публикую, у меня отклеилась матрица камеры, после установки нового объектива с другим фокусным расстоянием. Придется заново разбирать. Кому интересна смена объектива, может ознакомится с подробным руководством тут - http://wiki.raspberrytorte.com/index.php?title=Camera_Module_Lens_Modifcation. В сети можно увидеть различные варианты объективов для официальной камеры, есть даже такие. UPD. Я поменял название темы, так как сейчас это уже не вопрос, а поиск наилучшего решения.
Начинал с простого любопытства, сейчас работаю с конкретным проектом. Так что в начале задачи были одни, теперь другие. Пока остановился на mjpg-streamer, хотя еще не до конца протестировал и если раньше она не поддерживала разрешения Full HD 25-30 кадров, то теперь поддерживает. Задержка около 0,2с на ноутбуке, на телефоне и стареньком планшете больше (пока не измерял). Установка очень простая, но все же опишу: Устанавливаем необходимые пакеты Код (Bash): sudo apt-get install libjpeg-dev sudo apt-get install cmake Скачиваем последнюю версию. Код (Bash): sudo git clone https://github.com/jacksonliam/mjpg-streamer.git ~/mjpg-streamer Переходим в каталог. Код (Bash): cd ~/mjpg-streamer/mjpg-streamer-experimental Компилируем. Код (Bash): sudo make Перемещаем файлы в каталог /opt/mjpg-streamer Код (Bash): sudo mv ~/mjpg-streamer/mjpg-streamer-experimental /opt/mjpg-streamer Запуск. Код (Bash): LD_LIBRARY_PATH=/opt/mjpg-streamer/ /opt/mjpg-streamer/mjpg_streamer -i "input_raspicam.so -fps 25 -q 10 -x 1920 -y 1080" -o "output_http.so -p 9000 -w /opt/mjpg-streamer/www" Теперь можете зайти по ссылке ip адрес Raspberry на порту 9000. Мой адрес выглядит так - http://192.168.1.102:9000/stream_simple.html. Можете так же пробежаться по веб серверу и посмотреть все примеры, ссылка - http://192.168.1.102:9000/. Скрипт для запуска - start_stream.sh Код (Bash): #!/bin/bash if pgrep mjpg_streamer > /dev/null then echo "mjpg_streamer already running" else LD_LIBRARY_PATH=/opt/mjpg-streamer/ /opt/mjpg-streamer/mjpg_streamer -i "input_raspicam.so -fps 25 -q 10 -x 1920 -y 1080" -o "output_http.so -p 9000 -w /opt/mjpg-streamer/www" echo "mjpg_streamer started" fi Скрипт для остановки - stop_stream.sh Код (Bash): #!/bin/bash if pgrep mjpg_streamer then kill $(pgrep mjpg_streamer) > /dev/null 2>&1 echo "mjpg_streamer stopped" else echo "mjpg_streamer not running" fi Так же советую обратить внимание на пакет UV4L, у него больше возможностей, задержка немного больше. UPD. Еще хотелось бы рассказать о проекте Janus WebRTC. Так как и он был опробован с разрешением в Full HD 25-30 кадров, в начале задержка была не большой но со временем она росла до секунд с разрешением 640x480 таких проблем не наблюдал.