Transmisja na żywo NGINX / RTMP / HLS na Raspberry pi (Debian 8.4)

0

Debian 8.4 / Raspbian 8.0

Nginx 1.9.15

ffmpeg 2.6.8 (po stronie serwera) / avconv 11.6-6: 11.6-1 ~ deb8u1 + rpi1 (zbieranie z kamery). Avconv jest widelcem FFMPEG, działa dobrze na raspbian.


Schemat przepływu

cam-1: raspberry pi / model B / raspbian 8.0 (Jessie) / avconv

mercure: serwer debian 8.4 (Jessie) / nginx / ffmpeg

cam-1 [rapivid | avconv (ffmpeg)] -> mercure [nginx rtmp / hls]


Od 2 tygodni dużo czytałem w Internecie na temat ustawiania serwera przesyłania strumieniowego wideo na żywo, który odbierał strumienie wideo z kamery Raspberry Pi. nie martw się o źródło strumieniowe malin, problem nie jest skupiony na. Celem jest możliwość odczytu strumieni na żywo RTMP i HLS na zdalnym serwerze NGINX

fakty :

Działa, jestem w stanie odczytać transmisję na żywo z serwera RTMP / NGINX za pośrednictwem

ffplay rtmp://mercure/live/cam-1 (defaults to 1935 port)

Uwaga : nie używa VLC i aplikacji QT5 osadzającej widżety QMediaPlayer / QMediaContent. Dowiedziałem się, że VLC wprowadza problemy z plikiem librtmp.so w debianie i wydaje się być takie samo w Windows 7 (test również się nie udaje). źródło: blog debian. Problem QT5 jest może efektem ubocznym, ponieważ QT5 może korzysta z biblioteki VLC? Nadal badam. Komponenty QT5 mogą odczytywać dowolny plik wideo dysku, ale zawieszają się na pierwszym obrazie podczas przesyłania strumieniowego za pomocą rtmp

Moduł Nginx hls jest zainstalowany.

Aparat (Raspberry Pi)

Aby podłączyć strumień wideo z kamery i opublikować go na serwerze rtmp NGINX za pomocą pakietów raspivid i avconv (widelec FFMPEG), użyte polecenie to:

wyciągnij z krzywki zgrzytu (cam-1):

/opt/vc/bin/raspivid -hf -vf -fl -pf main -a 8 -mm matrix -w 640 -h 480 -g 250 -t 0 -b 2048000 -o -

push na serwer RTMP (mercure)

avconv -re -i - -nostats -c copy -copyts -an -r 25 -f flv rtmp://mercure:1935/live/cam-1

kompletne polecenie osadzone w usłudze debian jest wtedy

/opt/vc/bin/raspivid -hf -vf -fl -pf main -a 8 -mm matrix -w 640 -h 480 -g 250 -t 0 -b 2048000 -o - | avconv -re -i - -nostats -c copy -copyts -an -r 25 -f flv rtmp://mercure:1935/live/cam-1

Strona serwera RTMP / HTTP

Wydaje się, że wszystkie posty dotyczą tego typu konfiguracji (fragment /etc/nginx.conf). Działa to podczas czytania czystych strumieni rtmp za pośrednictwem ffplay, jak wspomniano powyżej

rtmp {

        server {

            listen 1935;
            chunk_size 4000;

            application live {

                    live on;

            }

            application hls {
                    live on;              
                    hls on;
                    hls_path /tmp/hls;

            }
         }
}

http {

    server {

            server_name     mercure;

            location / {
                root   /var/www;
                index  index.html;
            }

            location /hls{

                    types {
                            video/MP2T ts;
                            application/vnd.apple.mpegurl m3u8;
                    }

                    root /tmp;

                    add_header Cache-Control no-cache;
                    add_header Access-Control-Allow-Origin *;

            }

    }
}

Naprawdę nie rozumiem, jak nginx działa z hls ... czy strumień przychodzący z avconv (ffmpeg) jest dynamicznie przesyłany do aplikacji / hls rtmp? po odebraniu strumienia kamery tworzony jest folder / tmp / hls wraz z plikiem cam-1-0.ts ... ale nic więcej ... brak indeksu m3u8 ...

Próba uzyskania dostępu do zasobu hls za pomocą http: // mercure / hls / cam-1 (.m3u8, .m3u ...) i odpowiedzią jest błąd 404 HTTP: standardowe zachowanie HTTP.

Próbowałem nakarmić aplikację / hls rtmp, zmieniając sekcję konfiguracji na żywo rtmp

application live {

  live on;
  exec ffmpeg -i rtmp://mercure/live/cam-1 -c copy -f flv rtmp://mercure/hls/cam-1;

}

Absolutnie nie jestem pewien, czy nginx może zarządzać strumieniami HLS, podczas gdy dokumentacja mówi o tym.

Moje pytanie brzmi: czy ktoś naprawdę udaje się opublikować przychodzące źródło flv do strumienia HLS przy użyciu transportu FFMPEG i serwera NGINX / http - rtmp (/ hls / dash)?

Emmanuel
źródło

Odpowiedzi:

0

Konfiguracja: raspivid -> ffmpeg -> rtmp -> hls [ts / m3u8] -> VideoJS

Konfiguracja NGINX RTMP HLS jest bardzo prosta, więc nie będę przez to przechodził. Używam hls_fragment rozmiar 250ms i hls_playlist z 3s. Zapraszam do korzystania z mojego serwera NGINX RTMP HLS. Po prostu skopiuj i wklej dokładnie to, co jest w sekcji rtmp, ale zmień „stream_name” na coś wyjątkowego. Podobnie zmień to w VideoJS, aby móc odtwarzać go na swojej stronie internetowej. Nie gwarantuję, że aplikacja 2a będzie istnieć wiecznie, ale planuję, że będzie to moja aplikacja testowa przez jakiś czas.

  1. Tylko wideo, Raspivid -n -t 0 -h 480 -w 854 -fps 24 -b 1536000 -o - | ffmpeg -i - -c: v copy -f flv 'rtmp: //streaming.sensored.solutions/2a/stream_name' Zalety: Najłatwiejsza, solidna jakość, bez buforowania. Minusy: opóźnienie ~ 10s
  2. Tylko wideo, B raspivid -n -t 0 -h 480 -w 854 -fps 15 -b 1080000 -o - | ffmpeg -i - -c: v copy -f flv 'rtmp: //streaming.sensored.solutions/2a/nazwa_strumienia' Zalety: Małe opóźnienie, poniżej 5s. Minusy: buforowanie, jakość
  3. Wideo i audio [USB przez Sabrent i tani mikrofon 3,5 mm] raspivid -n -t 0 -h 480 -w 854 -fps 25 -b 2000000 -o - | ffmpeg -wątek_kolejki_ 512 „rtmp: //streaming.sensored.solutions/2a/stream_name” Zalety: Jakość, brak buforowania, zsynchronizowany audio / wideo. Minusy: wysoka przepływność [nie jest dobra dla wielu urządzeń korzystających z tej samej przepustowości], opóźnienie ~ 12 s - 15 s

VideoJS:

    <!--Note, you should including the following in the HEAD of your HTML file: 
    <link href="http://videojs.github.io/videojs-contrib-hls/node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
    -->
    <div class="container" id="videojs_container">
        <section class="starter-template">
            <video id=video-js-player width=854 height=480 class="video-js vjs-default-skin" controls autoplay="true" data-setup="{}" preload="auto">
                <source src = "http://streaming.sensored.solutions/2a/stream_name/index.m3u8" type = "application/x-mpegURL">
            </video>
        </section>
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <script src="http://videojs.github.io/videojs-contrib-hls/node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
    <script src="http://videojs.github.io/videojs-contrib-hls/js/ie10-viewport-bug-workaround.js"></script>
    <link href="//vjs.zencdn.net/5.4/video-js.css" rel="stylesheet">
    <script src="//vjs.zencdn.net/5.4/video.js"></script>
    <script src="http://videojs.github.io/videojs-contrib-hls/node_modules/videojs-contrib-hls/dist/videojs.hls.min.js"></script>
Plaża. Dzisiaj.
źródło