LiveGBSHelper.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  1. using Microsoft.AspNetCore.DataProtection;
  2. using Microsoft.AspNetCore.Mvc;
  3. using Newtonsoft.Json;
  4. using RabbitMQ.Client;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Net;
  9. using System.Net.Http;
  10. using System.Net.Http.Headers;
  11. using System.Reflection;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using System.Xml.Linq;
  15. namespace Ropin.Inspection.Common.Helper
  16. {
  17. public class LiveGBSHelper
  18. {
  19. public static string loginUrl= "http://124.71.132.255:10000/";
  20. private const string username = "admin";
  21. private const string password = "62582E39C499493DCBB1344A9BCB897B";
  22. private static GBSToken tokenResult;
  23. //登录-获取token
  24. public static async Task<GBSToken> GetToken()
  25. {
  26. if (tokenResult != null && DateTime.Now < tokenResult.tokenDate)
  27. {
  28. return tokenResult;
  29. }
  30. var url = $"{loginUrl}api/v1/login?username={username}&password={password}";
  31. GBSToken token=null;
  32. try
  33. {
  34. using (HttpClient http = new HttpClient())
  35. {
  36. var requestt = new HttpRequestMessage(HttpMethod.Get, url);
  37. requestt.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  38. var response = await http.SendAsync(requestt);
  39. if (response.StatusCode == HttpStatusCode.OK)
  40. {
  41. string result = await response.Content.ReadAsStringAsync();
  42. token = JsonConvert.DeserializeObject<GBSToken>(result);
  43. tokenResult=token;
  44. tokenResult.tokenDate = DateTime.Now.AddMilliseconds(tokenResult.TokenTimeout);
  45. }
  46. }
  47. return token;
  48. }
  49. catch (Exception ex)
  50. {
  51. return null;
  52. }
  53. }
  54. //设备信息 - 查询设备通道列表
  55. public static async Task<DeviceChanneModel> GetDeviceChannellist()
  56. {
  57. if (tokenResult == null || DateTime.Now >= tokenResult.tokenDate)
  58. {
  59. tokenResult = await GetToken();
  60. }
  61. DeviceChanneModel model = new DeviceChanneModel();
  62. var url = $"{loginUrl}api/v1/device/channellist?token={tokenResult.URLToken}";
  63. try
  64. {
  65. using (HttpClient http = new HttpClient())
  66. {
  67. var requestt = new HttpRequestMessage(HttpMethod.Get, url);
  68. requestt.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  69. var response = await http.SendAsync(requestt);
  70. if (response.StatusCode == HttpStatusCode.OK)
  71. {
  72. string result = await response.Content.ReadAsStringAsync();
  73. model = JsonConvert.DeserializeObject<DeviceChanneModel>(result);
  74. }
  75. }
  76. return model;
  77. }
  78. catch (Exception ex)
  79. {
  80. return null;
  81. }
  82. }
  83. /// <summary>
  84. /// 实时直播 - 开始直播
  85. /// </summary>
  86. /// <param name="serial">设备编号</param>
  87. /// <param name="channelId">通道编号</param>
  88. /// <returns></returns>
  89. public static async Task<ChannelVideo> GeChannelVideo(string serial,string channelId)
  90. {
  91. if (tokenResult == null || DateTime.Now >= tokenResult.tokenDate)
  92. {
  93. tokenResult = await GetToken();
  94. }
  95. ChannelVideo model = new ChannelVideo();
  96. var url = $"{loginUrl}api/v1/stream/start?token={tokenResult.URLToken}&serial={serial}&code={channelId}";
  97. try
  98. {
  99. using (HttpClient http = new HttpClient())
  100. {
  101. var requestt = new HttpRequestMessage(HttpMethod.Get, url);
  102. requestt.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  103. var response = await http.SendAsync(requestt);
  104. if (response.StatusCode == HttpStatusCode.OK)
  105. {
  106. string result = await response.Content.ReadAsStringAsync();
  107. model = JsonConvert.DeserializeObject<ChannelVideo>(result);
  108. }
  109. }
  110. return model;
  111. }
  112. catch (Exception ex)
  113. {
  114. return null;
  115. }
  116. }
  117. /// <summary>
  118. /// 实时录像 - 实时录像开始
  119. /// </summary>
  120. /// <param name="serial">设备编号</param>
  121. /// <param name="channelId">通道编号</param>
  122. /// <returns></returns>
  123. public static async Task<VideoStartRecording> StartRecording(string serial, string channelId)
  124. {
  125. if (tokenResult == null || DateTime.Now >= tokenResult.tokenDate)
  126. {
  127. tokenResult = await GetToken();
  128. }
  129. VideoStartRecording DownloadURL = null;
  130. var url = $"{loginUrl}api/v1/record/start?token={tokenResult.URLToken}&serial={serial}&code={channelId}";
  131. try
  132. {
  133. using (HttpClient http = new HttpClient())
  134. {
  135. var requestt = new HttpRequestMessage(HttpMethod.Get, url);
  136. requestt.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  137. var response = await http.SendAsync(requestt);
  138. if (response.StatusCode == HttpStatusCode.OK)
  139. {
  140. string result = await response.Content.ReadAsStringAsync();
  141. DownloadURL = JsonConvert.DeserializeObject<VideoStartRecording>(result);
  142. }
  143. }
  144. return DownloadURL;
  145. }
  146. catch (Exception ex)
  147. {
  148. return null;
  149. }
  150. }
  151. /// <summary>
  152. /// 实时录像 - 实时录像停止
  153. /// </summary>
  154. /// <param name="serial">设备编号</param>
  155. /// <param name="channelId">通道编号</param>
  156. /// <returns></returns>
  157. public static async Task<VideoRecording> StopRecording(string serial, string channelId)
  158. {
  159. if (tokenResult == null || DateTime.Now >= tokenResult.tokenDate)
  160. {
  161. tokenResult = await GetToken();
  162. }
  163. VideoRecording model = null;
  164. var url = $"{loginUrl}api/v1/record/stop?token={tokenResult.URLToken}&serial={serial}&code={channelId}";
  165. try
  166. {
  167. using (HttpClient http = new HttpClient())
  168. {
  169. var requestt = new HttpRequestMessage(HttpMethod.Get, url);
  170. requestt.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  171. var response = await http.SendAsync(requestt);
  172. if (response.StatusCode == HttpStatusCode.OK)
  173. {
  174. string result = await response.Content.ReadAsStringAsync();
  175. model = JsonConvert.DeserializeObject<VideoRecording>(result);
  176. }
  177. }
  178. return model;
  179. }
  180. catch (Exception ex)
  181. {
  182. return null;
  183. }
  184. }
  185. /// <summary>
  186. /// 云端服务器录像 - 按日查询通道录像
  187. /// </summary>
  188. /// <param name="serial">设备编号</param>
  189. /// <param name="channelId">通道编号</param>
  190. /// <param name="date">日期, YYYYMMDD</param>
  191. /// <returns></returns>
  192. public static async Task<cloudrecordQuerydaily> cloudrecordQuerydaily(string serial, string channelId,string date)
  193. {
  194. if (tokenResult == null || DateTime.Now >= tokenResult.tokenDate)
  195. {
  196. tokenResult = await GetToken();
  197. }
  198. cloudrecordQuerydaily model = null;
  199. var url = $"{loginUrl}api/v1/cloudrecord/querydaily?token={tokenResult.URLToken}&serial={serial}&code={channelId}&period={date}";
  200. try
  201. {
  202. using (HttpClient http = new HttpClient())
  203. {
  204. var requestt = new HttpRequestMessage(HttpMethod.Get, url);
  205. requestt.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  206. var response = await http.SendAsync(requestt);
  207. if (response.StatusCode == HttpStatusCode.OK)
  208. {
  209. string result = await response.Content.ReadAsStringAsync();
  210. model = JsonConvert.DeserializeObject<cloudrecordQuerydaily>(result);
  211. }
  212. }
  213. return model;
  214. }
  215. catch (Exception ex)
  216. {
  217. return null;
  218. }
  219. }
  220. #region 前端设备录像
  221. /// <summary>
  222. /// 前端设备录像 - 查询录像列表
  223. /// </summary>
  224. /// <param name="serial">设备编号</param>
  225. /// <param name="channelId">通道编号</param>
  226. /// <param name="starDate">开始时间, YYYY-MM-DDTHH:mm:ss</param>
  227. /// <param name="endDate">结束时间, YYYY-MM-DDTHH:mm:ss</param>
  228. /// <returns></returns>
  229. public static async Task<playbackRecordList> playbackRecordList(string serial, string channelId, string starDate,string endDate)
  230. {
  231. if (tokenResult == null || DateTime.Now >= tokenResult.tokenDate)
  232. {
  233. tokenResult = await GetToken();
  234. }
  235. playbackRecordList model = null;
  236. var url = $"{loginUrl}api/v1/playback/recordlist?token={tokenResult.URLToken}&serial={serial}&code={channelId}&starttime={starDate}&endtime={endDate}";
  237. try
  238. {
  239. using (HttpClient http = new HttpClient())
  240. {
  241. var requestt = new HttpRequestMessage(HttpMethod.Get, url);
  242. requestt.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  243. var response = await http.SendAsync(requestt);
  244. if (response.StatusCode == HttpStatusCode.OK)
  245. {
  246. string result = await response.Content.ReadAsStringAsync();
  247. model = JsonConvert.DeserializeObject<playbackRecordList>(result);
  248. }
  249. }
  250. return model;
  251. }
  252. catch (Exception ex)
  253. {
  254. return null;
  255. }
  256. }
  257. /// <summary>
  258. /// 前端设备录像 - 开始回放
  259. /// </summary>
  260. /// <param name="serial">设备编号</param>
  261. /// <param name="channelId">通道编号</param>
  262. /// <param name="starDate">开始时间, YYYY-MM-DDTHH:mm:ss</param>
  263. /// <param name="endDate">结束时间, YYYY-MM-DDTHH:mm:ss</param>
  264. /// <returns></returns>
  265. public static async Task<ChannelVideo> playbackStart(string serial, string channelId, string starDate, string endDate,bool Download=false,int DownloadSpeed=4)
  266. {
  267. if (tokenResult == null || DateTime.Now >= tokenResult.tokenDate)
  268. {
  269. tokenResult = await GetToken();
  270. }
  271. ChannelVideo model = new ChannelVideo();
  272. var url = $"{loginUrl}api/v1/playback/start?token={tokenResult.URLToken}&serial={serial}&code={channelId}&starttime={starDate}&endtime={endDate}";
  273. if (Download)
  274. {
  275. url = $"{loginUrl}api/v1/playback/start?token={tokenResult.URLToken}&serial={serial}&code={channelId}&starttime={starDate}&endtime={endDate}&download={Download}&download_speed={DownloadSpeed}";
  276. }
  277. try
  278. {
  279. using (HttpClient http = new HttpClient())
  280. {
  281. var requestt = new HttpRequestMessage(HttpMethod.Get, url);
  282. requestt.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  283. var response = await http.SendAsync(requestt);
  284. if (response.StatusCode == HttpStatusCode.OK)
  285. {
  286. string result = await response.Content.ReadAsStringAsync();
  287. model = JsonConvert.DeserializeObject<ChannelVideo>(result);
  288. }
  289. }
  290. return model;
  291. }
  292. catch (Exception ex)
  293. {
  294. return null;
  295. }
  296. }
  297. /// <summary>
  298. /// 前端设备录像 - 回放控制
  299. /// </summary>
  300. /// <param name="streamid">回放流ID, 由开始回放接口(PlaybackStart)返回</param>
  301. /// <param name="command">回放控制类型 允许值: play, pause, teardown, scale</param>
  302. /// <param name="range">command=play 时有效,表示从当前位置以当前播放速度跳转到指定range(单位s)的时间点播放;range=now 表示从当前位置开始播放,比如:暂停后恢复播放,则指定range=now 默认值: now</param>
  303. /// <param name="scale">command=scale 时有效,倍数播放倍率,1=正常播放,大于0小于1为慢放,如:0.5=以0.5倍的速度慢放;大于1为快放,如:2=以2倍的速度快放,负数为倒放,参数意义相同 默认值: 2</param>
  304. /// <returns></returns>
  305. public static async Task<string> playbackControl(string streamid,string command,string range="now",int scale=2)
  306. {
  307. if (tokenResult == null || DateTime.Now >= tokenResult.tokenDate)
  308. {
  309. tokenResult = await GetToken();
  310. }
  311. string bol = "false";
  312. var url = $"{loginUrl}api/v1/playback/control?token={tokenResult.URLToken}&streamid={streamid}&command={command}";
  313. if (command== "play")
  314. {
  315. url = $"{loginUrl}api/v1/playback/control?token={tokenResult.URLToken}&streamid={streamid}&command={command}&range={range}";
  316. }else if (command== "scale")
  317. {
  318. url = $"{loginUrl}api/v1/playback/control?token={tokenResult.URLToken}&streamid={streamid}&command={command}&scale={scale}";
  319. }
  320. try
  321. {
  322. using (HttpClient http = new HttpClient())
  323. {
  324. var requestt = new HttpRequestMessage(HttpMethod.Get, url);
  325. requestt.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  326. var response = await http.SendAsync(requestt);
  327. if (response.StatusCode == HttpStatusCode.OK)
  328. {
  329. string result = await response.Content.ReadAsStringAsync();
  330. bol=JsonConvert.DeserializeObject<string>(result);
  331. }
  332. }
  333. return bol;
  334. }
  335. catch (Exception ex)
  336. {
  337. return "error";
  338. }
  339. }
  340. /// <summary>
  341. /// 前端设备录像 - 回放流停止
  342. /// </summary>
  343. /// <param name="streamid">回放流ID, 由开始回放接口(PlaybackStart)返回</param>
  344. /// <returns></returns>
  345. public static async Task<playbackStopPlaybackFileURL> playbackStop(string streamid)
  346. {
  347. if (tokenResult == null || DateTime.Now >= tokenResult.tokenDate)
  348. {
  349. tokenResult = await GetToken();
  350. }
  351. playbackStopPlaybackFileURL model = new playbackStopPlaybackFileURL();
  352. var url = $"{loginUrl}api/v1/playback/stop?token={tokenResult.URLToken}&streamid={streamid}";
  353. try
  354. {
  355. using (HttpClient http = new HttpClient())
  356. {
  357. var requestt = new HttpRequestMessage(HttpMethod.Get, url);
  358. requestt.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  359. var response = await http.SendAsync(requestt);
  360. if (response.StatusCode == HttpStatusCode.OK)
  361. {
  362. string result = await response.Content.ReadAsStringAsync();
  363. model = JsonConvert.DeserializeObject<playbackStopPlaybackFileURL>(result);
  364. }
  365. }
  366. return model;
  367. }
  368. catch (Exception ex)
  369. {
  370. return null;
  371. }
  372. }
  373. /// <summary>
  374. /// 前端设备录像 - 单条回放流信息
  375. /// </summary>
  376. /// <param name="streamid">回放流ID, 由开始回放接口(PlaybackStart)返回</param>
  377. /// <returns></returns>
  378. public static async Task<playbackStreaminfoEntity> playbackStreaminfo(string streamid)
  379. {
  380. if (tokenResult == null || DateTime.Now >= tokenResult.tokenDate)
  381. {
  382. tokenResult = await GetToken();
  383. }
  384. playbackStreaminfoEntity model = new playbackStreaminfoEntity();
  385. var url = $"{loginUrl}api/v1/playback/streaminfo?token={tokenResult.URLToken}&streamid={streamid}";
  386. try
  387. {
  388. using (HttpClient http = new HttpClient())
  389. {
  390. var requestt = new HttpRequestMessage(HttpMethod.Get, url);
  391. requestt.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  392. var response = await http.SendAsync(requestt);
  393. if (response.StatusCode == HttpStatusCode.OK)
  394. {
  395. string result = await response.Content.ReadAsStringAsync();
  396. model = JsonConvert.DeserializeObject<playbackStreaminfoEntity>(result);
  397. }
  398. }
  399. return model;
  400. }
  401. catch (Exception ex)
  402. {
  403. return null;
  404. }
  405. }
  406. #endregion
  407. }
  408. }
  409. public class GBSToken
  410. {
  411. public string CookieToken { get; set; }
  412. public string URLToken { get; set; }
  413. public string StreamToken { get; set; }
  414. public int TokenTimeout { get; set; }
  415. public DateTime tokenDate { get; set; }
  416. }
  417. public class DeviceChanneModel
  418. {
  419. public int ChannelCount { get; set; }
  420. public List<ChanneModel> ChannelList { get; set; }
  421. }
  422. public class ChanneModel
  423. {
  424. public string ID { get; set; } //通道编号
  425. public string DeviceID { get; set; }//设备编号
  426. public string DeviceName { get; set; }//设备名称
  427. public string DeviceCustomName { get; set; }//设备自定义名称
  428. public bool DeviceOnline { get; set; }//设备在线状态
  429. public int Channel { get; set; }//通道序号
  430. public string Name { get; set; }//通道名称
  431. public string CustomName { get; set; }//通道自定义名称
  432. public string SnapURL { get; set; }//通道快照链接
  433. public string Manufacturer { get; set; }//通道设备厂家
  434. public string CustomManufacturer { get; set; }//通道自定义设备厂家
  435. public string Model { get; set; }//通道设备型号
  436. public string CustomModel { get; set; }//通道自定义设备型号
  437. public string Owner { get; set; }//通道设备归属
  438. public string CivilCode { get; set; }//行政区域
  439. public string CustomCivilCode { get; set; }//自定义行政区域
  440. public string Address { get; set; }//安装地址
  441. public string CustomAddress { get; set; }//自定义安装地址
  442. public string Firmware { get; set; }//固件版本
  443. public string CustomFirmware { get; set; }//自定义固件版本
  444. public string SerialNumber { get; set; } //设备序列号
  445. public string CustomSerialNumber { get; set; } //自定义设备序列号
  446. public string IPAddress{get;set; }//设备/区域/系统IP地址
  447. public string CustomIPAddress { get; set; }//自定义设备/区域/系统IP地址
  448. public int Port { get; set; }//设备/区域/系统端口
  449. public int CustomPort { get; set; }//自定义设备/区域/系统端口
  450. public int Parental { get; set; }//当为通道设备时, 是否有通道子设备, 1-有,0-没有
  451. public string ParentID { get; set; }//直接上级编号
  452. public string CustomParentID { get; set; }//自定义直接上级编号
  453. public int Secrecy { get; set; }//保密属性, 缺省为0, 0-不涉密, 1-涉密
  454. public int RegisterWay { get; set; }//注册方式, 缺省为1, 1-IETF RFC3261, 2-基于口令的双向认证, 3-基于数字证书的双向认证
  455. public string Status { get; set; }//在线状态 允许值: ON, OFF
  456. }
  457. public class ChannelVideo
  458. {
  459. public string StreamID { get; set; }//回放流ID
  460. public string SMSID { get; set; }//流媒体编号
  461. public string DeviceID { get; set; }//设备编号
  462. public string ChannelID { get; set; }//通道编号
  463. public string ChannelName { get; set; }//通道名称
  464. public string FLV { get; set; }//HTTP-FLV 播放地址
  465. public string HLS { get; set; }//HLS(M3U8) 播放地址
  466. public string RTSP { get; set; }//RTSP 播放地址, 需要 SMS 配置 RTSP 端口开启 RTSP 服务
  467. public string RTMP { get; set; }//RTMP 播放地址
  468. public string SnapURL { get; set; }//快照地址
  469. public string WEBRTC { get; set; }//WEBRTC 播放地址
  470. public string WS_FLV { get; set; }//Websocket-FLV 播放地址
  471. }
  472. public class VideoRecording
  473. {
  474. public string StreamID { get; set; }
  475. public int RecordCount { get; set; }
  476. public List<VideoRecordingMode> RecordList { get; set; }
  477. }
  478. public class VideoRecordingMode
  479. {
  480. public string StartTime { get; set; }// 录像文件起始时间, YYYYMMDDHHmmss
  481. public string EndTime { get; set; }//录像文件结束时间, YYYYMMDDHHmmss
  482. public string DownloadURL { get; set; }//录像文件下载地址, EndTime 不为空时方可用
  483. }
  484. public class VideoStartRecording
  485. {
  486. public string DownloadURL { get; set; }
  487. }
  488. public class playbackStopPlaybackFileURL
  489. {
  490. public string PlaybackFileURL { get; set; }
  491. }
  492. public class cloudrecordQuerydaily
  493. {
  494. //通道名称
  495. public string name { get; set; }
  496. //通道水印
  497. public string osd { get; set; }
  498. public List<recordQuerydaily> list { get; set; }
  499. }
  500. public class recordQuerydaily
  501. {
  502. //通道名称
  503. public string name {get;set;}
  504. //开始时间, YYYYMMDDHHmmss
  505. public string startAt {get;set;}
  506. //录像时长(秒)
  507. public double duration { get; set; }
  508. //录像播放链接
  509. public string hls { get; set; }
  510. //重要标记
  511. public bool important { get; set; }
  512. }
  513. public class playbackRecordList
  514. {
  515. //通道编号
  516. public string DeviceID { get; set; }
  517. //通道名称
  518. public string Name { get; set; }
  519. //录像总数
  520. public int SumNum { get; set; }
  521. //录像列表
  522. public List<RecordList> RecordList { get; set; }
  523. }
  524. public class RecordList
  525. {
  526. //摄像头名称
  527. public string CameraName { get; set; }
  528. //通道编号
  529. public string ChannelID { get; set; }
  530. //设备编号
  531. public string DeviceID { get; set; }
  532. //通道名称
  533. public string Name { get; set; }
  534. //文件路径名
  535. public string FilePath { get; set; }
  536. //录像地址
  537. public string Address { get; set; }
  538. //录像开始时间, YYYY-MM-DDTHH:mm:ss
  539. public string StartTime { get; set; }
  540. //录像结束时间, YYYY-MM-DDTHH:mm:ss
  541. public string EndTime { get; set; }
  542. //保密属性, 0-不涉密, 1-涉密 允许值: 0, 1
  543. public string Secrecy { get; set; }
  544. //录像产生类型 允许值: time, alarm, manual, all
  545. public string Type { get; set; }
  546. //录像触发者ID
  547. public string RecorderID { get; set; }
  548. }
  549. public class playbackStreaminfoEntity
  550. {
  551. public string StreamID { get; set; }//回放流ID
  552. public string SMSID { get; set; }//流媒体编号
  553. public string DeviceID { get; set; }//设备编号
  554. public string ChannelID { get; set; }//通道编号
  555. public string ChannelName { get; set; }//通道名称
  556. public string WEBRTC { get; set; }//WEBRTC 播放地址
  557. public string FLV { get; set; }//HTTP-FLV 播放地址
  558. public string WS_FLV { get; set; }//Websocket-FLV 播放地址
  559. public string RTMP { get; set; }//RTMP 播放地址
  560. public string HLS { get; set; }//HLS(M3U8) 播放地址
  561. public string StartAt { get; set; }//开始时间
  562. public string RecordStartAt { get; set; }//实时录像开始时间
  563. public int Duration { get; set; }//持续时间(秒)
  564. public string SourceVideoCodecName { get; set; }//原始视频编码
  565. public int SourceVideoWidth { get; set; }//原始视频宽
  566. public int SourceVideoHeight { get; set; }//原始视频高
  567. public double SourceVideoFrameRate { get; set; }//原始视频帧率
  568. public string SourceAudioCodecName { get; set; }//原始音频编码
  569. public double SourceAudioSampleRate { get; set; }//原始音频采样率
  570. public int RTPCount { get; set; }//收包数
  571. public int RTPLostCount { get; set; }//丢包数
  572. public double RTPLostRate { get; set; }//丢包率百分比
  573. public int VideoFrameCount { get; set; }//视频帧数
  574. public int InBytes { get; set; }//收流字节大小(Byte)
  575. public double InBitRate { get; set; }//收流平均码率(Kbps)
  576. public int OutBytes { get; set; }//分发流字节大小(Byte)
  577. public int PlaybackDuration { get; set; }//回放文件总时长(秒)
  578. public int TimestampSec { get; set; }//当前回放时长(秒)
  579. public double PlaybackProgress { get; set; }//回放进度([0-1]), 按时间截计算(TimestampSec/PlaybackDuration)
  580. public double DownloadProgress { get; set; }//下载进度([0-1]), 按文件大小计算(InBytes/PlaybackFileSize)
  581. public double PlaybackFileSizea { get; set; }//下载文件总大小
  582. public string PlaybackFileURL { get; set; }//下载文件链接, playback stop 之后方可用
  583. public string PlaybackFileError { get; set; }//下载文件异常终止消息
  584. }