最近想实现智能家居的监控功能,在网页上面查看摄像头图像。但是对于一般的mjpg-streamer方案无法实现更高的安全性,而且需要映射内网中的树莓派到外网上面。既然如此,利用直播推流技术,便可以最大程度实现需要的功能了。
有两种方案实现RTMP推流并在外网播放。
第一种 利用Docker搭建RTMP服务器
(1)安装Docker
过程略
(2)拉取镜像
docker pull alfg/nginx-rtmp
(3)启动镜像
docker run -it -p 1935:1935 -p 8080:80 --rm nginx-rtmp
如果是云服务器,记得开放防火墙端口。
至此,RTMP服务器搭建完成。推流和拉流方式放在文末,还有第二种搭建方式。至于为什么要讲第二种方式,因为通过这种方式搭建的RTMP服务器只能通过VLC或者HLS播放器才能播放,在网页上面无法通过H5播放视频流(Flash可以播放HLS流,但Flash毕竟已经淘汰了)。
第二种 使用开源项目 Harmonic
Github地址: https://github.com/a1q123456/Harmonic
Harmonic 是一个用C#编写高性能的RTMP服务器,可以实时将HLS流转换为websocket-flv方式,并通过websocket推流播放。通过这种方式,就可以用H5在线播放视频流了。
下面用到的程序是我编译Harmonic然后发布的,因为Harmonic作者并没有发布直接可用的程序代码。
(1)获取程序(腾讯云Ubuntu18.04)
wget https://github.com/withsalt/LiveServer/releases/download/20191001/liveserver_linux_x64.zip
(2)解压并授权
unzip liveserver_linux_x64.zip && chmod -R 775 liveserver_linux_x64 && chmod +x liveserver_linux_x64/LiveServer
(3)运行服务器
sudo ./LiveServer
输出“10/1/2019 5:34:54 PM [Info] Server started at ws://0.0.0.0:8080 (actual port 8080)”就表示运行成功,可以推流了。
推流与播放
通过第一种方法或第二种方法搭建服务器成功之后就可以推流了。使用FFmpeg推流摄像头(Windows为例)。
首先查看电脑上面支持的摄像头设备:
ffmpeg -list_devices true -f dshow -i dummy
记录下摄像头名称。然后使用以下代码推流该摄像头:
ffmpeg -thread_queue_size 1024 -f dshow -s hd720 -i video="摄像头名称" -vcodec libx264 -pix_fmt yuv420p -preset:v ultrafast -tune:v zerolatency -f flv -an "rtmp://服务器地址/living/video"
FFmpeg参数可以说的博大精深,值得认真学习[/无奈]~~如果拉流播放效果不满意,请检查服务器带宽或者ffmpeg推流参数。
然后通过ffplay可以拉流播放和测试:
ffplay "rtmp://服务器地址/living/video"
推流地址“rtmp://服务器地址/living/video”中, video可以换成任意字符串,同样的拉流地址也应该和推流地址相同。
如何在网页上面通过H5播放器播放视频流?
任意找一个开源的,支持websocket live的H5播放器,此处以playease为例,下载demo并运行,地址栏填写
ws://服务器地址:8080/websocketplay/video
点击播放,就可以看到视频啦。
playease 项目地址:
https://github.com/studease/playease
web demo下载:demo
注意:第一种方式没有推送websocket-flv或者http-flv流,不支持在Web浏览器中通过H5播放器播放。
文章评论
请教一下 成功推流之后,h5播放器播不出怎么回事
@不打扰 你可以试试先用ffmpeg能不能播放流,如果可以播放。那就检查一哈H5播放器,不能播放,那可能推流有问题。
@afirefish,请问一下:本地推流可以,使用腾讯服务器的话,推流不成功,求什么原因
@RR 腾讯云服务器带宽多少?你看哈你本地推流码率呢