Trzepak.pl


Nowy temat  Odpowiedz w temacie
Autor Wiadomość
Post: śr, 01 wrz 2021 21:37:53 
Odpowiedz z cytatem
Offline
Leniwy eseista
Leniwy eseista

Rejestracja: ndz, 22 sie 2010 19:16:29
Posty: 547
Z kamery IP mam strumień RTSP, który chce w jakiś sposób wyrzucić na stronie www. Znalazłem tutka pod ffmpeg https://www.youtube.com/watch?v=rgWVm_j3llo&ab_channel=AndyFordham (analogicznie zrobiłem pod debianem), ale mam spore opóźnienie, a dopuszczam max 2s.

Macie jakiś patent na streaming na żywo, ewentualnie z minimalnym opóźnieniem?


Na górę
Post: śr, 01 wrz 2021 21:43:46 
Odpowiedz z cytatem
Offline
Obsesyjny prozaik
Obsesyjny prozaik

Rejestracja: pn, 13 lip 2015 20:13:35
Posty: 1034
a) https://github.com/AirenSoft/OvenMediaEngine
WebRTC, ~0,70s opóźnienia, działa praktycznie wszędzie włącznie z iOS
Darmowe, Open Source

b) https://wmspanel.com/nimble
SLDP, ~2-3s opóźnienia, działa praktycznie wszędzie oprócz iOS (telefonów). Ejpul nie obsługuje Media Source Extensions i nie zapowiada się by to wspierali. Co jest kompletnym nieporozumieniem.
Rozwiązanie w połowie płatne, płacisz za panel zarządzania. Da się obejść generując cfg w json.

Nimble używałem, migrujemy teraz wszystko na OvenMediaEngine. Mają jeszcze trochę poprawek, ale projekt darmowy, open source i się rozwija.

HLS i MPEG-DASH oparty jest o chunki, to zawsze będzie wolne, ale jest dobre do cachowania i ma mały narzut po stronie serwera. Wystarczy mały serwer proxy do obsłużenia dużej ilości klientów. Na małej rpi 4 miałem uruchomione proxy które potrafiło oddać 1Gbps. LL-HLS, LL-DASH nie zmieniają drastycznie opóźnienia, dalej będzie większe niż 4s.
WebRTC, SLDP wymaga "indywidualnego" traktowania odbiorcy przez serwer, co powoduje wzrost obciążenia CPU z kolejnymi klientami.


Na górę
Post: czw, 02 wrz 2021 6:30:51 
Odpowiedz z cytatem
Offline
Starszy czytelnik
Starszy czytelnik
Awatar użytkownika

Rejestracja: czw, 15 lut 2007 20:47:55
Posty: 189
Zerknij na restreamer, u nas działa (-;
https://datarhei.github.io/restreamer/

_________________
Administracja zdalna
www.PRO-Admin.pl

Łącza dla ISP/zakupy grupowe
www.epix.net.pl - w kupie siła !


Na górę
Post: czw, 02 wrz 2021 7:31:00 
Odpowiedz z cytatem
Offline
Powieściopisarz
Powieściopisarz
Awatar użytkownika

Rejestracja: ndz, 18 gru 2005 14:42:14
Posty: 1539
Lokalizacja: Góry
vlop pisze:
Zerknij na restreamer, u nas działa (-;
https://datarhei.github.io/restreamer/


Również polecam, działa


Na górę
Post: czw, 02 wrz 2021 8:28:06 
Odpowiedz z cytatem
Offline
Moderator
Moderator
Awatar użytkownika

Rejestracja: czw, 18 lis 2010 9:00:53
Posty: 3743
Lokalizacja: Mazury
Ja mam coś takiego na leciwym debianie 8, tylko musisz poszukać sobie playera htm5 (jak coś znajdziesz darmowego to z chęcią przygarnę) jeśli ma działać na www:

Kod:
aptitude -t jessie-backports install gcc libpcre3 libpcre3-dev libssl-dev make unzip git -y && \
aptitude -t jessie-backports install php5 php5-fpm -y && \
aptitude -t jessie-backports install x264 libx264-dev ffmpeg -y && \
aptitude -t jessie-backports install build-essential libpcre3 libpcre3-dev libssl-dev -y


Kod:
cd /usr/src
git clone https://github.com/sergey-dryabzhinsky/nginx-rtmp-module.git
wget http://nginx.org/download/nginx-1.12.0.tar.gz
tar -xf nginx-1.12.0.tar.gz
cd nginx-1.12.0
./configure \
   --prefix=/var/www \
   --sbin-path=/usr/sbin/nginx \
   --conf-path=/etc/nginx/nginx.conf \
   --pid-path=/var/run/nginx.pid \
   --error-log-path=/var/log/nginx/error.log \
   --http-log-path=/var/log/nginx/access.log \
   --with-http_ssl_module \
   --without-http_proxy_module \
   --add-module=/usr/src/nginx-rtmp-module
make -j 1
make install


## Zawartość pliku /etc/nginx/nginx.conf
Kod:
user www-data www-data;
worker_processes  1;
events {
   worker_connections 19000;
   multi_accept on;
   use epoll;
}

http {
      server {
              listen   80; ## listen for ipv4; this line is default and implied
              #listen   [::]:80 default_server ipv6only=on; ## listen for ipv6

              root /var/www/html;
              index index.php index.html index.htm;

              server_name _;

              location / {
                      try_files \$uri \$uri/ /index.php?\$args;
              }

              location ~ \.php\$ {
              # With php5-fpm:
                      try_files \$uri =404;
                      fastcgi_pass unix:/var/run/php5-fpm.sock;
                      fastcgi_index index.php;
                      include fastcgi.conf;
              }

              # deny access to .htaccess files
              location ~ /\.ht {
                      deny all;
              }
      }
}


rtmp {
   max_streams 10000;
   #chunk_size 128;
   chunk_size 1024;
   server {
      listen 1935;
      application live {
         live on;
         meta copy;
         notify_method POST;
         exec_options on;
         wait_video on;
         notify_relay_redirect on;
         drop_idle_publisher 10s;
         sync 10ms;
         interleave on;
         idle_streams off;
         hls on;
         hls_path /tmp/hls/live;
         hls_fragment 5s;
         hls_playlist_length 30s;
         hls_fragment_naming system;
         hls_fragment_naming_granularity 500;
         #hls_sync 300ms;
         hls_cleanup on;
         #hls_nested on;
         hls_fragment_slicing aligned;
         dash on;
         dash_path /tmp/hls/dash-live;
         dash_fragment 5s;
         allow publish 127.0.0.1;
         #allow publish 0.0.0.0;
         deny publish all;
      }
   }
}


Kod:
mkdir /tmp/hls
mkdir /tmp/hls/live
nginx -t
nginx -s reload


## Zawartość pliku /etc/init.d/nginx
Kod:
#! /bin/sh
 
### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $all
# Required-Stop:     $all
# 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=/opt/bin:/opt/sbin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/nginx
NAME=nginx
DESC=nginx
 
test -x $DAEMON || exit 0
 
# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
        . /etc/default/nginx
fi
 
set -e
 
case "$1" in
  start)
        echo -n "Starting $DESC: "
        start-stop-daemon --start --quiet --pidfile /var/run/nginx.pid \
                --exec $DAEMON -- $DAEMON_OPTS
        echo "$NAME."
        ;;
  stop)
        echo -n "Stopping $DESC: "
        start-stop-daemon --stop --quiet --pidfile /var/run/nginx.pid \
                --exec $DAEMON
        echo "$NAME."
        ;;
  restart|force-reload)
        echo -n "Restarting $DESC: "
        start-stop-daemon --stop --quiet --pidfile \
                /var/run/nginx.pid --exec $DAEMON
        sleep 1
        start-stop-daemon --start --quiet --pidfile \
                /var/run/nginx.pid --exec $DAEMON -- $DAEMON_OPTS
        echo "$NAME."
        ;;
  reload)
      echo -n "Reloading $DESC configuration: "
      start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/nginx.pid \
          --exec $DAEMON
      echo "$NAME."
      ;;
  *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|restart|force-reload}" >&2
        exit 1
        ;;
esac
 
exit 0



Kod:
chmod +x /etc/init.d/nginx
/usr/sbin/update-rc.d -f nginx defaults



Kod:
mkdir /opt/cam


## Zawartość pliku /opt/cam/cam.sh
Kod:
#!/bin/bash

PPATH="$1";
HOST="$2";
STRUMIEN="$3";


   if [ "$PPATH" = "" ] || [ "$HOST" = "" ] || [ "$STRUMIEN" = "" ]; then
   echo "$0 \"SCIEZKA\" \"IP SERWERA STREAMINGu\" \"RTMP STREAMING\"";
   echo " ";
   exit 1;
   fi



 PID=`cat /var/run/nginx-$PPATH.pid 2> /dev/null`;

   ## Sprawdza czy $PID jest cyfrą
   if [[ "$PID" =~ ^[0-9]+$ ]]; then

   RUN=`ps -p $PID | grep ffmpeg | awk '{print $1}'`;

         ## Sprawdza czy uruchomiony jest proces
         if [ "$PID" != "$RUN" ]; then

         ## Sprawdza czy uruchomiony jest identyczny proces i ubija
         PIDKILL=`ps x | grep "$STRUMIEN" | grep ffmpeg | sed 's/^\s*//g' | cut -d ' ' -f 1`;
            if [ "$PIDKILL" != "" ]; then

            for PKILL in $PIDKILL; do
               if [[ "$PKILL" =~ ^[0-9]+$ ]]; then
               kill -9 $PKILL 1> /dev/null 2> /dev/null;
               fi
            done
            fi

         ffmpeg -threads auto -rtsp_transport tcp -i "$STRUMIEN" -vcodec copy -acodec libfdk_aac -ab 112k -ar 44100 -ac 2 -f flv rtmp://localhost/live/$PPATH </dev/null >/dev/null 2>/var/log/ffmpeg-nginx-$PPATH.log & echo $! > /var/run/nginx-$PPATH.pid;
         #ffmpeg -threads auto -rtsp_transport tcp -i "$STRUMIEN" -vf "movie=/opt/cam/logo.png [logo1]; [in][logo1] overlay=(main_w-overlay_w):0 [tmp]" -acodec libmp3lame -ab 122000 -ar 44100 -ac 2 -vb 800000 -b 512k -s 1280x720 -r 25 -vcodec libx264 -f flv rtmp://localhost/live/$PPATH </dev/null >/dev/null 2>/var/log/ffmpeg-nginx-$PPATH.log & echo $! > /var/run/nginx-$PPATH.pid;

         else

         ## Sprawcza czy proces działa ale strumien umarl
         iftop -t -s 5 -n > /tmp/ffmpeg-$PPATH.log
         DEAD=`cat /tmp/ffmpeg-$PPATH.log | grep "$HOST"`;
            if [ "$DEAD" = "" ]; then

            PIDKILL=`ps x | grep "$STRUMIEN" | grep ffmpeg | sed 's/^\s*//g' | cut -d ' ' -f 1`;
               if [ "$PIDKILL" != "" ]; then

               for PKILL in $PIDKILL; do
                  if [[ "$PKILL" =~ ^[0-9]+$ ]]; then
                  kill -9 $PKILL 1> /dev/null 2> /dev/null;
                  fi
               done
               fi
            fi
         fi
   else

   ## Sprawdza czy uruchomiony jest identyczny proces i ubija
   PIDKILL=`ps x | grep "$STRUMIEN" | grep ffmpeg | sed 's/^\s*//g' | cut -d ' ' -f 1`;
      if [ "$PIDKILL" != "" ]; then

      for PKILL in $PIDKILL; do
         if [[ "$PKILL" =~ ^[0-9]+$ ]]; then
         kill -9 $PKILL 1> /dev/null 2> /dev/null;
         fi
      done
      fi

   ffmpeg -threads auto -rtsp_transport tcp -i "$STRUMIEN" -vcodec copy -acodec libfdk_aac -ab 112k -ar 44100 -ac 2 -f flv rtmp://localhost/live/$PPATH </dev/null >/dev/null 2>/var/log/ffmpeg-nginx-$PPATH.log & echo $! > /var/run/nginx-$PPATH.pid;
   #ffmpeg -threads auto -rtsp_transport tcp -i "$STRUMIEN" -vf "movie=/opt/cam/logo.png [logo1]; [in][logo1] overlay=(main_w-overlay_w):0 [tmp]" -acodec libmp3lame -ab 122000 -ar 44100 -ac 2 -vb 800000 -b 512k -s 1280x720 -r 25 -vcodec libx264 -f flv rtmp://localhost/live/$PPATH </dev/null >/dev/null 2>/var/log/ffmpeg-nginx-$PPATH.log & echo $! > /var/run/nginx-$PPATH.pid;
   fi



## Zawartość pliku /opt/cam/img.sh
Kod:
#!/bin/bash

PPATH="$1";
STRUMIEN="$2";
ROZMIAR="$3";
PPATHIMG="$4";
CCHMOD="$5";
CCHOWN="$6";

   if [ "$PPATH" = "" ] || [ "$STRUMIEN" = "" ]; then
   echo "$0 \"ŚCIEŻKA\" \"RTMP STREAMINGu\" \"ROZMIAR (def: 900x506)\" \"ŚCIEŻKA ZAPISU IMG (def: /var/www/html/live)\" \"chmod (def: 0644)\" \"chown (def: www-data:www-data)\"";
   echo " ";
   exit 1;
   fi


   if [ "$ROZMIAR" = "" ]; then ROZMIAR="900x506"; fi
   if [ "$PPATHIMG" = "" ]; then PPATHIMG="/var/www/html/live"; fi
   if [ "$CCHMOD" = "" ]; then CCHMOD="0644"; fi
   if [ "$CCHOWN" = "" ]; then CCHOWN="www-data:www-data"; fi


   if [ "$PPATHIMG" = "/var/www/html/live" ] && ! [ -d "/var/www/html/live" ]; then
   mkdir /var/www/html/live
   chmod 0755 /var/www/html/live
   chown $CCHOWN /var/www/html/live

   fi
   if ! [ -d "$PPATHIMG" ]; then
   echo "brak $PPATHIMG";
   echo " ";
   exit 1;
   fi



 ffmpeg -threads auto -rtsp_transport tcp -i "$STRUMIEN" -s "$ROZMIAR" -f image2 -ss 1 -an -vframes 1 -y /tmp/img-$PPATH.jpg 1> /dev/null 2> /dev/null

  if [ -f "/tmp/img-$PPATH.jpg" ]; then
   mv "/tmp/img-$PPATH.jpg" "$PPATHIMG/$PPATH.jpg"
   chmod $CCHMOD "$PPATHIMG/$PPATH.jpg"
   chown $CCHOWN "$PPATHIMG/$PPATH.jpg"

  else
   cp "/opt/cam/nocam.jpg" "$PPATHIMG/$PPATH.jpg"
   chmod $CCHMOD "$PPATHIMG/$PPATH.jpg"
   chown $CCHOWN "$PPATHIMG/$PPATH.jpg"
  fi


Kod:
chmod +x /opt/cam/cam.sh
chmod +x /opt/cam/img.sh


## Zawartość pliku /etc/cron.d/cam
Kod:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

@reboot        root    mkdir /tmp/hls && mkdir /tmp/hls/live && /etc/init.d/nginx start 1> /dev/null 2> /dev/null

*/1 * * * *    root    /opt/cam/cam.sh "XXXXX" "x.x.x.x" "rtsp://x.x.x.x:554/mpeg4" 1> /dev/null 2> /dev/null
*/1 * * * *    root    /opt/cam/img.sh "XXXXX" "rtsp://x.x.x.x:554/mpeg4" 1> /dev/null 2> /dev/null



Do katalogu /opt/cam trzeba też dorzucić jakiś obrazek o nazwie nocam.jpg który będzie wrzucany w obrazek kamery jak zerwie połaczenie z kamerą

adres do restrimu: rtmp://y.y.y.y/live/XXXXX
adres do obrazka: http://y.y.y.y/live/XXXXX.jpg

XXXXX - to nazwa bez spacji

_________________
# https://kazuko.pl ☚☜ skrypty na LMSa, Mikrotika, Ubiquiti !!! 10% rabatu z kodem: TRZEPAKPL !!!


Na górę
Post: czw, 02 wrz 2021 10:16:01 
Odpowiedz z cytatem
Offline
Obsesyjny prozaik
Obsesyjny prozaik

Rejestracja: pn, 13 lip 2015 20:13:35
Posty: 1034
@vlop, @wojtekc, @noyo:
Kolega napisał jasno:
Cytuj:
ale mam spore opóźnienie, a dopuszczam max 2s.


Wasze rozwiązania oparte o HLS dają opóźnienie powyżej 8s :)


Na górę
Post: czw, 02 wrz 2021 10:57:05 
Odpowiedz z cytatem
Offline
Leniwy eseista
Leniwy eseista

Rejestracja: ndz, 22 sie 2010 19:16:29
Posty: 547
thekrzos pisze:
@vlop, @wojtekc, @noyo:
Kolega napisał jasno:
Cytuj:
ale mam spore opóźnienie, a dopuszczam max 2s.


Wasze rozwiązania oparte o HLS dają opóźnienie powyżej 8s :)



Dokładnie, tutaj jest szkopuł. Przez HLS uruchomiłem, ale opóźnienie jest za duże stąd szukam czegoś innego. Narazie walczę z uruchomieniem WebRTC


Na górę
Post: czw, 02 wrz 2021 11:05:01 
Odpowiedz z cytatem
Offline
Obsesyjny prozaik
Obsesyjny prozaik

Rejestracja: pn, 13 lip 2015 20:13:35
Posty: 1034
AlienMod pisze:
Narazie walczę z uruchomieniem WebRTC

Jak by co to PW. Ale dokumentacja Ovena jest dość dobrze napisana, najszybciej go w dockerze odpalić.


Wysłane z mojego KB2003 przy użyciu Tapatalka


Na górę
Post: pt, 24 wrz 2021 1:09:48 
Odpowiedz z cytatem
Offline
trzepakowy master
trzepakowy master
Awatar użytkownika

Rejestracja: pn, 01 mar 2004 17:24:42
Posty: 16707
Lokalizacja: Nowa Ruda
Jak chcesz mieć niskie opóźnienia to zainteresuj się komercyjną wersją AntMedia Server.

_________________
brk.network.devices - sieci komputerowe
http://devices.pl/


Na górę
Post: pt, 24 wrz 2021 7:57:09 
Odpowiedz z cytatem
Offline
Obsesyjny prozaik
Obsesyjny prozaik

Rejestracja: pn, 13 lip 2015 20:13:35
Posty: 1034
broken pisze:
Jak chcesz mieć niskie opóźnienia to zainteresuj się komercyjną wersją AntMedia Server.

Po co? Skoro jest OvenMediaEngine, który zrobi to samo i za darmo?


Na górę
Wyświetl posty nie starsze niż:  Sortuj wg  
Nowy temat  Odpowiedz w temacie


Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 5 gości


Nie możesz tworzyć nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Przejdź do:  
cron
Dzisiaj jest czw, 28 paź 2021 4:46:52

Strefa czasowa UTC+02:00

Moderatorzy: Administratorzy, Moderatorzy

Nakarm glodne dziecko - wejdz na strone www.Pajacyk.pl


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
SubSilver2 modified for Trzepak.pl by Colir
Polski pakiet językowy dostarcza phpBB.pl