隐藏

C# RTMP推流到网页实现直播

发布:2021/5/17 17:09:58作者:管理员 来源:本站 浏览次数:2103

最近想实现智能家居的监控功能,在网页上面查看摄像头图像。但是对于一般的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
C# RTMP推流到网页实现直播插图
支持的摄像头设备

记录下摄像头名称。然后使用以下代码推流该摄像头:

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"
C# RTMP推流到网页实现直播插图1

推流地址“rtmp://服务器地址/living/video”中, video可以换成任意字符串,同样的拉流地址也应该和推流地址相同。

如何在网页上面通过H5播放器播放视频流?

任意找一个开源的,支持websocket live的H5播放器,此处以playease为例,下载demo并运行,地址栏填写

ws://服务器地址:8080/websocketplay/video

点击播放,就可以看到视频啦。

C# RTMP推流到网页实现直播插图2
网页播放

playease 项目地址:

https://github.com/studease/playease

web demo下载:demo

注意:第一种方式没有推送websocket-flv或者http-flv流,不支持在Web浏览器中通过H5播放器播放。