多客户端架构 AWS EC Nginx rtmp 服务器设置,使用 Raspberry Pi 摄像头作为实时视频流的客户端

多客户端架构 AWS EC Nginx rtmp 服务器设置,使用 Raspberry Pi 摄像头作为实时视频流的客户端

我们的方法

在 AWS EC ubuntu 16.04 上设置 ngnix rtmp webserver。成功完成单个客户端(RPi 摄像头)流式传输。现在我们想在此服务器上发送多个 Pi 摄像头实时 Feed,这些 Feed 将显示在 Android 客户端应用程序上。

我们面临的问题

我们无法在 nginx rtmp 服务器上使用不同的 raspberry pi 3 流式传输多个 Pi 摄像头。当摄像头 websocket 未使用时(当摄像头流式传输关闭时),我们无法将其分离。我们希望将此可用的 websocket 分配给另一台摄像头,该摄像头必须在 nginx webserver 上发出新的流式传输连接请求。

我们的期望

我们想要同时与多个客户端(Raspberry Pi/Android APP 用户)设置 nginx rtmp 服务器。

我们的设置

我们在基于 Linux 的 nginx rtmp 服务器上设置的配置文件如下:-

服务器端

#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 [email protected] "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

我们使用以下 rtmp URL 播放视频流:

rtmp://服务器ip/cam_id/live

答案1

请使用如下的 rtmp 命令“exec_kill_signal”。

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

相关内容