树莓派使用nginx+rtmp搭建直播服务器
2017-01-11 19:50
441 查看
可以作为家用网络监控器的一种廉价解决方案
基本思路是:使用avconv/GStreamer读取摄像头并生成flv视频流 -> Strobe Media Playback接受视频流 -> nginx服务器页面嵌入Strobe的flash播放器 -> nginx的rtmp模块实现直播。
安装依赖
安装nginx和rtmp
修改nginx配置文件
到这里下载最新的Strobe Media Playback
解压后
在目录 /usr/local/nginx/html下新建一个live.html
安装avconv
安装GStreamer
其他电脑浏览器(在手机测试失败,应该是浏览器不支持flash player的原因)输入网址 192.168.5.92/live.html
或者直接使用播放器(potplayer),打开流 rtmp://192.168.5.92/live/camera 也可以看
1)需要修改两个地方,一个是 /usr/local/nginx/html/live.html,一个是 gst-launch-1.0命令
需要注意 ifconfig 一定要用绝对路径 /sbin/ifconfig,否则自动执行时找不到 ifconfig 命令。参考这里
另外一个细节是,sed 命令不要用 / 作为分隔符(这里用%),因为bash里会和后面的路径分割符 / 混淆。参考这里
2)自启动方法有几种,比如 rc.local和 uodate-rc.d,这里为了增加服务的鲁棒性,使用crontab计划任务监听的方式,如果没找到相应进程就启动。
cron里添加任务:
每隔1分钟执行一次脚本 auto_nginx.sh,ps -ef 检查是否有相应进程(不要用top),如果没有就直接开启一个窗口执行 nginx.sh
坑1:linux的窗口命令一般是 gnome-terminal,但树莓派用的是 lxterminal。参考这里
坑2:脚本前面要加一句 export DISPLAY=:0.0,否则cron执行 lxterminal会失败(手动输入是成功的)
原因在这里,cron并不知道当前的显示设备,所以需要手动指定一个
基本思路是:使用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并不知道当前的显示设备,所以需要手动指定一个
相关文章推荐
- 搭建直播服务器,使用nginx与nginx-rtmp-module搭建流媒体服务器;
- 搭建直播服务器,使用nginx与nginx-rtmp-module搭建流媒体服务器;
- 树莓派nginx+rtmp搭建直播服务器
- 使用Nginx+nginx-rtmp-module搭建直播服务器
- Mac上搭建直播服务器Nginx+rtmp
- 使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(二)
- 使用nginx-rtmp搭建视频直播服务器
- 使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(十一)
- 使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器
- 使用nginx在android手机上搭建rtmp服务器并测试
- 使用nginx-rtmp搭建视频直播服务器
- 使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(四)
- OSX安装nginx和rtmp模块(rtmp直播服务器搭建)
- 使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(五)
- iOS简单直播实现(一:创建本地rtmp服务器)Mac上搭建直播服务器Nginx+rtmp
- Mac上搭建直播服务器Nginx+rtmp
- 使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(九)
- 使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(二)
- 使用nginx与nginx-rtmp-module搭建流媒体服务器