由于项目上的一些需求,需要在前端页面展示高清摄像头的的画面,此功能是原来技术人员已经实现的,但是其展示的是高清摄像头的原始rtsp流。rtsp流的播放需要NAPPI(应该没拼错)插件的支持,而NAPPI插件只在谷歌浏览器42版本之前可以使用,所以原先的技术人员,为了解决此问题,采用了降低浏览器版本的方式。此方法虽然可取,但觉得始终不是一个稳妥的方式,刚好业主提出了新的需求,要求在与摄像头网络不通的另一个网络下访问视频画面。所以,开始了折腾之路。
在综合考量了n种方案之后,在个人能力允许及现场条件允许的前提下,我使用了nginx+ffmpeg的方式进行处理。
ffmpeg和nginx是什么,有兴趣的同学可以自己百度。ffmpeg的安装方式在此不做说明,nginx因为会有点坑。我会在下面说明。
- 配置文件。nginx在这个需求中,扮演着流媒体服务器的角色,其配置也会影媒体流播放的效果。附配置文件
worker_processes 1;
error_log logs/error.log debug;
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
application live {
live on;
}
application hls {
live on;
hls on;
hls_path temp/hls;
hls_fragment 1s;
hls_playlist_length 3s;
}
}
}
http {
server {
listen 8042;
location / {
root html;
}
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root html;
}
location /hls {
#server hls fragments
types{
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias temp/hls;
expires -1;
}
}
}
摄像机的原始视频流是rtsp流,我将其转成了rtmp流,其兼容性比rtsp流要好一些,但需要浏览器开启flash支持,还有一种流为hls流,此为直播流,兼容性最好,但经过我实际测试,延迟太大,达不到业主需求,故放弃。上图代码中,rtmp对应的就是对应rtmp流的配置。
2.nginx的启动方式,安装后的根目录下会出现,nginx.exe图标,但nginx的启动不能通过直接点击nginx.exe进行,需要通过cmd命令行进行开启。第一句start 是开启nginx服务,第二行stop.bat 是确认服务开启成功,如果有报错,可以自行排查,无问题后可以再次输入start nginx.exe 命令进行恢复
以上都是视频转流的准备工作,下面的步骤才是实现转换视频流并挂载的核心代码。
ffmpeg.exe -ss 0 -rtsp_transport tcp -i rtsp://账户名:密码@ip地址:554/h264/ch1/main/av_stream -vcodec copy -acodec aac -f flv rtmp://挂载服务器地址:配置端口/hls/hlstest
这句代码的作用就是进行视频流的转换和挂载。其中
这个地址是海康威视的标准视频流地址,其中账户名,密码对应的是其云台的账户名及密码
其工作原理为
通过3号机拉取.1网段下的视频流挂载到3号机器的.3网段的地址上,以达到.3网段的1号机可以访问到不同网段下的2号机器的视频画面
海康和大华等摄像机厂家也都提供了sdk进行接入,但在此次需求中,需要实现的功能并不多,所以我觉得没必要去集成对应的sdk,同时这种方式受不同网段的限制最小。最为符合此次需求。而且此代码都是基于cmd的,开发语言的选择也更多样。