diff --git a/server/src/Controllers/VideoStreamController.cs b/server/src/Controllers/VideoStreamController.cs index 4d73f0c..bcb4ac2 100644 --- a/server/src/Controllers/VideoStreamController.cs +++ b/server/src/Controllers/VideoStreamController.cs @@ -13,6 +13,45 @@ public class VideoStreamController : ControllerBase private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private readonly server.Services.HttpVideoStreamService _videoStreamService; + /// + /// 视频流信息结构体 + /// + public class StreamInfoResult + { + /// + /// TODO: + /// + public int FrameRate { get; set; } + /// + /// TODO: + /// + public int FrameWidth { get; set; } + /// + /// TODO: + /// + public int FrameHeight { get; set; } + /// + /// TODO: + /// + public string Format { get; set; } = "MJPEG"; + /// + /// TODO: + /// + public string HtmlUrl { get; set; } = ""; + /// + /// TODO: + /// + public string MjpegUrl { get; set; } = ""; + /// + /// TODO: + /// + public string SnapshotUrl { get; set; } = ""; + /// + /// TODO: + /// + public string UsbCameraUrl { get; set; } = ""; + } + /// /// 摄像头配置请求模型 /// @@ -96,23 +135,25 @@ public class VideoStreamController : ControllerBase /// 流信息 [HttpGet("StreamInfo")] [EnableCors("Users")] - [ProducesResponseType(typeof(object), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(StreamInfoResult), StatusCodes.Status200OK)] [ProducesResponseType(typeof(Exception), StatusCodes.Status500InternalServerError)] public IResult GetStreamInfo() { try { logger.Info("获取 HTTP 视频流信息"); - return TypedResults.Ok(new + var result = new StreamInfoResult { - frameRate = _videoStreamService.FrameRate, - frameWidth = _videoStreamService.FrameWidth, - frameHeight = _videoStreamService.FrameHeight, - format = "MJPEG", - htmlUrl = $"http://localhost:{_videoStreamService.ServerPort}/video-feed.html", - mjpegUrl = $"http://localhost:{_videoStreamService.ServerPort}/video-stream", - snapshotUrl = $"http://localhost:{_videoStreamService.ServerPort}/snapshot", - }); + FrameRate = _videoStreamService.FrameRate, + FrameWidth = _videoStreamService.FrameWidth, + FrameHeight = _videoStreamService.FrameHeight, + Format = "MJPEG", + HtmlUrl = $"http://localhost:{_videoStreamService.ServerPort}/video-feed.html", + MjpegUrl = $"http://localhost:{_videoStreamService.ServerPort}/video-stream", + SnapshotUrl = $"http://localhost:{_videoStreamService.ServerPort}/snapshot", + UsbCameraUrl = $"http://localhost:{_videoStreamService.ServerPort}/usb-camera" + }; + return TypedResults.Ok(result); } catch (Exception ex) { @@ -382,7 +423,7 @@ public class VideoStreamController : ControllerBase logger.Info("收到初始化自动对焦请求"); var result = await _videoStreamService.InitAutoFocusAsync(); - + if (result) { logger.Info("自动对焦初始化成功"); @@ -427,7 +468,7 @@ public class VideoStreamController : ControllerBase logger.Info("收到执行自动对焦请求"); var result = await _videoStreamService.PerformAutoFocusAsync(); - + if (result) { logger.Info("自动对焦执行成功"); @@ -484,7 +525,7 @@ public class VideoStreamController : ControllerBase } var result = await _videoStreamService.PerformAutoFocusAsync(); - + if (result) { logger.Info("对焦执行成功"); diff --git a/src/APIClient.ts b/src/APIClient.ts index 9983da4..35c4a0f 100644 --- a/src/APIClient.ts +++ b/src/APIClient.ts @@ -68,7 +68,7 @@ export class VideoStreamClient { * 获取 HTTP 视频流信息 * @return 流信息 */ - getStreamInfo(): Promise { + getStreamInfo(): Promise { let url_ = this.baseUrl + "/api/VideoStream/StreamInfo"; url_ = url_.replace(/[?&]$/, ""); @@ -84,15 +84,14 @@ export class VideoStreamClient { }); } - protected processGetStreamInfo(response: Response): Promise { + protected processGetStreamInfo(response: Response): Promise { const status = response.status; let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; if (status === 200) { return response.text().then((_responseText) => { let result200: any = null; let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); - result200 = resultData200 !== undefined ? resultData200 : null; - + result200 = StreamInfoResult.fromJS(resultData200); return result200; }); } else if (status === 500) { @@ -107,7 +106,7 @@ export class VideoStreamClient { return throwException("An unexpected server error occurred.", status, _responseText, _headers); }); } - return Promise.resolve(null as any); + return Promise.resolve(null as any); } /** @@ -4673,6 +4672,88 @@ export interface IException { stackTrace?: string | undefined; } +/** 视频流信息结构体 */ +export class StreamInfoResult implements IStreamInfoResult { + /** TODO: */ + frameRate!: number; + /** TODO: */ + frameWidth!: number; + /** TODO: */ + frameHeight!: number; + /** TODO: */ + format!: string; + /** TODO: */ + htmlUrl!: string; + /** TODO: */ + mjpegUrl!: string; + /** TODO: */ + snapshotUrl!: string; + /** TODO: */ + usbCameraUrl!: string; + + constructor(data?: IStreamInfoResult) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(_data?: any) { + if (_data) { + this.frameRate = _data["frameRate"]; + this.frameWidth = _data["frameWidth"]; + this.frameHeight = _data["frameHeight"]; + this.format = _data["format"]; + this.htmlUrl = _data["htmlUrl"]; + this.mjpegUrl = _data["mjpegUrl"]; + this.snapshotUrl = _data["snapshotUrl"]; + this.usbCameraUrl = _data["usbCameraUrl"]; + } + } + + static fromJS(data: any): StreamInfoResult { + data = typeof data === 'object' ? data : {}; + let result = new StreamInfoResult(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["frameRate"] = this.frameRate; + data["frameWidth"] = this.frameWidth; + data["frameHeight"] = this.frameHeight; + data["format"] = this.format; + data["htmlUrl"] = this.htmlUrl; + data["mjpegUrl"] = this.mjpegUrl; + data["snapshotUrl"] = this.snapshotUrl; + data["usbCameraUrl"] = this.usbCameraUrl; + return data; + } +} + +/** 视频流信息结构体 */ +export interface IStreamInfoResult { + /** TODO: */ + frameRate: number; + /** TODO: */ + frameWidth: number; + /** TODO: */ + frameHeight: number; + /** TODO: */ + format: string; + /** TODO: */ + htmlUrl: string; + /** TODO: */ + mjpegUrl: string; + /** TODO: */ + snapshotUrl: string; + /** TODO: */ + usbCameraUrl: string; +} + /** 摄像头配置请求模型 */ export class CameraConfigRequest implements ICameraConfigRequest { /** 摄像头地址 */ diff --git a/src/views/Project/VideoStream.vue b/src/views/Project/VideoStream.vue index 9eab9e4..a444871 100644 --- a/src/views/Project/VideoStream.vue +++ b/src/views/Project/VideoStream.vue @@ -8,17 +8,14 @@ 控制面板 -
+
-
+
{{ statusInfo.isRunning ? "运行中" : "已停止" }}
@@ -43,30 +40,23 @@
-
+
分辨率设置
-
- @@ -86,30 +76,18 @@