Передача видео с модуля камеры на локальный веб сервер, ищем лучший вариант.

Тема в разделе "Raspberry Pi", создана пользователем Alex19, 18 ноя 2015.

  1. Alex19

    Alex19 Гуру

    День добрый.
    Пятый день общаюсь с 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 перенесли, то его удалили, особенно когда речь заходит о пользовательских библиотеках.

    То параметры уже поменялись и т.д., а вникать большой объем кода, без гарантии на результат пока не хочется.
     
    Последнее редактирование: 3 дек 2015
    PiTank нравится это.
  2. PiTank

    PiTank Нерд

    Я рекомендую экспериментальную версию mjpg-streamer от:
    https://github.com/jacksonliam/mjpg-streamer
    Вроде бы только там пока видел поддержку родного модуля камеры для rappberry pi.
     
    Alex19 нравится это.
  3. Alex19

    Alex19 Гуру

    Спасибо за совет, попробую в понедельник, на выходных много дел по дому и надо подключить датчик давления на AVR.

    Не очень понял, родной модуль камеры поддерживается в UV4L, Gstreamer, live555 и т.д..

    И они работают, Gstreamer может неплохо передавать видео с камеры по сети, если на другом компьютере установлен Gstreamer. live555 отлично работает локально, но вот в браузере, пока не смог их запустить.

    Хотя у людей получалось, возможно что-то делаю не так, но и туриалы не радуют, ошибка на ошибке и потом муторный поиск в сети. Так же хочется разобраться с передачей h264 по Rtmp и выбрать лучшее решение для меня.
     
  4. PiTank

    PiTank Нерд

    У меня Arch Linux, возможно поэтому picam не поддерживает по умолчанию video4linux и открывается только спец утилитами.
    Пробовал input_uvc плагин но не взлетел с моим picam.
    А в этой репе есть специальный input плагин для чтения с picam:
    https://github.com/jacksonliam/mjpg...ental/plugins/input_raspicam/input_raspicam.c
     
  5. Alex19

    Alex19 Гуру

    Пока у меня 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 другими, работает как часы. Да и работы много, но останавливатся не собираюсь, хочу перепробовать все.
     
  6. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    Можно попробовать записывать по кусочкам или переписывать файл.
     
  7. Alex19

    Alex19 Гуру

    Не очень понял идею, предлагаете реализовать подобную передачу самому?
    Боюсь мне это не по плечу, поэтому в пробую готовые решения.

    UPD. Пришлось прерваться, увы познаний не хватает, а что нужно изучить растет как снежный ком Linux, Node.js и т.д. Вот так и стал вечным студентом:(.

    UPD 2. C Node + Socket + Serial разобрался вариант рабочий.

    Сегодня попробовал еще раз запустить live555 увы ни как. Работает локально, только если подключен монитор:D, если отключить монитор и зайти под 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с. В ближайшее время опишу установку.
     
    Последнее редактирование: 11 янв 2016
  8. Alex19

    Alex19 Гуру

    Возможно кому-то будет полезно.

    Установка на 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, должна отобразиться следующая картинка
    [​IMG]

    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, смотрим видео.
    screen.jpg

    Ах да зачем все это. Вы сможете получить трансляцию видео в разрешение Full HD 1920×1080 25 кадров с задержкой около 0,3с. на Wi-FI (g 54Mbit\s).

    Правда вопросов очень много, почему при переходе на локальную сеть задержка не уменьшается, почему при работе с разрешением HD 25 кадров задержка остается той же и еще много всяких почему:(, но я упертый, разберусь.

    Увы мне не подходит
    Всего 15 кадров, этого мало.

    UPD. Уж больно хвалили данную связку на RTMP, поэтому хотел сделать ее, результат не плохой, но я ждал откровенно больше. Исправил название протокола RTMP, запутался в названиях :).

    Буду вопросы спрашивайте, я и дальше попробую разобрать проверенные решения передачи видео на сайт, чтобы найти оптимальный.
     

    Вложения:

    • index.html.txt
      Размер файла:
      995 байт
      Просмотров:
      142
    • nginx.conf.txt
      Размер файла:
      4,5 КБ
      Просмотров:
      388
    Последнее редактирование: 11 янв 2016
  9. Alex19

    Alex19 Гуру

    Продолжим поиски идеального решения, сегодня и поговорим о 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. В сети можно увидеть различные варианты объективов для официальной камеры, есть даже такие:).
    [​IMG]

    UPD. Я поменял название темы, так как сейчас это уже не вопрос, а поиск наилучшего решения.
     
  10. andrei-volkau

    andrei-volkau Нуб

    Подскажите пожалуйста: какое решение в итоге вы выбрали для себя в качестве наиболее оптимального?
     
  11. Alex19

    Alex19 Гуру

    Начинал с простого любопытства, сейчас работаю с конкретным проектом. Так что в начале задачи были одни, теперь другие.

    Пока остановился на 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 таких проблем не наблюдал.