Problemy z częstotliwością konwersji RTMP na HLS w przypadku ffmpeg / nginx

0

Obecnie pcham strumień RTMP do nginx 1.15.3 działającego na Ubuntu 18.04 LTS z kamery raspberry pi 3 (która wydaje się działać sama z siebie, mogę pobrać strumień bez problemów na VLC i sprawdzić, czy działa ) z pi za pomocą tego polecenia:

raspivid -w 640 -h 480 -fps 5 -t 0 -b 1800000 -o - | ffmpeg -y -framerate 5 -f h264 -i - -c:v copy -map 0:0 -f flv -rtmp_buffer 100 -rtmp_live live rtmp://10.2.10.149/cam01/test

Gdybym ustawił argument fps na raspivid na 25, a następnie pozbyłem się argumentu ffmpeg framerate, to byłoby to dobrze przetłumaczone na strumień HLS z tym poleceniem uruchomionym na serwerze nginx:

ffmpeg -i rtmp://10.2.10.149/cam01/test -vcodec libx264 -vprofile baseline -acodec h264 -strict -2 -f flv rtmp://10.2.10.149/show1/stream1

Potrzebuję go jednak przy niższej liczbie klatek na sekundę i wydaje się, że próba zrobienia tego w jakikolwiek sposób naprawdę zakłóca ffmpeg, ponieważ spowoduje to, że strumień będzie się zaczepiał tak, jakby czekał na załadowanie. Podejrzewam, że ma to coś wspólnego z ffmpeg mającym domyślną szybkość klatek wynoszącą 25 lub coś takiego, ponieważ w strumieniu RTMP, gdybym miał spróbować ustawić tylko argument fps w trybie raspivid na 5 i nie uwzględniać argumentu klatek w ffmpeg, wówczas zrób zaczep wideo na kilka sekund, a następnie uruchom z prędkością 5 razy większą niż sekunda, ponieważ ffmpeg nadal najwyraźniej próbuje uruchomić wideo 25 fps.

Umieszczenie argumentu klatek na sekundę w poleceniu konwersji ffmpeg jeszcze bardziej pogorszy sytuację i nie rozumiem, dlaczego to nie działa, ponieważ wydaje się, że działa dobrze dla tak wielu innych osób. Skorzystałem głównie z tego przewodnika, aby pomóc mi w konfiguracji nginx i innych zagadnień: https://docs.peer5.com/guides/setting-up-hls-live-streaming-server-using-nginx/#4 -pushing-live-stream-to-nginx-using-rtmp

Zamierzam również umieścić tutaj mój plik nginx.conf, aby wszyscy mogli go zobaczyć, i zauważam, że mam ten problem za każdym razem, gdy próbuję pobrać wideo za pośrednictwem strony internetowej lub VLC bezpośrednio uzyskuje strumień sieciowy:

worker_processes  auto;
events {
worker_connections  1024;
}

# RTMP configuration
rtmp {
server {
    listen 1935; # Listen on standard RTMP port
    chunk_size 4096;

    application show1 {
        live on;
        # Turn on HLS
        hls on;
        hls_path /mnt/hls1/;
        hls_fragment 3;
        hls_playlist_length 60;
    }
application show2 {
        live on;
        # Turn on HLS
        hls on;
        hls_path /mnt/hls2/;
        hls_fragment 3;
        hls_playlist_length 60;
    }
application show3 {
        live on;
        # Turn on HLS
        hls on;
        hls_path /mnt/hls3/;
        hls_fragment 3;
        hls_playlist_length 60;
    }
application show4 {
        live on;
        # Turn on HLS
        hls on;
        hls_path /mnt/hls4/;
        hls_fragment 3;
        hls_playlist_length 60;
    }
application show5 {
        live on;
        # Turn on HLS
        hls on;
        hls_path /mnt/hls5/;
        hls_fragment 3;
        hls_playlist_length 60;
    }
application show6 {
        live on;
        # Turn on HLS
        hls on;
        hls_path /mnt/hls6/;
        hls_fragment 3;
        hls_playlist_length 60;
    }
application show7 {
        live on;
        # Turn on HLS
        hls on;
        hls_path /mnt/hls7/;
        hls_fragment 3;
        hls_playlist_length 60;
    }
    application cam01 {
        live on;
        record off;
    }
application cam02 {
        live on;
        record off;
    }
application cam03 {
        live on;
        record off;
    }
application cam04 {
        live on;
        record off;
    }
application cam05 {
        live on;
        record off;
    }
application cam06 {
        live on;
        record off;
    }
application cam07 {
        live on;
        record off;
    }
}
}

http {
sendfile off;
tcp_nopush on;
default_type application/octet-stream;

server {
    listen 80;
    server_name localhost;
    location / {
        # Disable cache
        add_header 'Cache-Control' 'no-cache';

        # CORS setup
        add_header 'Access-Control-Allow-Origin' '*' always;
        add_header 'Access-Control-Expose-Headers' 'Content-Length';

        # allow CORS preflight requests
        if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Type' 'text/plain charset=UTF-8';
            add_header 'Content-Length' 0;
            return 204;
        }

        types {
            application/dash+xml mpd;
            application/vnd.apple.mpegurl m3u8;
            video/mp2t ts;
        }

        root /mnt/;
        location /index.html {
            default_type "text/html";
        }
        location /testing.html {
            default_type "text/html";
        }
        location /test.html {
            default_type "text/html";
        }
    location /cam01.html {
            default_type "text/html";
        }
    location /cam02.html {
            default_type "text/html";
        }
    location /cam03.html {
            default_type "text/html";
        }
    location /cam04.html {
            default_type "text/html";
        }
    location /cam05.html {
            default_type "text/html";
        }
    location /cam06.html {
            default_type "text/html";
        }
    location /cam07.html {
            default_type "text/html";
        }
    }
}
}

Jeśli muszę podać więcej szczegółów, daj mi znać, po prostu muszę poprawnie działać, zamiast wszystkich problemów, które właśnie wyjaśniłem, każda pomoc zostanie doceniona, dziękuję.

Edycja 1: Zauważam również, że na górze zaczepów i wycięć ze strumienia za pomocą drugiego polecenia, jak opisano wcześniej, wydaje się, że czasami „zacina się” w określonej ramce, nie jestem pewien, czy to jest bardziej pomocne, czy nie , chciałem się tylko upewnić, że mam wszystkie informacje, które mogę tutaj znaleźć.

Edycja 2: Zaczynam wierzyć, że jest to bardziej problem z nginx, ponieważ kiedy wskazuję pierwsze polecenie w lokalizacji / show1 / stream1, która konwertuje rtmp na hls bez uruchamiania drugiego polecenia, które moim zdaniem było całkowicie konieczne, I Dostaję ten sam dokładny problem w ten sam sposób. Nie wiem wiele o nginx i nic, co znajduję w Internecie, również nie pomaga. Byłbym bardzo wdzięczny za wgląd, wiem, że hls zawsze będzie miał duże opóźnienie i nie o to proszę, naprawiam wycięcia i zaczepienie.

Edycja 3: Być może rzeczywiście to trochę złamałem, zauważyłem na raspivid polecenie, ustawienie wyższej szybkości transmisji bitów wydawało się jednak to złagodzić, nawet jeśli ustawię szybkość transmisji na absurdalną lub nawet nie tak absurdalną, ale nadal przesadzoną , wciąż od czasu do czasu wycina kilka klatek losowo co kilka minut i nie jestem całkowicie pewien, dlaczego. Byłbym wdzięczny za każdy wgląd.

tommy61157
źródło

Odpowiedzi:

0

Przepraszam wszystkich, których pomyliłem, okazuje się, że ten kod jest poprawny (właściwie nie potrzebuję nawet drugiego polecenia, mogę go po prostu podać bezpośrednio do hls w nginx bez problemu z pi). Chodzi o to, że ffmpeg NAPRAWDĘ nie lubi brać mniej niż 7 FPS podczas tego rodzaju streamingu, który jest nadal odpowiedni do moich celów. Powinno to być gdzieś udokumentowane (tak myślę, że jest teraz, ale nadal).

Edycja: aparat, którego używam, może również wpływać na to, ponieważ właśnie zdałem sobie sprawę, że niektóre z moich kamer mają minimalną liczbę klatek na sekundę 7.

tommy61157
źródło