Назад | Перейти на главную страницу

Мультиклиентная архитектура AWS EC Nginx rtmp server setup с камерой raspberry pi в качестве клиента для потоковой передачи видео в реальном времени

Наш подход

Настройте веб-сервер ngnix rtmp на AWS EC ubuntu 16.04. Успешно завершена потоковая передача с одного клиента (RPi Camera). Теперь мы хотим отправить на этот сервер прямую трансляцию с нескольких камер Pi, которая будет отображаться в клиентском приложении Android.

Проблема, с которой мы сталкиваемся

Мы не можем передавать потоковую передачу с нескольких камер Pi с разными raspberry pi 3 на сервер nginx rtmp. Мы не можем отсоединить веб-сокет камеры, когда он не используется (когда потоковая передача с камеры закрыта). Мы хотим назначить этот доступный веб-сокет другой камере, которая должна сделать новый запрос на подключение для потоковой передачи на веб-сервере nginx.

Наши ожидания

Мы хотим настроить сервер nginx rtmp с несколькими клиентами (пользователь Raspberry Pi / Android APP) одновременно.

Наша установка

Наш файл конфигурации установки на сервере nginx rtmp на базе Linux выглядит следующим образом: -

Сторона сервера

#user  nobody;
worker_processes  1;

error_log  logs/rtmp_error.log debug;
pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
      keepalive_timeout 60s;
      server {
        listen       80;
        server_name  0.0.0.0;
         location /stat.xsl {
                  root /var/www/;
               }
        location /rtmpstat {
             rtmp_stat all;
             rtmp_stat_stylesheet stat.xsl;
         }
    }
}

rtmp {
      server {
                listen 1935;
                buflen 1ms;
                application 000000002c23b846 {
                         live on;
                }
                application LaoD6Ga59p3qvCTRR5D {
                         live on;
                }
                #next
      }
}

Сторона клиента

    #!/bin/sh

    YELLOW='\033[1;33m'
    RED='\033[0;31m'
    SET='\033[0m'
    echo "${RED}RTMP${SET}"
    echo "${RED}RESOLUTION ${SET}"
    read size
    else
       sudo ssh -i camera_nginx.pem ubuntu@34.221.76.181 "sed -r -i 's|#next|\t\tapplication $1 {\
                           \n\t\t\t live on;\ 
       \n\t\t}\n\t\t#next|g' /usr/local/nginx/conf/nginx.conf"
fi

 if [ $size -eq 1 ]; then
        raspivid -n -o - -t 0 -vf -hf -w 1920 -h 1080  -fps 20 -b 6000000 | ffmpeg -re -ar 44100 -ac 2 -acodec pcm_s16le -f s16le -ac 2 -i /dev/zero -f h2$
    elif [ $size -eq 2 ]; then
      elif [ $size -eq 2 ]; then
    raspivid -n -o - -t 0 -vf -hf -w 1920 -h 1080  -fps 20 -b 4000000 | ffmpeg -re -ar 44100 -ac 2 -acodec pcm_s16le -f s16le -ac 2 -i /dev/zero -f h2$
elif [ $size -eq 3 ]; then
    raspivid -n -o - -t 0 -vf -hf -w 640 -h 480  -fps 20 -b 1000000 | ffmpeg -re -ar 44100 -ac 2 -acodec pcm_s16le -f s16le -ac 2 -i /dev/zero -f h264$
elif [ $size -eq 4 ]; then
    raspivid -n -o - -t 0 -vf -hf -w 640 -h 360  -fps 20 -b 500000 | ffmpeg -re -ar 44100 -ac 2 -acodec pcm_s16le -f s16le -ac 2 -i /dev/zero -f h264 $
else
    echo "Improper resolution"
fi

Мы воспроизводим потоковое видео по следующему URL-адресу rtmp:

rtmp: // ip-адрес сервера / идентификатор_камеры / live

Используйте команду «exec_kill_signal» для rtmp, как показано ниже.

rtmp {
         server {
                listen 1935;
                chunk_size 4096;
                buflen 1ms;
                application cam_id {
                        live on;
                         allow publish 127.0.0.1;
                        allow publish all;
                        allow play all;
                        record all;
                        record_path /home/video_recordings;
                        record_unique on;
                        hls on;
                        hls_nested on;
                        hls_path /home/hls;
                        hls_fragment 10s;
                        dash on;
                        dash_path /home/dash;
                        dash_nested on;
                        exec_kill_signal closeStreaming;
        }

    }
}

Интегрируйте приведенный ниже код в клиентскую программу / приложение, чтобы закрыть потоковую передачу.

on_die () {  
   # kill all children  
   pkill -KILL -P $$  
 }  
 trap 'on_die' closeStreaming