流媒体服务器、海康威视⼤华摄像头实现视频监控、直播解决⽅案(转)
随着互联⽹+物联⽹进程的加快,视频监控应⽤领域变得越来越⼴泛,其中海康威视⼤华等品牌的摄像头频繁出现在视野中。由于去年也实现过智慧⼯地项⽬上的视频监控⽅
案,加上当今直播趋势不减。现在总结⼀下:
缘由:是1对N点对多的直播⽅式,⼀般都是采⽤服务器转发,所以此处不考虑WebRTC这种端对端的⽅式,WebRTC将在下⼀篇⽂章中讲解下实现思路。
前提:需要海康威视或⼤华的摄像头,⼤华摄像头清晰度品质较好,但相对于海康的摄像头较贵,所以海康威视的摄像头更受⼝袋欢迎。
⼀.⾃建流媒希字取名的寓意 体服务器
第⼀种⽅式就是⾃建流媒体服务器,然后⾃⼰实现采集推流到服务器拉流到客户端播放。先看⼀张图:
1.先客户端软件或设备采集视频流和语⾳流,或者是摄像头硬件采集的画⾯流等(如何采集就属于硬件相关的问题了,此处不讨论)
2.然后通过推流的⽅式推到流媒体服务器,推流协议可以使⽤RTMPRMSP,这2种都是基于tcp的不会丢包。但是很容易造成⾼延迟(具体的看服务器⽹络是否做CDN来⽀
撑)。
1//可指定h264或h265编码,可以把h265编码看成是h264编码的升级版,在码率体积清晰度移动补偿上更友好些
2//⼤体结构为:rtsp://摄像头⽤户名:密码@地址:端⼝服务器上地址参数...
3rtsp://admin:yjt_jiankong@192.168.0.60:554/h264/ch1/main/av_stream
4rtsp://admin:yjt_jiankong@192.168.0.60:554/Streaming/Channels/101?transportmode=unicast
以上⽅式只是实现了流推送到了服务器,并没有指定它播放地址以及播放的转码。因此我们可以考虑使⽤ffmpeg,这是⼀套可以⽤来记录、转换数字⾳频、视频,并能将其
转化为流的开源计算机程序。也就是使⽤ffmpeg不光可以本地采集流还可以指定推送到那⼀台服务器上和它的播放地址等等;
1//ffmpeg-re-i表⽰使⽤的协议和协议的参数,具体的参数意义请百度
2//接着是和上⾯⼀样的推流,这⾥使⽤的是rtsp,建议⽤rtmp,本帅在使⽤中感觉rtmp兼容性更好web前端使⽤rtmp更⽅便。⽐如前端⽤Flash插件。或者Video标签等等。
3//然后是基于tcp转码播放的地址,⽐如播放地址是:rtsp://117.250.250.250/Cameratest
4ffmpeg-re-irtsp://admin:yjt_jiankong@192.168.0.60:554/h264/ch1/main/av_stream-rtsp_transporttcp-vcodech264-frtsprtsp://localhost/test
5ffmpeg-irtsp://admin:yjt_jiankong@192.168.0.60:554/h264/ch1/main/av_stream-rtsp_transporttcp-vcodech264-frtsprtsp://117.250.250.250/Cameratest
注意播放地址前指定播放协议,⽐如rtsprtsp://117.250.250.250/Cameratest。如果是rtmp那么最后就应该是:rtmprtmp://
3.流媒体服务器做⼀些编码转码处理等顶岗实习周报 将流分发给各个客户端,进⽽进⾏拉流播放。那么问题来了如何实现流媒体服务器呢?如何架设
4.架设上我们可以使⽤nginxrtmp-module模块来架设,架设好后就可以使⽤rtmp推流给它。还可以⽤上⾯第2点中的ffmpeg命令写⼀个bat脚本来测试摄像头和架设的流媒
体。
端播放使⽤rtmpFlash来进⾏播放(H5中的Video标签了解⼀下),移动端播放使⽤HLSm3u8rtmp来进⾏播放(具体播放⽅式视项⽬框架情况⽽定)。看⽹上有⼈还使
⽤flv+httpstream进⾏播放的。
6.后期出现了并发播放量增多的压⼒可以把nginx做分层(接⼊层+交换层),或者是转发⼀下做负载均衡,或者CDN来⽀撑。前期如果考虑到很多英语怎么说 后期会使⽤CDN也可以直接跳
过nginx⼀开始⽤cdn的直播服务。
⼆.接⼊第三⽅平台
在之前的项⽬中是购买了海康威视的摄像头,所以为了⽅便快捷的开发,是接⼊了第三⽅平台,由第什么英文歌好听 三⽅平台进⾏管理和转发。⼤体流程是往第三⽅平台注册摄像头信息
(序列号验证码),然后流直接⾛第三⽅平台,⾃⼰服务端只需要获取三⽅平台的API接⼝便能得知播放地址直接客户端播放。使⽤的是。
我们可以在⾃⼰的项⽬中往萤⽯云注册摄像头信息(也就是调⽤萤⽯云接⼝往萤⽯云写⼀条数据),然后在需要⽤的地⽅获取萤⽯云API接⼝播放地址。完全不⽤管流的处
理(得充值)。
提供⼀份对萤⽯云请求封装的类(C#代码):
;
2usingSystem;
c;
;
;
s;
;
;
;
10
11/*20190819bysuzong*/
13{
14///
15///萤⽯云请求封装
16///
17publicclassYsClient
18{
19privatestaticreadonlystringrequestUrl="/";
20privatestaticreadonlystringappKey="";//官⽹注册获得
21privatestaticreadonlystringappSecret="";//官⽹注册获得
22
23///
24///获得token
25///
26///
27publicstaticasyncTask
28{
29stringkey=ting("CacheKey:YsToken")??"YsAccessToken";
30stringtokenStr=(key)?.ToString();
31if(OrEmpty(tokenStr))
32{
33stringstr=stAsync($"{requestUrl}api/lapp/token/get?appKey={appKe十大禁令 y}&appSecret={appSecret}");
34YsResultresult=alizeObject
35//缓存token缓存时间为5天
36tokenStr=result?.data?.accessToken;
(key,tokenStr,ys(5));
38}
39returntokenStr;
40}
41
42///
43///添加设备
44///
45///
46///
47///
48publicstaticasyncTask
49{
50if(OrEmpty(deviceSerial)||OrEmpty(validateCode))
51returnnewYsResult(){code="-1",msg="缺少验证码或序列号"};
52
53stringstr=stAsync($"{requestUrl}api/lapp/device/add?accessToken={GetToken().Result}&deviceSerial={r()}&validateCode={r()}");
alizeObject
55}
56
57///
58///关闭视频加密
59///
60///
61///
62///
63publicstaticasyncTask
64{
65i正负零符号怎么打 f(OrEmpty(deviceSerial)||OrEmpty(validateC美声 ode))
66returnnewYsResult(){code="-1",msg="缺少验证码或序列号"};
67stringstr=stAsync($"{requestUrl}api/lapp/device/encrypt/off?accessToken={GetToken().Result}&deviceSerial={r()}&validateCode={r()}");
alizeObject
69}
70
71///
72///删除设炒田螺的家常做法 备
73///
74///
75///
76///
77publicstaticasyncTask
78{
79if(OrEmpty(deviceSerial))
80returnnewYsResult(){code="-1",msg="缺少序列号"};
81
82stringstr=stAsync($"{requestUrl}api/lapp/device/delete?accessToken={GetToken().Result}&deviceSerial={r()}");
alizeObject
84}
85
86///
87///获取直播地址WSS地址#get请求每次获取
88///
89///
90///
91///
92///
93publicstaticasyncTask
94{
95if(OrEmpty(deviceSerial)||OrEmpty(validateCode))
96returnnull;
97//{"retcode":0,"msg":"成功","data":{"tokens":["3t0dkdn62x5qf257es7dbq1cie-1vwkltfwtz-1w1jc79-9eabx2bbz"],"params":"&auth=1&biz=4&cln=100"}}
98stringstr=tAsync($"{requestUrl}jssdk/ezopen/getStreamToken?accessToken={GetToken().Result}&num=1&type=live");
99YsResultresult=alizeObject
100if(e==0)
101{
102stringtokensStr=result?.data?.tokens[0];
103stringparamStr=result?.data["params"];
104//wss://:20006/live?dev=设备序列号&chn=1&stream=2&ssn=刚才获取的tokens[0]+刚才获取的params的字符串。作为wssUrl,此地址可以加上checkCode=验证码作为视频加密传输。
105return$"wss://:20006/live?dev={deviceSerial}&chn=1&stream=2&ssn={tokensStr}{paramStr}&checkCode={validateCode}";
106}
107returnnull;
108}
109
110///
111///获取直播地址#返回RTMP地址
112///
113///
114///
115///
116publicstaticasyncTask
117{
118if(OrEmpty(deviceSerial))
119returnnull;
120stringstr=stAsync($"{requestUrl}api/lapp/live/address/get?accessToken={GetToken().Result}&source={deviceSerial}:1");
121YsResultresult=alizeObject
122if(("200"))
123returnresult?.data[0]?.rtmp;
124returnnull;
125}
126
127///
128///获取设备可有的权限
129///
130///
131///
132///
133///{
134///supprot_encrypt是否⽀持视频图像加密0-不⽀持,1-⽀持
135///support_modify_pwd是否⽀持修改设备加密密码:0-不⽀持,1-⽀持
136///ptz_top_bottom是否⽀持云台上下转动0-不⽀持,1-⽀持
137///ptz_left_right是否⽀持云台左右转动0-不⽀持,1-⽀持
138///ptz_45是否⽀持云台45度⽅向转动0-不⽀持,1-⽀持
139///ptz_zoom是否⽀持云台缩放控制0-不⽀持,1-⽀持
140///ptz_focus是否⽀持焦距模式0-不⽀持,1-⽀持
141///}code:200
142///
143publicstaticasyncTask
144{
145if(OrEmpty(deviceSerial))
146returnnewYsResult
147
148stringstr=stAsync($"{requestUrl}api/lapp/device/capacity?accessToken={GetToken().Result}&deviceSerial={r()}");
alizeObject
150}
151
152///
153///云台控制开始
154///
155///
156///
157///
158///
159///
160publicstaticasyncTask
161{
162if(OrEmpty(token)||OrEmpty(deviceSerial))
163returnnull;
164stringstr=stAsync($"{requestUrl}api/lapp/device/ptz/start?accessToken={token}&deviceSerial={deviceSerial}&channelNo=1&direction={direction}&speed={speed}");
alizeObject
166}
167
168///
169///云台控制结束
170///
171///
172///
173///
174///
175publicstaticasyncTask
176{
177if(OrEmpty(token)||OrEmpty(deviceSerial))
178returnnull;
179stringstr=stAsync($"{requestUrl}api/lapp/device/ptz/stop?accessToken={token}&deviceSerial={deviceSerial}&channelNo=1&direction={direction}");
alizeObject
181}
182
183///
184///获取单个设备信息
185///
186///
187///
188///
189publicstaticasyncTask
190{
191if(OrEmpty(deviceSerial))
192returnnull;
193stringstr=stAsync($"{requestUrl}api/lapp/device/info?accessToken={GetToken().Result}&deviceSerial={deviceSerial}");
194YsRe香椿摊鸡蛋
sultresult=alizeObject
195if(("200"))
196returnresult;
197returnnull;
198}
199
200///
201///开通直播功能
202///
203///
204///
205publicstaticasyncTask
206{
207if(OrEmpty(deviceSerial))
208returnnull;
209stringstr=stAsync($"{requestUrl}api/lapp/live/video/open?accessToken={GetToken().Result}&source={deviceSerial}:1");
alizeObject
211}
212
213
214}
215
216///
217///萤⽯云返回对象
218///
219publicclassYsResult
220{
221publicstringcode{get;t;}
222publicTdata{get;t;}
223publicstringmsg{get;t;}
224publicintretcode{get;t;}
225}
226publicclassYsResult:YsResult
227{
228}
229
230///
231///萤⽯云设备能⼒集
232///
233publicclassYsRoles
234{
235///
236///是否⽀持视频图像加密0-不⽀持,1-⽀持
237///
238publicintsupprot_encrypt{get;t;}=0;
239///
240///是否⽀持修改设备加密密码:0-不⽀持,1-⽀持
241///
242publicintsupport_modify_pwd{get;t;}=0;
243///
244///是否⽀持云台上下转动0-不⽀持,1-⽀持
245///
246publicintptz_top_bottom{get;t;}=0;
247///
248///是否⽀持云台左右转动0-不⽀持,1-⽀持
249///
250publicintptz_left_right{get;t;}=0;
251///
252///是否⽀持云台45度⽅向转动0-不⽀持,1-⽀持
253///
254publicintptz_45{get;t;}=0;
255///
256///是否⽀持云台缩放控制0-不⽀持,1-⽀持
257///
258publicintptz_zoom{get;t;}=0;
259///
260///是否⽀持焦距模式0-不⽀持,1-⽀持
261///
262publicintptz_focus{get;t;}=0;
263}
264
265}
萤⽯云请求封装
三.使⽤开源流媒体框架
提醒:你所购买的摄像头硬件上都会有摄像头的名称序列号验证码信息,摄像头⼚商⽐如海康会有搜索局域⽹内摄像头的⼀个⼯具(官⽹去找)。⼀个Web界⾯的后台⽤于设
置摄像头通道配置信息等,在局域⽹内连接上摄像头浏览器地址栏输⼊对应的地址就可以登录当前摄像头后台。
附赠⼏个rtsprtmp免费测试地址(可以先让前端⽤这些地址先实现播放功能):
1rtsp://184.72.239.149/vod/mp4:BigBuckBunny_
2rtsp://195.200.199.8/mpeg4/
3rtmp://:1935/live/livestream
本文发布于:2023-03-20 15:29:18,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/aa9a039ba685c68452b86c86e59ad2be.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:摄像头品牌.doc
本文 PDF 下载地址:摄像头品牌.pdf
留言与评论(共有 0 条评论) |