ffmpeg+nginx -------转视频流神器

    由于项目上的一些需求,需要在前端页面展示高清摄像头的的画面,此功能是原来技术人员已经实现的,但是其展示的是高清摄像头的原始rtsp流。rtsp流的播放需要NAPPI(应该没拼错)插件的支持,而NAPPI插件只在谷歌浏览器42版本之前可以使用,所以原先的技术人员,为了解决此问题,采用了降低浏览器版本的方式。此方法虽然可取,但觉得始终不是一个稳妥的方式,刚好业主提出了新的需求,要求在与摄像头网络不通的另一个网络下访问视频画面。所以,开始了折腾之路。

   在综合考量了n种方案之后,在个人能力允许及现场条件允许的前提下,我使用了nginx+ffmpeg的方式进行处理。

ffmpeg和nginx是什么,有兴趣的同学可以自己百度。ffmpeg的安装方式在此不做说明,nginx因为会有点坑。我会在下面说明。

  1. 配置文件。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的,开发语言的选择也更多样。

发布了2 篇原创文章 · 获赞 1 · 访问量 61

猜你喜欢

转载自blog.csdn.net/cainiaosl/article/details/104946273