SpravkaCRM.ru

Настройка прямой видео-трансляции на сайте при помощи Raspberry Pi 2

  • стриминг
  • live
  • raspberry pi 2

    1 post in this topic

    Захотел я тут сделать онлай-трансляцию своих питомцев: четыре дегусятины в клетке. Есть целый мега-проект в голове как я там у них все автоматизирую и сделаю интерактиным с управлением через сайт. В свое время успел накупить разных клевых девайсиков и сенсоров пока активно ардуиной болел. Но начать всеже надо прежде всего с видео-трансляции зверьков. Вот как у меня получилось наладить эту видео-трансляцию я тут и расскажу.

    В начилии у меня есть:

    • клетка с дегусами :D
    • Raspberry Pi 2
    • родная камера к ней

    Хочу добиться:

    • Чтобы включив камеру изображение шло на сайт, а там раздавалось всем желающим

    Сразу оговорюсь, что я хотел организовать именно трансляцию видео-потока на сайт. Хоть у меня дома и хороший интернет (безлимитный 100мегабитный шнурок от прова), но я хочу со временем все это превратить в сервис,  и если народ начнет забирать видео-трафик непосредственно у меня из дома - никакого канала не хватит. Таким образом я должен отдавать один поток на сервер в интернете, а на сервере будет висеть сайт, и он уже будет со своих страниц через плеер, встроенный в HTML-страницу, отображать контент.

    Идея с трансляцией зверьков у меня в мозгу блуждает уже давно. В свое время я пытался настроить подобную схему при помощи и Wowza и Red5 и продукта от Adobe. Но видимо был не настолько мотивирован этой идеей, чтобы разобраться во всех заморочках настройки этих монстров. НУ И СЛАВА БОГУ! Теперь у меня получилось все намного проще, быстрее и дешевле!

    Итак, что же нам понадобиться:

    1. Настроить Raspberry Pi 2 - включить в настройках камеру, установить ffmpeg и добавить в систему кодек H264
    2. Настроить сервер, висящий в интернете - установить на него nginx + nginx-rtmp-module +  добавить на страницу плеер и пихать в него RTMP-поток
    3. Наслаждаться трансляцией камеры на сайте

    А теперь давайте поподробней.

    Настройка Raspberry Pi 2

    Я тут не буду касаться темы как установить OC на вашу Raspberry Pi 2. Пускай это останется за занавесом. Информации об этом в интернете в общем то достаточно много. Сначало включаем камеру командой:

    # raspi-config

    В результате вываливается окошко с настройками:

    56bdab8ad3590_2016-02-1212-52-59.sshssh2

    Нужно выбрать "Enable Camera" и в открывшемся окне выбрать кнопку Enable. Потом выбираем внизу справа кнопку и соглашаемся с тем, что система будет перезагружена. После перезагрузки малинки опять заходим в нее. По идее наша камера теперь может быть использована.

    Далее нам надо поставить на Raspberry Pi 2 ffmpeg. Это очень крутая консольная программа для всевозможного захвата и обработки видео и аудио: там можно и кодировать в разные форматы, и разделять и соединять обратно видео- и аудио-дорожки, и нарезать видео-ролики, и вставлять в них разные вставки и вообще очень много чего. Все это есть в интернете. 

    Можно поставить ffmpeg командой:

    # apt-get install ffmpeg

    Но у меня этот способ почему то не пошел. Уже не помню почему. Я поставил ffmpeg из исходников. Для этого переходим в каталог с исходниками:

    # cd /usr/src/

    Закачиваем последнюю версию через GIT:

    git clone git://source.ffmpeg.org/ffmpeg.git

    Если у вас вдруг не установлен git, то ставим его командой

    # apt-get install git

    После успешного скачивания исходников переходим в их папку:

    # cd ffmpeg/

    И запускаем конфигурирование сборки:

    # ./configure --arch=armel --target-os=linux --enable-gpl --enable-libx264 --enable-nonfree --enable-libaacplus

    После этой команды я получил сообщение о ошибки что то типа: У вас нет кодека x264. В общем пришлось ставить отдельно еще этот кодек. Для этого качаем архив:

    # wget http://download.videolan.org/pub/x264/snapshots/last_x264.tar.bz2

    Дальше распаковываем скачанный архив:

    # tar xjvf last_x264.tar.bz2

    Переходим внутрь распакованного архива:

    # cd x264-snapshot*

    Устанавливаем кодеки:

    # ./configure --enable-static --disable-opencl

    а потом

    # make install

    Возвращаемся обратно в папку с ffmpeg

    # cd ..

    Еще раз пытаемся установить ffmpeg из исходников:

    # ./configure --arch=armel --target-os=linux --enable-gpl --enable-libx264 --enable-nonfree
    # make
    # make install

    Все должно пройти хорошо и без ошибок. По идее на этом настройку Raspberry Pi 2 можно считать выполненной.

    Я, когда эксперементировал, сначало подключил поток с камеры малинки к трансляции на Yutube. Я тут на днях опробовал сервис Youtube по созданию трансляций и немного помучался с кодерами. Ну тоесть там ситуация, что на самом канале Youtube нужно создать трансляцию, а в поле "Тип трансляции" выбрать "Особая":

    56bdc5e5bcb79_2016-02-1214-45-27testspra

    Далее после сохранения в вкладке "Настройка трансляции" в поле "Максимальный битрейт видеокодера" указываем качество и снизу появляется возможность указать Настройка видеокодера. Можно или выбрать один из предустановленных видеокодеров (Wirecast или FMLE), а можно и выбрать "Другие видеокодеры". Тогда Youtube показывает нам адрес, на который надо направлять наш поток с камеры:

    56bdc5c4995ce_2016-02-1214-44-55YouTube.

    На основании этой картинки я могу сказать, что если я из камеры направлю RTMP поток по адресу: rtmp://a.rtmp.youtube.com/live2/

    crmhostingru-blablabla, то я смогу запустить вещание на Youtube прямо из своей камеры на Raspberry Pi 2. И это реально получилось! Для этого создаем трансляцию, пробегаемся по всем настройкам пока у нас на странице не попросят уже пустить наконец то видео-поток и проверить его качество. В этот момент мы включаем видео-поток на малинке вот такой командой:

    # raspivid -o - -t 0 -vf -hf -fps 30 -b 6000000 | ffmpeg -re -ar 44100 -ac 2 -acodec pcm_s16le -f s16le -ac 2 -i /dev/zero -f h264 -i - -vcodec copy -acodec aac -ab 128k -g 50 -strict experimental -f flv rtmp://a.rtmp.youtube.com/live2/crmhostingru-3710.vf8j-mye7-cpzs-2qcq

    Тра-да-да-дааа-да-даааа! Youtube пишет, что качество норм и готов начать трансляцию:

    56bdc830b8e02_2016-02-1214-55-18YouTube.

    Вот пока писал этот текст еще раз запустил:

    56bdca515c519_2016-02-1215-04-15YouTube.

    Все! Трансляция идет. Дегу крутят колесо, мегабайты бесполезной фигни заполняют кластеры гугля! Хотя ему не привыкать...

    Все бы здорово, но где то у Youtube написано, что трансляция не может идти больше определенного количества часов. По моему 8, но поправьте, если не так. Я же хотел 27/7. И Youtube, не смотря на свою привлекательность с точки зрения простоты настройки и охвата аудитории, мне не подходит. Я начал искать видео-сервисы где я могу захоститься с своим видео-потоком: бесплатно или не сильно платно. Ничего толкового так и не нашел. Может плохо искал? Мне нравится сервис Ivideon. Я о нем узнал через просмотр вебкамеры с видом на горки, на которые я езжу периодически кататься на сноуборде: 

    Все здорово: и сервис приятный и удобный, и бесплатно камеру можно транслировать. Только вот с Raspberry Pi 2 Ivideon не дружит, о чем они не единожды упомянули на своем форуме. Пичаль...

    Но в процессе поиска я нашел серию замечательных статей на хабре о таком чудесном дополнении для nginx как nginx-rtmp-module. Почитать можно ,  и .

    Получается, что все, что мне нужно, это сервак с настроенным nginx! И не каких тебе, Wowza и прочих монстров мира стримминга!

    По этому идем дальше:

    Настройка nginx-rtmp-module на выделенном сервере

    Пару слов о сервере. Когда вышел закон о хранении персональных данных мне, как наверное и большинству других владельцев серверов, пришлось переехать с дешевых европейских на их аналоги (или чуть более слабые, чтобы по деньгам не получилось перерасхода) в РФ. Я, когда озадачился этой темой, поспрашивал мнения своих более опытных коллег в этом вопросе. И многие посоветовали использовать сервис . Если честно, то я не сколько не пожалел о своем выборе и до сих пор пользуюсь их услугами и всем своим клиентам рекомендую, если кто ищет куда пристроить свою CRM-систему. Дело в том, что эти ребята предоставляют очень удобную возможность для разворачивания серверов в облаке. Под облаком тут понимается видимо выделение машины не в виде железки или виртуального пространства внутри физического сервера, а выделение пространства в целом большом каскаде серверов, соединенных в один мега-кластер. Я не являюсь спецом по облачным технологиям и не смогу объяснить технически что же у них за сервис такой. Про это они писали на хабре. Например . Но могу немного рассказать с точки зрения пользователя: Хотите вы провести нечеловеческие эксперименты над своим боевым сервером, установить что то на него, какой то модуль или плагин или ПО, но не знаете, рухнет у вас там все после этого или жить будет. Вы просто заходите в панель управления и КЛОНИРУЕТЕ свой сервер. Система создает вам точную копию вашего сервака со всеми файлам и настройками. Просто он будет доступен под другим IP. Вы проводите свои тесты на нем, что угодно делаете. Боевой то остался в виде оригинала и никак не страдает. Потом вы все протестировали, результат вас устроил (а может и нет). И вы можете уже по отработанному сценарию делать изменения на боевом не боясь все угробить (на клоне то у вас все вышло!). А клон можно удалить. При этом вы переплатите за второй сервер только за то время, пока он у вас был. Уложились в пару часов, значит и заплатите только за пару часов.

    Я же для реализации того, о чем тут пишу, создал просто пустой сервер с ОС Ubuntu последней. Новые сервера создаются быстро! Реально быстро. С момента нажатия кнопки "Создать" до момента, когда тебя пускают по ssh проходит порядка 10-15 секунд! СЕКУНД! КАРЛ! Пока тестировал я их создал и потом удалил наверное штук 10: мне показалось это проще - что то не получается установить - чем искать где что успело криво установиться и удалять это - проще удаляем сервер и создаем новый! делов на полминуты!

    В общем итак: у нас есть чистая свеже-установленная Ubuntu и ssh-root-доступ в нее.

    В итоге нам нужно установить на нее nginx с поддержкой модуля nginx-rtmp-module. По идее nginx можно установить командой

    # apt-get install nginx

    Но как туда запихать поддержку nginx-rtmp-module я так и не нашел. По этому решил ставить nginx из исходников. Сначало ставим git:

    # apt-get install git

    После установки GIT-а переходим в каталог с исходниками:

    # cd /usr/src/

    и качаем последнюю версию nginx из git-репозитория:

    # git clone git://anonscm.debian.org/collab-maint/nginx.git

    после скачивания у нас появится папка nginx, в которую мы и переходим:

    # cd nginx/

    далее в эту папку мы качаем исходники nginx-rtmp-module из его git-репозитория:

    # git clone https://github.com/arut/nginx-rtmp-module.git

    После окончания закачки в нас должна образоваться папка nginx-rtmp-module.

    Далее нужно установить несколько модулей, которые будут требоваться при установке nginx. Может кто то подправит и не все они нужны, но я делал так:

    # apt-get install dpkg-dev
    # apt-get install openssl
    # apt-get install libssl-dev
    # apt-get install libperl-dev

    Далее устанавливаем nginx с поддержкой nginx-rtmp-module:

    # ./configure --add-module=/usr/src/nginx/nginx-rtmp-module --with-http_ssl_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --with-stream --with-stream_ssl_module --with-threads --without-http_rewrite_module
    # make
    # make install

    По идее все должно установиться. Так же хочу обратить ваше внимание, что в процессе выполнения установки там где то будет указан список путей где будут лежать те или иные важные для nginx файлы. У меня это выглядело вот так:

    nginx path prefix: "/usr/local/nginx"
    nginx binary file: "/usr/local/nginx/sbin/nginx"
    nginx modules path: "/usr/local/nginx/modules"
    nginx configuration prefix: "/usr/local/nginx/conf"
    nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
    nginx pid file: "/usr/local/nginx/logs/nginx.pid"
    nginx error log file: "/usr/local/nginx/logs/error.log"
    nginx http access log file: "/usr/local/nginx/logs/access.log"
    nginx http client request body temporary files: "client_body_temp"
    nginx http proxy temporary files: "proxy_temp"
    nginx http fastcgi temporary files: "fastcgi_temp"
    nginx http uwsgi temporary files: "uwsgi_temp"
    nginx http scgi temporary files: "scgi_temp"

    Я скопировал этот блок, чтобы потом использовать данные из него при настройке nginx.

    Для меня было неожиданностью, что после установки nginx из исходников не появился автоматом такой привычный уже и нужный файл как /etc/init.d/nginx. Напомню, что запуск, перезапуск и остановку nginx удобно производить при помощи команд

    # /etc/init.d/nginx start
    # /etc/init.d/nginx restart
    # /etc/init.d/nginx stop

    /etc/init.d/nginx - это по факту текстовой файл с bash-командами. Мы можем самостоятельно создать такой файл и указать ему права на выполнение. Для этого я создал новый файл:

    nano /etc/init.d/nginx

    А в качестве содержимого вставил в него то, что находится в этом файле на одном из моих рабочих серверов:

    #  nginx path prefix: "/usr/local/nginx"
    #  nginx binary file: "/usr/local/nginx/sbin/nginx"
    #  nginx modules path: "/usr/local/nginx/modules"
    #  nginx configuration prefix: "/usr/local/nginx/conf"
    #  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
    #  nginx pid file: "/usr/local/nginx/logs/nginx.pid"
    #  nginx error log file: "/usr/local/nginx/logs/error.log"
    #  nginx http access log file: "/usr/local/nginx/logs/access.log"
    #  nginx http client request body temporary files: "client_body_temp"
    #  nginx http proxy temporary files: "proxy_temp"
    #  nginx http fastcgi temporary files: "fastcgi_temp"
    #  nginx http uwsgi temporary files: "uwsgi_temp"
    #  nginx http scgi temporary files: "scgi_temp"
    #!/bin/sh
    
    ### BEGIN INIT INFO
    # Provides:       nginx
    # Required-Start:    $local_fs $remote_fs $network $syslog $named
    # Required-Stop:     $local_fs $remote_fs $network $syslog $named
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: starts the nginx web server
    # Description:       starts nginx using start-stop-daemon
    ### END INIT INFO
    
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/nginx/sbin/nginx:/usr/local/nginx/sbin:/usr/local/nginx
    DAEMON=/usr/local/nginx/sbin/nginx
    NAME=nginx
    DESC=nginx
    
    # Include nginx defaults if available
    if [ -r /etc/default/nginx ]; then
            . /etc/default/nginx
    fi
    
    STOP_SCHEDULE="${STOP_SCHEDULE:-QUIT/5/TERM/5/KILL/5}"
    
    test -x $DAEMON || exit 0
    
    . /lib/init/vars.sh
    . /lib/lsb/init-functions
    
    # Try to extract nginx pidfile
    PID=$(cat /usr/local/nginx/conf/nginx.conf | grep -Ev '^\s*#' | awk 'BEGIN { RS="[;{}]" } { if ($1 == "pid") print $2 }' | head -n1)
    if [ -z "$PID" ]
    then
            PID=/run/nginx.pid
    fi
    
    # Check if the ULIMIT is set in /etc/default/nginx
    if [ -n "$ULIMIT" ]; then
            # Set the ulimits
            ulimit $ULIMIT
    fi
    
    #
    # Function that starts the daemon/service
    #
    do_start()
    {
            # Return
            #   0 if daemon has been started
            #   1 if daemon was already running
            #   2 if daemon could not be started
            start-stop-daemon --start --quiet --pidfile $PID --exec $DAEMON --test > /dev/null \
                    || return 1
            start-stop-daemon --start --quiet --pidfile $PID --exec $DAEMON -- \
                    $DAEMON_OPTS 2>/dev/null \
                    || return 2
    }
    
    test_nginx_config() {
            $DAEMON -t $DAEMON_OPTS >/dev/null 2>&1
    }
    
    #
    # Function that stops the daemon/service
    #
    do_stop()
    {
            # Return
            #   0 if daemon has been stopped
            #   1 if daemon was already stopped
            #   2 if daemon could not be stopped
            #   other if a failure occurred
            start-stop-daemon --stop --quiet --retry=$STOP_SCHEDULE --pidfile $PID --name $NAME
            RETVAL="$?"
    
            sleep 1
            return "$RETVAL"
    }
    
    #
    # Function that sends a SIGHUP to the daemon/service
    #
    do_reload() {
            start-stop-daemon --stop --signal HUP --quiet --pidfile $PID --name $NAME
            return 0
    }
    
    #
    # Rotate log files
    #
    do_rotate() {
            start-stop-daemon --stop --signal USR1 --quiet --pidfile $PID --name $NAME
            return 0
    }
    
    #
    # Online upgrade nginx executable
    #
    # "Upgrading Executable on the Fly"
    # http://nginx.org/en/docs/control.html
    #
    do_upgrade() {
            # Return
            #   0 if nginx has been successfully upgraded
            #   1 if nginx is not running
            #   2 if the pid files were not created on time
            #   3 if the old master could not be killed
            if start-stop-daemon --stop --signal USR2 --quiet --pidfile $PID --name $NAME; then
                    # Wait for both old and new master to write their pid file
                    while [ ! -s "${PID}.oldbin" ] || [ ! -s "${PID}" ]; do
                            cnt=`expr $cnt + 1`
                            if [ $cnt -gt 10 ]; then
                                    return 2
                            fi
                            sleep 1
                    done
                    # Everything is ready, gracefully stop the old master
                    if start-stop-daemon --stop --signal QUIT --quiet --pidfile "${PID}.oldbin" --name $NAME; then
                            return 0
                    else
                            return 3
                    fi
            else
                    return 1
            fi
    }
    
    case "$1" in
            start)
                    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
                    do_start
                    case "$?" in
                            0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                            2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
                    esac
                    ;;
            stop)
                    [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
                    do_stop
                    case "$?" in
                            0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                            2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
                    esac
                    ;;
            restart)
                    log_daemon_msg "Restarting $DESC" "$NAME"
    
                    # Check configuration before stopping nginx
                    if ! test_nginx_config; then
                            log_end_msg 1 # Configuration error
                            exit 0
                    fi
    
                    do_stop
                    case "$?" in
                            0|1)
                                    do_start
                                    case "$?" in
                                            0) log_end_msg 0 ;;
                                            1) log_end_msg 1 ;; # Old process is still running
                                            *) log_end_msg 1 ;; # Failed to start
                                    esac
                                    ;;
                            *)
                                    # Failed to stop
                                    log_end_msg 1
                                    ;;
                    esac
                    ;;
            reload|force-reload)
                    log_daemon_msg "Reloading $DESC configuration" "$NAME"
    
                    # Check configuration before reload nginx
                    #
                    # This is not entirely correct since the on-disk nginx binary
                    # may differ from the in-memory one, but that's not common.
                    # We prefer to check the configuration and return an error
                    # to the administrator.
                    if ! test_nginx_config; then
                            log_end_msg 1 # Configuration error
                            exit 0
                    fi
    
                    do_reload
                    log_end_msg $?
                    ;;
            configtest|testconfig)
                    log_daemon_msg "Testing $DESC configuration"
                    test_nginx_config
                    log_end_msg $?
                    ;;
            status)
                    status_of_proc -p $PID "$DAEMON" "$NAME" && exit 0 || exit $?
                    ;;
            upgrade)
                    log_daemon_msg "Upgrading binary" "$NAME"
                    do_upgrade
                    log_end_msg 0
                    ;;
            rotate)
                    log_daemon_msg "Re-opening $DESC log files" "$NAME"
                    do_rotate
                    log_end_msg $?
                    ;;
            *)
                    echo "Usage: $NAME {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}" >&2
                    exit 3
                    ;;
    esac
    
    :

    Это то, что получилось в результате подстановки в нужные места путей до файлов, которые мы скопировалии ранее. Кстати эти все пути я и указал вверху файла в комментариях.

    Делаем файл исполняемым:

    # chmod +x /etc/init.d/nginx

    Теперь мы можем запускать/останавливать nginx привычным способом. Надо еще добавить вызов этого скрипта из автозагрузки. Но я этого не делал, потому описывать тут не буду. Если нужно, то информацию о этом можно найти в интернете, ее там много.

    Из настроек нам осталось лишь настроить nginx на прием RTMP-потока. Для этого ищем конфигурационный файл nginx. Как правило по умолчанию лежит конфиг лежит в /etc/nginx/nging.conf. Но при установке nginx из исходников папка /etc/nginx вообще создана не была! По этому где же находится файл с конфигурацией мы можем посмотреть в нашем ранее скопированном блоке с путями, про который я говорил. В моем случае это:

    nginx configuration file: "/usr/local/nginx/conf/nginx.conf"

    Открываю этот файл на редактированию и добавляю в него блок

    rtmp {
        server {
            listen 1935;
            application myapp {
                live on;
            }
        }
    }

    Этот блок распологаю прямо НАД блоком http, чтобы получилось вот так:

    #user  nobody;
    worker_processes  1;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    rtmp {
        server {
            listen 1935;
            application myapp {
                live on;
            }
        }
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
        #access_log  logs/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    

    Хотя порядок следования возможно и не важен...

    После этого запускаем nginx:

    # /etc/init.d/nginx start

    Проверить работоспособность можно в браузере вызвав IP-адрес сервера. Если все нормально, то сервер отдаст примерно следующее:

    56bddfe9cecde_2016-02-1216-36-29Welcomet

    Это говорит о том, что у нас все хорошо и все работает.

    Давайте перейдем к финальной части нашего повествования:

    Установка плеера JWPlayer на сайте и начало трансляции с камеры Raspberry Pi 2

    Папка, которая является DOCUMENT_ROOT для нашего сервера, находится тут:

    # cd /usr/local/nginx/html/

    Файл index.html отдает ту надпись, которую вы видите на картинке сверху (Welcome to nginx!). Создание красивого сайта с менюхами и прочим оставим за рамками этой статьи. Все, что мне нужно было, это увидеть свою клетку с дегусятинами на этой странице с приветствием. Я качаю JWPlayer пихаю его в папку /usr/local/nginx/html/jwplayer. Кстати, поиск JWPlayer-а тоже был какой то неоднозначный. Я пытался найти где его можно скачать на официальном сайте, но сходу что то не разобрался. А сидеть и долго и упорно тыркать их сайт у меня уже не было терпения (на финальную прямую вышел как никак )) ). По этому прошерстив кучу ссылок на всякие летитбит и прочие сайты-качалки скачал-таки какую то версию в rar-архиве, который распаковал и перенес в нужную мне папку на сервере. Какая это была ссылка я уже не помню. Если надо будет  - поищу.

    Все, файлы JWPlayer есть на сайте. Теперь осталось его встроить на страницу отредактировав файл index.html и настроить на прием данных:

    Thank you for using nginx.

    type="text/javascript" src="/jwplayer/jwplayer.js"> id="container">Loading the player ...
    type="text/javascript"> jwplayer("container").setup({ file: "rtmp://176.112.197.199/myapp/mystream", provider: "rtmp", width: 640, height: 480, rtmp: { bufferlength: 1 } });

    Как вы видите я вставил код прям после слов "Thank you for using nginx."

    Так же обращаю ваше внимание на переменную file. Там указан путь до сервера. myapp - это то, что указали в конфиге nginx.conf, а mystream видимо может служить обозначением той или иной трансляции.

    Нам осталось лишь запустить трансляцию с видео-камеры на Raspberry Pi отправив поток по адресу, указанному в нашем параметре file. Для этого заходим в малинку и в командной строке выполняем:

    # raspivid -o - -t 0 -vf -hf -fps 30 -b 6000000 -rot 90 | ffmpeg -re -ar 44100 -ac 2 -acodec pcm_s16le -f s16le -ac 2 -i /dev/zero -f h264 -i - -vcodec copy -acodec aac -ab 128k -g 50 -strict experimental -f flv rtmp://176.112.197.199/myapp/mystream

    Начнется отдаваться поток по указанному адресу. При этом будет видно примерно следующее:

    ffmpeg version N-78371-g1354603 Copyright (c) 2000-2016 the FFmpeg developers
      built with gcc 4.9.2 (Raspbian 4.9.2-10)
      configuration: --arch=armel --target-os=linux --enable-gpl --enable-libx264 --enable-nonfree
      libavutil      55. 17.100 / 55. 17.100
      libavcodec     57. 24.102 / 57. 24.102
      libavformat    57. 25.100 / 57. 25.100
      libavdevice    57.  0.101 / 57.  0.101
      libavfilter     6. 31.100 /  6. 31.100
      libswscale      4.  0.100 /  4.  0.100
      libswresample   2.  0.101 /  2.  0.101
      libpostproc    54.  0.100 / 54.  0.100
    Guessed Channel Layout for  Input Stream #0.0 : stereo
    Input #0, s16le, from '/dev/zero':
      Duration: N/A, bitrate: 1411 kb/s
        Stream #0:0: Audio: pcm_s16le, 44100 Hz, 2 channels, s16, 1411 kb/s
    Input #1, h264, from 'pipe:':
      Duration: N/A, bitrate: N/A
        Stream #1:0: Video: h264 (High), yuv420p, 1920x1080, 25 fps, 25 tbr, 1200k tbn, 50 tbc
    Output #0, flv, to 'rtmp://176.112.197.199/myapp/mystream':
      Metadata:
        encoder         : Lavf57.25.100
        Stream #0:0: Video: h264 ([7][0][0][0] / 0x0007), yuv420p, 1920x1080, q=2-31, 25 fps, 25 tbr, 1k tbn, 1200k tbc
        Stream #0:1: Audio: aac (LC) ([10][0][0][0] / 0x000A), 44100 Hz, stereo, fltp, 128 kb/s
        Metadata:
          encoder         : Lavc57.24.102 aac
    Stream mapping:
      Stream #1:0 -> #0:0 (copy)
      Stream #0:0 -> #0:1 (pcm_s16le (native) -> aac (native))
    [flv @ 0x29749f0] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
    [h264 @ 0x2950450] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
    frame= 1010 fps= 25 q=-1.0 size=   24692kB time=00:00:40.37 bitrate=5009.5kbits/s speed=   1x    

    Обновляем страничку на нашем сервере. Видим окошко с плеером и жмем кнопку в нем на начало трансляции:

    56bde6c36ced9_2016-02-1217-05-35Welcomet

    УРААА!!! Оно работает!!!

    Правда я заметил, что задержка все равно есть! Порядка 6-7 секунд. Неприятно, но не критично. Надеюсь я еще найду способ ее уменьшить. Но это все равно однозначно лучше, чем задержка Youtube порядка 40 секунд или даже больше!

    Вот такой вот получился отчет о подключении видео с Raspberry Pi 2 на сайт. В планах добавить еще камер, подсветки, разных штук типа замера скорости вращения колеса, автокормилки ништячками и прочего. Но о этом напишу в другой раз...

    Share this post


    Link to post
    Share on other sites

    Create an account or sign in to comment

    You need to be a member in order to leave a comment

    Create an account

    Sign up for a new account in our community. It's easy!


    Register a new account

    Sign in

    Already have an account? Sign in here.


    Sign In Now