NGINX / RTMP / HLS transmissão ao vivo no Raspberry pi (Debian 8.4)

0

Debian 8.4 / Raspbian 8.0

Nginx 1.9.15

ffmpeg 2.6.8 (lado do servidor) / avconv 11.6-6: 11.6-1 ~ deb8u1 + rpi1 (coleta de câmera). O Avconv é um fork do FFMPEG, funciona bem em raspbian.

Esquema de fluxo

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

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

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

Li várias postagens na web há duas semanas sobre como configurar um servidor de streaming de vídeo ao vivo que recebia fluxos de vídeo de uma câmera pi de framboesa. não se preocupe com a fonte de streaming de framboesa, o problema não está focado. O objetivo é poder ler transmissões ao vivo RTMP e HLS no servidor remoto NGINX

os fatos:

Funciona, sou capaz de ler a transmissão ao vivo do servidor RTMP / NGINX via

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

nota :  ele não usa o VLC e um aplicativo QT5 que incorpora widgets QMediaPlayer / QMediaContent.  Descobri que o VLC introduz problemas com o librtmp.so no debian e parece ser o mesmo na janela 7 (o teste também falha). fonte: blog debian. A questão do QT5 talvez seja um efeito colateral, já que o QT5 talvez use a biblioteca vlc? Eu ainda estou investigando. Os componentes do QT5 podem ler qualquer arquivo de vídeo em disco, mas congelar na primeira imagem ao transmitir com o rtmp

O módulo Nginx hls está instalado.

Câmera (raspberry pi)

Para conectar o fluxo de vídeo da câmera e publicá-lo no servidor NGINX rtmp usando os pacotes raspivid e avconv (The fork do FFMPEG), o comando usado é:

puxe da câmera de raspagem (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 -

pressione para o servidor RTMP (mercure)

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

o comando completo embutido em um serviço debian é então

/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

Lado do servidor RTMP / HTTP

Todos os posts parecem indicar este tipo de configuração (excerto do /etc/nginx.conf). Isso funciona quando se lê streams puramente rtmp via ffplay como mencionado acima

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 *;

            }

    }
}

Eu realmente não entendo como o nginx funciona com hls ... o fluxo de entrada do avconv (ffmpeg) é dinamicamente enviado para o aplicativo / hls rtmp? quando o fluxo da câmera é recebido, a pasta / tmp / hls é criada junto com um arquivo cam-1-0.ts .. mas nada mais ... não há índice m3u8 ...

Tentando acessar o recurso hls com o link (.m3u8, .m3u ...) e a resposta é um erro HTTP 404 : comportamento padrão do http.

Eu tentei alimentar o aplicativo / hls rtmp alterando a seção de configuração do rtmp ao vivo

application live {

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

}

Eu não estou absolutamente confiante na capacidade do nginx de gerenciar fluxos HLS enquanto a documentação diz isso.

A minha pergunta é: alguém consegue realmente publicar a fonte flv de entrada para o fluxo HLS usando um transporte FFMPEG e o servidor NGINX / http-rtmp (/ hls / dash)?

    
por Emmanuel 10.06.2016 / 21:06

1 resposta

0

Configuração: raspivid - > ffmpeg - > rtmp - > hls [ts / m3u8] - > VideoJS

A configuração do NGINX RTMP HLS é muito direta, então não vou passar por isso. Eu uso o tamanho hls_fragment de 250ms e hls_playlist de 3s. Sinta-se à vontade para usar o meu servidor NGINX RTMP HLS. Apenas copie e cole exatamente o que está na seção rtmp, mas mude 'stream_name' para algo único. Da mesma forma, mude isso no VideoJS para que você possa reproduzi-lo em sua página da web. Não estou garantindo que o aplicativo 2a existirá para sempre, mas planejo que seja meu aplicativo de teste por um tempo.

  1. Somente vídeo, A raspivid -n -t 0 -h 480 -w 854 -fps 24 -b 1536000 -o - | ffmpeg -i - -c: v copia -f flv 'rtmp: //streaming.sensored.solutions/2a/stream_name' Prós: Qualidade mais fácil e sólida, sem buffer. Contras: ~ 10s latência
  2. Somente vídeo, B raspivid -n -t 0 -h 480 -w 854 -fps 15 -b 1080000 -o - | ffmpeg -i - -c: v copia -f flv 'rtmp: //streaming.sensored.solutions/2a/stream_name' Prós: baixa latência, abaixo de 5s. Contras: Buffer, Qualidade
  3. Vídeo e áudio [USB via Sabrent e microfone barato de 3,5 mm] raspivid -n -t 0 -h 480 -w 854 -fps 25 -b 2000000 -o - | ffmpeg -thread_queue_size 512 -i - -itsoffset 00: 00: 05.22 -f alsa -ac 1 -i hw: 0,0 -map 0: 0 -map 1: 0 -c: aac -c: v cópia -f flv 'rtmp: //streaming.sensored.solutions/2a/stream_name' Prós: Qualidade, Sem buffer, Áudio / vídeo sincronizado. Contras: Alta taxa de bits [não é bom para vários dispositivos usando a mesma largura de banda], Latência ~ 12s - 15s

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><scriptsrc="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><linkhref="//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>
    
por 14.02.2017 / 23:56