如果想把本地电脑屏幕或者摄像头共享给局域网的人,我们除了使用开源的软件之外还有别的方式吗?这里就使用ffmpeg和jsmpeg这两个工具来创建一个低延时高分辨率的局域网直播服务,而且是基于浏览器的,在各个浏览器以及手机上都能打开。
下面就开始吧,首先贴出命令,执行完之后,就可以在浏览器打开了 http://{本机ip}:8080/view-stream.html 看到摄像头的画面了,将命令3中的"0"换成"1",就能看到你电脑屏幕的画面了:
$:node websocket-relay.js supersecret 8081 8082
$:ffmpeg -f avfoundation -framerate 30 -video_size 640x480 -i "0" -f mpegts -codec:v mpeg1video -s 640x480 -b:v 1000k -bf 0 http://localhost:8081/supersecret
$:python3 -m http.server 8080
是不是非常简单又带有一点疑惑?那接下来就详细剖析是怎么实现的。
命令1、3其实是用的这个项目jsmpeg,一个通过websocket来接收视频流并解码MPEG1视频的js库,地址在这里:github.com/phoboslab/j… install ws)。
命令1实际上是启动了一个websocket的中继,将http格式的视频流转成了websocket视频流,至于为什么要这么操作,待最后再来解释。supersecret可以理解成http的路径,也可以作为一个密码,看自己的需求。8081就是http流的输入端口,8082则是往浏览器传输视频流的webscoket端口。
命令2就是大名鼎鼎的ffmpeg了,它读取我们的摄像头或者屏幕流以及麦克风,转码将视频流发送到http的输入。它又一系列的参数可以来调整视频的帧率、大小以及输出的编码,其中的参数可以参考ffmpeg的文档,命令的基本格式则是ffmpeg [全局参数] [输入文件参数] -i [输入文件] [输出文件参数] [输出文件]。
命令3其实很简单,就是启动一个http server,可以用nginx、node的http_server等其他的静态服务器都可以,只需要将jsmpeg目录下的view-stream.html暴露出来即可,端口号可以随意自定。当然jsmpeg.min.js和view-stream.html需要在相同目录下,否则会加载不到。而最关键的就是这个jsmpeg.min.js文件,也就是jsmpeg库,能够从websocket流中读视频流并解析。而且不仅仅是视频还能一起解析音频哟。当然也可以通过其他的语言来实现一个web服务器和websocket流。
总结来说就是这么一个流程
视频流 -> 转码 -> websocket传输 -> jsmpeg解码 -> web浏览器播放
这么一个步骤,先解释一下为什么需要websocket中继,先将视频流通过http转成websocket流传输,主要原因在于ffmpeg不支持websocket协议,所以不能直接推到websocket流中,需要步骤1做一次中转。上面的流程图中也就没有详细画出这一步。
上面的操作可以将视频传输在局域网中延时低于200ms,如果你有公网ip的画,你可以直接映射到公网上,就能得到一个网络摄像头了。
视频直播还涉及到很多的问题,这里主要介绍了一种低成本,低延时同时又是高质量的实现方式。