我们的方法
在 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