视频监控解决方案(BS架构,支持window、linux、linux arm)
开源流媒体服务器(m7s)+ webrtc
优势:跨平台,低延时,低配置可跑多路视频流,低CPU,使用浏览器硬解,前端就够完成开发
流媒体:https://m7s.live/
播放器:http://jessibuca.monibuca.com/
github:https://github.com/langhuihui/monibuca
文档:http://docs.monibuca.com/
普通功能
1. 通过ffmpeg向m7s进行推流
ffmpeg -i **** rtsp://localhost/live/test
bat文件
:loop
D:\StreamingMedia\ZLMRelease\ffmpeg\bin\ffmpeg.exe -re -i D:\StreamingMedia\MP4\dock1.mp4 -strict -2 -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://192.168.0.113/live/test1
goto loop
2. 拉流转发
3. GB28181 api接口
3.1 获取在线设备
http://localhost:8081/api/gb28181/list
[{
"ID": "34020000001110000107",
"Name": "Network Video Recorder",
"Manufacturer": "HIKVISION",
"Model": "DS-7816N-R2",
"Owner": "",
"RegisterTime": "2022-05-05T09:49:37.2410515+08:00",
"UpdateTime": "2022-05-05T09:56:31.5065763+08:00",
"LastKeepaliveAt": "2022-05-05T09:56:31.5065763+08:00",
"Status": "ONLINE",
"Channels": [{
"DeviceID": "34020000001320000011",
"ParentID": "",
"Name": "Camera 01",
"Manufacturer": "Manufacturer",
"Model": "Camera",
"Owner": "Owner",
"CivilCode": "CivilCode",
"Address": "192.168.0.11",
"Parental": 0,
"SafetyWay": 0,
"RegisterWay": 1,
"Secrecy": 0,
"Status": "OFF",
"RecordPublisher": null,
"LivePublisher": null,
"LiveSubSP": "",
"Records": null,
"RecordStartTime": "",
"RecordEndTime": ""
}],
"Addr": "192.168.0.104:5060",
"SipIP": "192.168.0.113"
}, {
"ID": "34020000001320000020",
"Name": "IPC-HFW2433DM-LED",
"Manufacturer": "Dahua",
"Model": "IPC-HFW2433DM-LED",
"Owner": "",
"RegisterTime": "2022-05-05T09:49:34.9500624+08:00",
"UpdateTime": "2022-05-05T09:56:34.9891245+08:00",
"LastKeepaliveAt": "2022-05-05T09:56:34.9893935+08:00",
"Status": "ONLINE",
"Channels": [{
"DeviceID": "34020000001320000020",
"ParentID": "34020000001320000020",
"Name": "IPC",
"Manufacturer": "Dahua",
"Model": "IPC-HFW2433DM-LED",
"Owner": "0",
"CivilCode": "340200",
"Address": "axy",
"Parental": 0,
"SafetyWay": 0,
"RegisterWay": 1,
"Secrecy": 0,
"Status": "ON",
"RecordPublisher": null,
"LivePublisher": {
"URL": "",
"StreamPath": "34020000001320000020/34020000001320000020",
"Type": "GB28181 Live",
"StartTime": "2022-05-05T09:49:35.0313162+08:00",
"Subscribers": null,
"VideoTracks": {
"h264": {
"CodecID": 7,
"PacketCount": 11169,
"BPS": 540346,
"SPSInfo": {
"ProfileIdc": 77,
"LevelIdc": 40,
"MbWidth": 120,
"MbHeight": 68,
"CropLeft": 0,
"CropRight": 0,
"CropTop": 0,
"CropBottom": 4,
"Width": 1920,
"Height": 1080
},
"GOP": 50,
"UsingDonlField": false
}
},
"AudioTracks": {},
"DataTracks": {},
"AutoCloseAfter": -1,
"Transcoding": null,
"ExtraProp": null,
"AppName": "34020000001320000020",
"StreamName": "34020000001320000020"
},
"LiveSubSP": "",
"Records": null,
"RecordStartTime": "",
"RecordEndTime": ""
}],
"Addr": "192.168.0.20:5060",
"SipIP": "192.168.0.113"
}, {
"ID": "34020000001320000013",
"Name": "IP DOME",
"Manufacturer": "Hikvision",
"Model": "DS-2DE2204IW-D3/W/XM",
"Owner": "",
"RegisterTime": "2022-05-05T09:49:48.42196+08:00",
"UpdateTime": "2022-05-05T09:56:54.2722771+08:00",
"LastKeepaliveAt": "2022-05-05T09:56:54.2722771+08:00",
"Status": "ONLINE",
"Channels": [{
"DeviceID": "34020000001320000013",
"ParentID": "34020000002000000001",
"Name": "IPdome",
"Manufacturer": "Hikvision",
"Model": "IP Camera",
"Owner": "Owner",
"CivilCode": "3402000000",
"Address": "Address",
"Parental": 0,
"SafetyWay": 0,
"RegisterWay": 1,
"Secrecy": 0,
"Status": "ON",
"RecordPublisher": null,
"LivePublisher": {
"URL": "",
"StreamPath": "34020000001320000013/34020000001320000013",
"Type": "GB28181 Live",
"StartTime": "2022-05-05T09:49:53.4551083+08:00",
"Subscribers": null,
"VideoTracks": {
"h264": {
"CodecID": 7,
"PacketCount": 10726,
"BPS": 461026,
"SPSInfo": {
"ProfileIdc": 77,
"LevelIdc": 42,
"MbWidth": 120,
"MbHeight": 68,
"CropLeft": 0,
"CropRight": 0,
"CropTop": 0,
"CropBottom": 4,
"Width": 1920,
"Height": 1080
},
"GOP": 50,
"UsingDonlField": false
}
},
"AudioTracks": {
"pcma": {
"CodecID": 7,
"PacketCount": 10709,
"BPS": 8000,
"SoundRate": 8000,
"SoundSize": 16,
"Channels": 1
}
},
"DataTracks": {},
"AutoCloseAfter": -1,
"Transcoding": null,
"ExtraProp": null,
"AppName": "34020000001320000013",
"StreamName": "34020000001320000013"
},
"LiveSubSP": "",
"Records": null,
"RecordStartTime": "",
"RecordEndTime": ""
}],
"Addr": "192.168.0.13:5060",
"SipIP": "192.168.0.113"
}, {
"ID": "34020000001320000012",
"Name": "IP CAMERA",
"Manufacturer": "Hikvision",
"Model": "DS-2CD3T27DWD-L",
"Owner": "",
"RegisterTime": "2022-05-05T09:49:36.9636585+08:00",
"UpdateTime": "2022-05-05T09:56:38.7406656+08:00",
"LastKeepaliveAt": "2022-05-05T09:56:38.741325+08:00",
"Status": "ONLINE",
"Channels": [{
"DeviceID": "34020000001320000012",
"ParentID": "34020000001320000012",
"Name": "Camera 01",
"Manufacturer": "Hikvision",
"Model": "IP Camera",
"Owner": "Owner",
"CivilCode": "CivilCode",
"Address": "Address",
"Parental": 0,
"SafetyWay": 0,
"RegisterWay": 1,
"Secrecy": 0,
"Status": "ON",
"RecordPublisher": null,
"LivePublisher": {
"URL": "",
"StreamPath": "34020000001320000012/34020000001320000012",
"Type": "GB28181 Live",
"StartTime": "2022-05-05T09:49:37.8322787+08:00",
"Subscribers": null,
"VideoTracks": {
"h264": {
"CodecID": 7,
"PacketCount": 11087,
"BPS": 377280,
"SPSInfo": {
"ProfileIdc": 77,
"LevelIdc": 42,
"MbWidth": 120,
"MbHeight": 68,
"CropLeft": 0,
"CropRight": 0,
"CropTop": 0,
"CropBottom": 4,
"Width": 1920,
"Height": 1080
},
"GOP": 50,
"UsingDonlField": false
}
},
"AudioTracks": {},
"DataTracks": {},
"AutoCloseAfter": -1,
"Transcoding": null,
"ExtraProp": null,
"AppName": "34020000001320000012",
"StreamName": "34020000001320000012"
},
"LiveSubSP": "",
"Records": null,
"RecordStartTime": "",
"RecordEndTime": ""
}],
"Addr": "192.168.0.12:5060",
"SipIP": "192.168.0.113"
}]
3.2 PTZ控制(参考国标协议组装ptz命令-方向、光圈、焦点、预置点)
http://192.168.0.113:8081/api/gb28181/control?id=34020000001320000013&channel=34020000001320000013&ptzcmd=A50F0108007D003A (向上速度5)
3. 录像回放(1650780387 2022-04-24 14:06:27 )
3.1 回放申请
http://localhost:8081/api/gb28181/invite?id=34020000001110000107&channel=34020000001320000011&startTime=1650780600&endTime=1650780720
3.2 在线回放 ws://localhost:8081/jessica/34020000001110000107/34020000001320000011/1650780600-1650780720 (使用MSE-demo.html)
4. webrtc在线播放视频流
http://localhost:8081/api/webrtc/play?streamPath=34020000001320000020/34020000001320000020
{
"type": "offer",
"sdp": "v=0\r\no=- 228882373012133062 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 122 127 121 125 107 108 109 124 120 123 119 35 36 37 38 39 40 114 115 116 117 118 41\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:5asH\r\na=ice-pwd:RVEEbZjdKU9FBLv8RtdyAI6b\r\na=ice-options:trickle\r\na=fingerprint:sha-256 F4:7D:A9:A1:CB:9F:14:C5:F5:0F:07:6D:90:A5:27:6B:4D:E4:F4:BC:8D:AB:A0:E3:7F:D7:8F:49:EB:D8:02:4D\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 urn:3gpp:video-orientation\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=recvonly\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=fmtp:98 profile-id=0\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 VP9/90000\r\na=rtcp-fb:100 goog-remb\r\na=rtcp-fb:100 transport-cc\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=fmtp:100 profile-id=2\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:102 VP9/90000\r\na=rtcp-fb:102 goog-remb\r\na=rtcp-fb:102 transport-cc\r\na=rtcp-fb:102 ccm fir\r\na=rtcp-fb:102 nack\r\na=rtcp-fb:102 nack pli\r\na=fmtp:102 profile-id=1\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=102\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtpmap:121 rtx/90000\r\na=fmtp:121 apt=127\r\na=rtpmap:125 H264/90000\r\na=rtcp-fb:125 goog-remb\r\na=rtcp-fb:125 transport-cc\r\na=rtcp-fb:125 ccm fir\r\na=rtcp-fb:125 nack\r\na=rtcp-fb:125 nack pli\r\na=fmtp:125 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=125\r\na=rtpmap:108 H264/90000\r\na=rtcp-fb:108 goog-remb\r\na=rtcp-fb:108 transport-cc\r\na=rtcp-fb:108 ccm fir\r\na=rtcp-fb:108 nack\r\na=rtcp-fb:108 nack pli\r\na=fmtp:108 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:109 rtx/90000\r\na=fmtp:109 apt=108\r\na=rtpmap:124 H264/90000\r\na=rtcp-fb:124 goog-remb\r\na=rtcp-fb:124 transport-cc\r\na=rtcp-fb:124 ccm fir\r\na=rtcp-fb:124 nack\r\na=rtcp-fb:124 nack pli\r\na=fmtp:124 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f\r\na=rtpmap:120 rtx/90000\r\na=fmtp:120 apt=124\r\na=rtpmap:123 H264/90000\r\na=rtcp-fb:123 goog-remb\r\na=rtcp-fb:123 transport-cc\r\na=rtcp-fb:123 ccm fir\r\na=rtcp-fb:123 nack\r\na=rtcp-fb:123 nack pli\r\na=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f\r\na=rtpmap:119 rtx/90000\r\na=fmtp:119 apt=123\r\na=rtpmap:35 H264/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=fmtp:35 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=4d001f\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:37 H264/90000\r\na=rtcp-fb:37 goog-remb\r\na=rtcp-fb:37 transport-cc\r\na=rtcp-fb:37 ccm fir\r\na=rtcp-fb:37 nack\r\na=rtcp-fb:37 nack pli\r\na=fmtp:37 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=f4001f\r\na=rtpmap:38 rtx/90000\r\na=fmtp:38 apt=37\r\na=rtpmap:39 H264/90000\r\na=rtcp-fb:39 goog-remb\r\na=rtcp-fb:39 transport-cc\r\na=rtcp-fb:39 ccm fir\r\na=rtcp-fb:39 nack\r\na=rtcp-fb:39 nack pli\r\na=fmtp:39 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=f4001f\r\na=rtpmap:40 rtx/90000\r\na=fmtp:40 apt=39\r\na=rtpmap:114 H264/90000\r\na=rtcp-fb:114 goog-remb\r\na=rtcp-fb:114 transport-cc\r\na=rtcp-fb:114 ccm fir\r\na=rtcp-fb:114 nack\r\na=rtcp-fb:114 nack pli\r\na=fmtp:114 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=64001f\r\na=rtpmap:115 rtx/90000\r\na=fmtp:115 apt=114\r\na=rtpmap:116 red/90000\r\na=rtpmap:117 rtx/90000\r\na=fmtp:117 apt=116\r\na=rtpmap:118 ulpfec/90000\r\na=rtpmap:41 flexfec-03/90000\r\na=rtcp-fb:41 goog-remb\r\na=rtcp-fb:41 transport-cc\r\na=fmtp:41 repair-window=10000000\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 0 8 106 105 13 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:5asH\r\na=ice-pwd:RVEEbZjdKU9FBLv8RtdyAI6b\r\na=ice-options:trickle\r\na=fingerprint:sha-256 F4:7D:A9:A1:CB:9F:14:C5:F5:0F:07:6D:90:A5:27:6B:4D:E4:F4:BC:8D:AB:A0:E3:7F:D7:8F:49:EB:D8:02:4D\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=recvonly\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\n"
}
备注:webrtc比jessibuca播放器更低延时(200-300ms),推荐使用
5. 直播功能(手机端或者web端pull视频流,用webrtc播放)
客户机用Chrome访问服务端,提示TypeError: Cannot read property 'getUserMedia' of undefined ,解决方案
chrome://flags/#unsafely-treat-insecure-origin-as-secure
重启Chrome
6. webrtc断网重连、截图、录像
player-via-3x3.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律