怎么建立网站管理系统,wordpress建站教程pdf,苏州市相城区住房和城乡建设局网站,淘宝网站建设退款1. 环境准备与SRS4编译 最近在做一个安防监控相关的项目#xff0c;需要把海康威视的摄像头视频流整合到我们的Web应用里#xff0c;让用户能通过浏览器直接看实时画面。一开始觉得这事儿挺复杂#xff0c;毕竟GB28181协议是安防行业的标准#xff0c;而Web端现在流行的是W…1. 环境准备与SRS4编译最近在做一个安防监控相关的项目需要把海康威视的摄像头视频流整合到我们的Web应用里让用户能通过浏览器直接看实时画面。一开始觉得这事儿挺复杂毕竟GB28181协议是安防行业的标准而Web端现在流行的是WebRTC这种低延迟的协议。后来发现SRS4这个流媒体服务器它新支持了GB28181的推流功能还能把流转换成RTMP和WebRTC简直就是为我们这种场景量身定做的。我花了一周多时间折腾从环境搭建到最终跑通踩了不少坑也总结了一套比较稳的流程今天就跟大家详细聊聊。首先你得有个Linux服务器我用的是一台Ubuntu 20.04的云主机配置不用太高2核4G就够跑起测试了。这里有个小建议如果你是在内网测试用虚拟机或者物理机都行但如果最终要部署到公网最好一开始就在云服务器上操作能避免很多后期网络配置的麻烦。登录服务器后第一件事就是更新系统并安装一些基础的编译工具。sudo apt update sudo apt install -y build-essential git接下来就是获取SRS的源代码。这里有个关键点GB28181功能目前还在feature/gb28181这个开发分支上主分支master或main默认是不包含的所以克隆代码后一定要记得切换分支。git clone https://github.com/ossrs/srs.git cd srs git checkout feature/gb28181切换到正确的分支后就可以开始编译了。编译命令和普通的SRS有点区别需要显式地开启gb28181这个模块。./configure --with-gb28181 make clean make这个过程可能会花上几分钟取决于你服务器的性能。编译成功后在objs目录下就会生成srs这个可执行文件。我遇到过编译失败的情况多半是因为系统缺少某些依赖库比如pcre或者openssl。如果遇到报错可以根据提示安装对应的开发包一般sudo apt install -y libpcre3-dev libssl-dev就能解决。2. 核心配置文件深度解析编译完成只是第一步真正让SRS按照我们想法工作的是配置文件。SRS4对接GB28181的配置文件逻辑不简单我刚开始看官方给的push.gb28181.conf示例时也是一头雾水每个参数都得反复试。下面我就结合自己的理解把这个配置文件掰开揉碎了讲清楚。首先你得在srs/trunk/conf/目录下找到或者自己创建一个配置文件比如我就叫它my_gb28181.conf。配置文件的开头部分定义了SRS的基础运行参数。listen 1935; max_connections 1000; daemon off; srs_log_tank console;listen 1935定义了RTMP服务的监听端口这是给传统Flash播放器或者OBS这类推流工具用的。daemon off表示在前台运行方便我们看日志排错等一切稳定后可以改成on让它后台运行。srs_log_tank console是把日志打到控制台调试阶段非常有用。接下来的http_api和http_server模块是SRS的管理和监控界面。http_api { enabled on; listen 1985; } http_server { enabled on; listen 8080; dir ./objs/nginx/html; }http_api开启了RESTful API服务监听在1985端口。后面我们通过API来查询设备、发起拉流请求都得靠它。http_server则是一个简单的HTTP文件服务器监听8080端口主要用于提供SRS的Web管理界面后面会提到的players播放器和HTTP-FLV流的访问。重头戏是stream_caster块这是GB28181功能的核心。stream_caster { enabled on; caster gb28181; output rtmp://127.0.0.1:1935/live/[stream]; listen 9000; rtp_port_min 58200; rtp_port_max 58300; wait_keyframe off; rtp_idle_timeout 30; audio_enable on; host 192.168.2.100; auto_create_channel off; ... }caster gb28181指定流转换器类型为国标协议。output这是最关键的参数之一。它定义了GB28181流转发到哪。[stream]是一个变量会被自动替换为通道ID格式通常是chid[ssrc]。这里配置的是转发到本地的RTMP服务rtmp://127.0.0.1:1935/live/意味着摄像头推上来的PS流会被SRS解封装并转封装成FLV格式推送到自己的RTMP服务上。这样RTMP拉流地址就固定为rtmp://服务器IP:1935/live/通道ID。listen 9000这是SIP信令和媒体流复用的UDP监听端口。摄像头会向这个端口发送SIP注册、心跳以及RTP媒体包。rtp_port_min/max当invite_port_fixed为off时SRS会从这个端口范围内为每个视频通道动态分配一个RTP接收端口。固定端口模式则只用listen的端口。host这是最容易出错的地方这个IP地址必须是摄像头能够访问到的服务器地址。如果你服务器有公网IP就填公网IP如果是复杂的内网环境比如摄像头和服务器不在同一个局域网就需要做端口映射并填写映射后的公网IP和端口。填错了摄像头就注册不上或者能注册但流推不过来。auto_create_channel建议先设为off。如果为onSRS会在收到RTP包时自动创建播放流这不利于管理。设为off后我们需要通过HTTP API主动发送invite命令SRS才会请求摄像头推流这样控制力更强。在stream_caster内部还有一个sip配置块用于定义SIP服务器的参数这些参数必须和摄像头后台配置的完全一致。sip { enabled on; listen 5060; serial 34020000002000000001; realm 3402000000; ack_timeout 30; keepalive_timeout 120; auto_play on; invite_port_fixed on; query_catalog_interval 60; }serial和realm这是SRS作为SIP服务器的ID和域。你可以自定义但一定要记住后面摄像头配置里要填一模一样的。我一般用测试编号34020000002000000001和3402000000。auto_play如果设为on设备注册成功后SRS会自动向其发送INVITE请求开始推流。对于测试和简单场景很方便。但在生产环境更推荐设为off通过API按需拉流节省设备和服务器带宽。invite_port_fixed我强烈建议设为on。这意味着摄像头会把音视频RTP流都发到listen指定的端口9000。如果设为offSRS会为音频和视频分配不同的端口在复杂的网络环境下尤其是经过NAT防火墙时很容易导致音频或视频端口不通只有画面没有声音或者有声音没画面。最后为了让Web端能用WebRTC播放还需要配置rtc_server和对应的vhost。rtc_server { enabled on; listen 8000; candidate 192.168.2.100; } vhost __defaultVhost__ { rtc { enabled on; bframe discard; rtmp_to_rtc on; } }rtc_server定义了WebRTC服务的UDP监听端口8000。candidate同样要填写服务器对外的IP地址WebRTC的ICE协议需要用它来建立连接。在vhost里开启rtc功能并设置rtmp_to_rtc on这表示允许将RTMP流转发为WebRTC流。这样同一个视频源就有了RTMP和WebRTC两种输出格式。3. 启动SRS与海康摄像头配置实战配置文件弄好之后就可以启动SRS了。建议第一次启动时在前台运行并打开详细日志方便观察。./objs/srs -c conf/my_gb28181.conf如果看到日志里没有报错并且出现了“SRS/4.0”之类的启动成功信息就说明服务跑起来了。你可以打开浏览器访问http://你的服务器IP:8080应该能看到SRS的欢迎页面。再访问http://你的服务器IP:8080/players/就能看到内置的播放器测试页面这个页面我们后面会用到。接下来是摄像头端的配置。我以海康威视的摄像头网页管理后台为例不同型号界面可能略有差异。首先用浏览器访问摄像头的IP地址登录进去。找到GB28181配置页面一般在“网络” - “高级配置” - “平台接入”里面。有的型号也叫“国标协议”或“GB/T 28181”。启用并填写参数启用勾选启用GB28181。对接方式选择“客户端”或“下级平台”。SRS在这里扮演的是**上级平台SIP Server**的角色。SIP服务器ID填写配置文件中sip.serial的值例如34020000002000000001。SIP服务器域填写配置文件中sip.realm的值例如3402000000。SIP服务器地址填写配置文件中host的IP地址即你的SRS服务器IP。SIP服务器端口填写配置文件中sip.listen的端口默认是5060。设备ID这是摄像头的唯一标识可以自定义一个20位的数字比如34020000001320000001。这个ID很重要后续拉流地址里会用到。本地SIP端口摄像头自身SIP通信的端口默认5060如果同一局域网有多个摄像头需要改为不同端口避免冲突。传输协议选择UDP。SRS的GB28181模块目前主要支持UDP传输。视频通道编码ID这个就是流ID或通道号。通常格式是设备ID通道号例如3402000000132000000134020000001320000002。其中34020000001320000002是通道号对于单通道摄像头通道号一般是在设备ID基础上变化最后几位。这个编码ID最终会对应到SRS拉流地址中的[stream]部分。音频配置如果需要在摄像头的音视频编码参数页面将音频编码格式设置为AAC音频采样率设置为44100Hz。这是因为FLV格式对AAC音频的采样率有特定要求11025, 22050, 44100设为44100兼容性最好。同时记得在SRS配置文件中将audio_enable设为on。保存并重启配置完成后保存并重启摄像头使其生效。配置完摄像头回头看看SRS的日志。如果网络通畅且配置正确你应该能看到类似[gb28181] device registered这样的日志表示摄像头已经成功注册到SRS平台上了。4. 流地址生成与多协议拉流测试摄像头注册成功只代表信令通了并不代表视频流已经开始推送。根据之前配置文件里auto_play的设置有两种情况如果auto_play为on注册后SRS会自动邀请摄像头推流视频流会自动建立。如果auto_play为off生产环境推荐则需要我们手动触发。手动触发需要使用SRS的HTTP API。假设你的设备ID是34020000001320000001通道编码ID是3402000000132000000134020000001320000002。首先查询已注册的设备curl http://192.168.2.100:1985/api/v1/gb28181/?actionquery_sessions这个命令会返回一个JSON里面包含了注册设备的ID等信息。然后向指定设备发起invite即请求推流curl http://192.168.2.100:1985/api/v1/gb28181/?actioninvitedevice_id34020000001320000001channel_id3402000000132000000134020000001320000002如果成功SRS日志会显示发送INVITE消息摄像头则会开始向SRS的指定端口发送RTP媒体流。流推上来之后我们就可以用不同的协议来拉流播放了。流名称Stream Key就是通道编码ID也就是上面例子中的3402000000132000000134020000001320000002。RTMP拉流 这是最传统的流媒体协议延迟在1-3秒左右兼容性极好。 拉流地址格式为rtmp://服务器IP:1935/live/流名称例如rtmp://192.168.2.100:1935/live/3402000000132000000134020000001320000002你可以用VLC、FFplay或者OBS来测试这个地址。ffplay rtmp://192.168.2.100:1935/live/3402000000132000000134020000001320000002HTTP-FLV拉流 基于HTTP长连接比RTMP更容易穿透防火墙延迟也与RTMP相近。 拉流地址格式为http://服务器IP:8080/live/流名称.flv例如http://192.168.2.100:8080/live/3402000000132000000134020000001320000002.flv同样可以用VLC或支持HTTP-FLV的播放器播放。WebRTC拉流 这是实现浏览器无插件、超低延迟可低于500毫秒观看的关键。 拉流地址格式为webrtc://服务器IP:8080/live/流名称例如webrtc://192.168.2.100:8080/live/3402000000132000000134020000001320000002测试WebRTC最方便的就是用SRS自带的播放器页面。打开http://192.168.2.100:8080/players/在播放器URL框里输入上面的WebRTC地址点击播放按钮。如果一切正常你就能在浏览器里看到实时监控画面了延迟感非常低。在实际测试中我建议先用VLC测试RTMP或FLV流确保基础流已经成功推上来且音视频正常。然后再用WebRTC测试因为WebRTC涉及UDP打洞和ICE连接在网络环境复杂时可能遇到问题。如果WebRTC无法播放但RTMP可以那问题很可能出在candidate地址配置或服务器的UDP端口8000防火墙设置上。5. 生产环境部署关键点与排坑指南在实验室里跑通只是第一步真要部署到线上环境给用户用还有一大堆坑要填。下面这些是我从几次实际项目部署中总结出来的血泪经验。第一网络与防火墙。这是最大的拦路虎。SRS需要开放多个端口1935 RTMP协议TCP8080 HTTP服务、HTTP-FLV、WebRTC信令TCP8000 WebRTC媒体数据UDP非常重要1985 HTTP APITCP建议内网访问或做好鉴权5060 SIP信令UDP9000 GB28181 RTP媒体流UDP58200-58300 RTP动态端口范围UDP如果invite_port_fixed为off尤其是UDP端口很多云服务器的安全组默认只放行TCP一定要记得把8000、5060、9000这几个UDP端口也放行。如果是公司内网还需要找网络管理员在防火墙上做映射。第二host与candidate地址配置。在云服务器或经过NAT的环境下这两个地址必须配置为客户端摄像头和浏览器能够访问到的地址。如果是公网服务器且有独立公网IP直接填公网IP。如果服务器在NAT后就需要填端口映射后的公网IP和端口。一个更动态的方法是使用$CANDIDATE环境变量SRS会自动获取出口IP但前提是你服务器的网络配置要正确。第三音频问题。没声音是常见问题。请按以下步骤检查SRS配置中audio_enable是否设为on。摄像头音频编码是否设置为AAC采样率是否为44100Hz。用VLC拉RTMP流检查是否有音频轨道。如果VLC有声音而Web页面没有可能是Web播放器的问题。第四流稳定性与自动重连。网络波动可能导致摄像头断流。SRS的GB28181模块有心跳机制keepalive_timeout但断流后的自动重连机制需要你自己在应用层实现。一个常见的做法是监控SRS的API如果发现流断开就重新发送invite请求。也可以考虑设置auto_play on让SRS在设备注册后自动拉流但这会持续消耗带宽。第五安全与鉴权。直接暴露上述端口和API是非常危险的。生产环境一定要做安全加固API鉴权1985端口的管理API不应暴露在公网。如果必须暴露应通过Nginx等反向代理增加IP白名单、HTTP Basic Auth或Token认证。拉流鉴权SRS支持Token拉流鉴权。你可以在生成拉流地址时加上一个有过期时间的token参数如?tokenxxx并在SRS配置中启用http_callback将鉴权请求回调到你自己的业务服务器进行验证。这样可以防止流地址被恶意盗用。HTTPS/WSS对于WebRTC建议配置TLS证书使用wss://和https://协议保证信令传输安全。第六性能与资源监控。单台SRS服务器能承载的GB28181连接数和并发流数取决于CPU、网络带宽和摄像头码流大小。建议在压力测试时使用SRS的http_api/api/v1/summaries或/console页面监控服务器状态关注CPU、内存、连接数等指标。对于大规模接入需要考虑集群部署方案。最后遇到问题多看日志。SRS的控制台日志信息非常详细从设备注册、信令交互到媒体流处理每一步都有输出。把日志级别调高结合Wireshark抓包分析SIP和RTP报文绝大多数问题都能定位到根源。这个过程虽然繁琐但却是解决问题最直接有效的方法。