您的位置:首页 > 运维架构 > Nginx

树莓派使用nginx+rtmp搭建直播服务器

2017-01-11 19:50 441 查看
可以作为家用网络监控器的一种廉价解决方案

基本思路是:使用avconv/GStreamer读取摄像头并生成flv视频流 -> Strobe Media Playback接受视频流 -> nginx服务器页面嵌入Strobe的flash播放器 -> nginx的rtmp模块实现直播。

安装nginx+rtmp

参考使用 nginx 和 rtmp 插件搭建视频直播和点播服务器

安装依赖

sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev


安装nginx和rtmp

wget http://nginx.org/download/nginx-1.11.8.tar.gz wget https://github.com/arut/nginx-rtmp-module/archive/master.zip tar -zxvf nginx-1.11.8.tar.gz
unzip master.zip
cd nginx-1.11.8

./configure --with-http_ssl_module --add-module=../nginx-rtmp-module-master
make
sudo make install


修改nginx配置文件

# /usr/local/nginx/conf/nginx.conf
# 添加
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
}
}
}


安装Strobe Media Playback

参考樹莓派架設 RTMP 串流(Streaming)伺服器,傳送即時攝影機影像

这里下载最新的Strobe Media Playback

解压后

cp -r for Flash Player 10.1/ /usr/local/nginx/html/strobe


在目录 /usr/local/nginx/html下新建一个live.html

# live.html
<!DOCTYPE html>
<html>
<head>
<title>Live Streaming</title>

<!-- strobe -->
<script type="text/javascript" src="strobe/lib/swfobject.js"></script>
<script type="text/javascript">
var parameters = {
src: "rtmp://{pi_address}/live/camera",  #换成本机的ip
autoPlay: false,
controlBarAutoHide: false,
playButtonOverlay: true,
showVideoInfoOverlayOnStartUp: true,
optimizeBuffering : false,
initialBufferTime : 0.1,
expandedBufferTime : 0.1,
minContinuousPlayback : 0.1,
poster: "images/poster.png"
};
swfobject.embedSWF(
"strobe/StrobeMediaPlayback.swf"
, "StrobeMediaPlayback"
, 1024
, 768
, "10.1.0"
, "strobe/expressInstall.swf"
, parameters
, {
allowFullScreen: "true"
}
, {
name: "StrobeMediaPlayback"
}
);
</script>

</head>
<body>
<div id="StrobeMediaPlayback"></div>
</body>
</html>


安装avconv/GStreamer

这两个都是读取摄像头生成视频流的,不同的是avconv仅支持软解码,会消耗树莓派可怜的CPU资源,而GStreamer支持硬解码,理论上会比前者流畅

安装avconv

sudo apt-get install libav-tools


安装GStreamer

sudo apt-get install gstreamer1.0-tools


启动

新建一个.sh文件

#启动nginx
sudo /usr/local/nginx/sbin/nginx

#启动GStreamer
gst-launch-1.0 -v v4l2src ! 'video/x-raw, width=640, height=480, framerate=30/1' ! queue ! videoconvert ! omxh264enc !  h264parse ! flvmux ! rtmpsink location='rtmp://192.168.5.92/live/camera live=1'

#或者启动avconv
avconv -f video4linux2 -r 24 -i /dev/video0 -f flv rtmp://192.168.5.92/live/camera

#关闭nginx服务
sudo /usr/local/nginx/sbin/nginx -s stop


其他电脑浏览器(在手机测试失败,应该是浏览器不支持flash player的原因)输入网址 192.168.5.92/live.html



或者直接使用播放器(potplayer),打开流 rtmp://192.168.5.92/live/camera 也可以看

开机自启动

需要完成两个工作:ip的自动获取和文档修改、添加自启动任务

1)需要修改两个地方,一个是 /usr/local/nginx/html/live.html,一个是 gst-launch-1.0命令

# file nginx.sh
#!/usr/bin/sh

ip_addr=`/sbin/ifconfig wlan0 | grep 'inet addr' | awk '{print $2}' | awk -F ":" '{print $2}'`
echo "ip_addr=$ip_addr"

#modify ip_addr in /usr/local/nginx/html/live.html
src_ip=`cat /usr/local/nginx/html/live.html | grep rtmp.*camera`
change_to="     src: \"rtmp://$ip_addr/live/camera\","
# echo $src_ip
sed -i "s%$src_ip%$change_to%g" /usr/local/nginx/html/live.html

echo "x" | sudo -S /usr/local/nginx/sbin/nginx -s stop
echo "x" | sudo -S /usr/local/nginx/sbin/nginx

gst-launch-1.0 -v v4l2src !'video/x-raw,width=640,height=480,framerate=30/1' !queue !videoconvert !omxh264enc !h264parse !flvmux !rtmpsink location=\'rtmp://$ip_addr/live/camera live=1\'

#avconv -f video4linux2 -r 24 -i /dev/video0 -f flv rtmp://$ip_addr/live/camera 2>&1 > /home/pi/log.txt

echo "x" | sudo -S /usr/local/nginx/sbin/nginx -s stop


需要注意 ifconfig 一定要用绝对路径 /sbin/ifconfig,否则自动执行时找不到 ifconfig 命令。参考这里

另外一个细节是,sed 命令不要用 / 作为分隔符(这里用%),因为bash里会和后面的路径分割符 / 混淆。参考这里

2)自启动方法有几种,比如 rc.local和 uodate-rc.d,这里为了增加服务的鲁棒性,使用crontab计划任务监听的方式,如果没找到相应进程就启动。

# file auto_nginx.sh
#!/usr/bin/sh
export DISPLAY=:0.0

nginx_state=`ps -ef | grep lxterminal | grep nginx`
echo 'nginx_state='$nginx_state
if [ "$nginx_state" = "" ];then
lxterminal -t "nginx-gstream" -e "sh /home/pi/nginx.sh"
fi


cron里添加任务:

*/1 * * * * sh /home/pi/auto_nginx.sh


每隔1分钟执行一次脚本 auto_nginx.sh,ps -ef 检查是否有相应进程(不要用top),如果没有就直接开启一个窗口执行 nginx.sh

坑1:linux的窗口命令一般是 gnome-terminal,但树莓派用的是 lxterminal。参考这里

坑2:脚本前面要加一句 export DISPLAY=:0.0,否则cron执行 lxterminal会失败(手动输入是成功的)

原因在这里,cron并不知道当前的显示设备,所以需要手动指定一个
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: