123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520 |
- using FISLib.Hardware;
- using FISLib.LiveVideo;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using Vinno.FIS.Sonopost.Settings;
- using Vinno.FIS.Sonopost.WebApi.Models;
- using Vinno.IUS.Common.Log;
- namespace Vinno.FIS.Sonopost.WebApi.Controllers
- {
- [WebApiController]
- internal class LiveController : BaseController
- {
- /// <summary>
- /// 获取超声机品牌集合
- /// </summary>
- /// <returns></returns>
- [WebApiAction]
- public Result GetBrandList()
- {
- var list = LiveVideoManager.GetBrandList();
- return Result.Success(list);
- }
- /// <summary>
- /// 获取超声机型号集合
- /// </summary>
- /// <returns></returns>
- [WebApiAction]
- public Result GetModelList(SonoInfoModel sonoInfo)
- {
- var list = LiveVideoManager.GetModelList(sonoInfo?.Brand);
- return Result.Success(list);
- }
- /// <summary>
- /// 获取超声机推荐分辨率
- /// </summary>
- /// <returns></returns>
- [WebApiAction]
- public Result GetRecommandResolution(SonoInfoModel sonoInfo)
- {
- var resolution = LiveVideoManager.GetRecommandResolution(sonoInfo?.Brand, sonoInfo?.Model);
- return Result.Success(resolution);
- }
- /// <summary>
- /// 获取超声机信息
- /// </summary>
- /// <returns></returns>
- [WebApiAction]
- public Result GetSonoInfo()
- {
- if (LiveVideoManager.SonoDevice == null)
- {
- return Result.Fail("DeviceNotFound");
- }
- var videoInfos = SonopostUserDefinedSettings.Instance.HardwareSetting.VideoDeviceInfoList;
- var config = videoInfos?.FirstOrDefault(x => x.Category == FISLiveChannelCategory.Main);
- var model = new SonoInfoModel(config?.Id, config?.Name, LiveVideoManager.SonoDevice?.HardwareId, LiveVideoManager.SonoDevice?.Capabilities)
- {
- Width = config == null ? 0 : config.Width,
- Height = config == null ? 0 : config.Height,
- IsEnable = config == null ? false : config.IsEnable,
- Brand = config?.Brand,
- Model = config?.Model,
- };
- return Result.Success(model);
- }
- /// <summary>
- /// 保存超声机信息
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [WebApiAction]
- public Result SaveSonoInfo(SonoInfoModel request)
- {
- if (LiveVideoManager.SonoDevice == null)
- {
- return Result.Fail("DeviceNotFound");
- }
- var videoInfos = SonopostUserDefinedSettings.Instance.HardwareSetting.VideoDeviceInfoList;
- var config = videoInfos?.FirstOrDefault(x => x.Category == FISLiveChannelCategory.Main);
- if (config == null)
- {
- config = new FISVideoDeviceInfo
- {
- Category = FISLiveChannelCategory.Main
- };
- videoInfos.Add(config);
- }
- config.Id = LiveVideoManager.SonoDevice.Id;
- config.Name = LiveVideoManager.SonoDevice.Name;
- config.IsEnable = request.IsEnable;
- config.Brand = request.Brand;
- config.Model = request.Model;
- config.Width = request.Width;
- config.Height = request.Height;
- config.FrameRate = 20;
- config.IsAvailable = true;
- ConfigManager.Save();
- LiveVideoManager.UpdateDeviceResoution();
- return Result.Success(config.Id);
- }
- /// <summary>
- /// 获取超声机分辨率
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [WebApiAction]
- public Result GetSonoResolutions()
- {
- if (LiveVideoManager.SonoDevice == null)
- {
- return Result.Fail("DeviceNotFound");
- }
- return Result.Success(LiveVideoManager.SonoDevice.Capabilities.Select(x => new { x.Width, x.Height }));
- }
- /// <summary>
- /// 获取摄像头列表
- /// </summary>
- /// <returns></returns>
- [WebApiAction]
- public Result GetCameras()
- {
- var cameras = DeviceManager.GetCameras()
- ?.Where(x => !x.Name.Equals(LiveVideoManager.SonoDevice?.Name)) ?? new List<FISCameraInfo>();
- return Result.Success(cameras);
- }
- /// <summary>
- /// 刷新摄像头列表
- /// </summary>
- /// <returns></returns>
- [WebApiAction]
- public Result RefreshCameras()
- {
- DeviceManager.RefreshCameras();
- var cameras = DeviceManager.GetCameras()
- ?.Where(x => !x.Name.Equals(LiveVideoManager.SonoDevice?.Name)) ?? new List<FISCameraInfo>();
- return Result.Success(cameras);
- }
- /// <summary>
- /// 获取摄像头1信息
- /// </summary>
- /// <returns></returns>
- [WebApiAction]
- public Result GetCamera01Info()
- {
- var videoInfos = SonopostUserDefinedSettings.Instance.HardwareSetting.VideoDeviceInfoList;
- var config = videoInfos.FirstOrDefault(x => x.Category == FISLiveChannelCategory.Auxiliary1) ?? new FISVideoDeviceInfo();
- DeviceManager.RefreshCameras();
- var cameras = DeviceManager.GetCameras();
- if (!string.IsNullOrEmpty(config.Id))
- {
- var camera = cameras.FirstOrDefault(x => x.Id.Equals(config.Id));
- if (camera == null)
- {
- var auxiliary1 = videoInfos.FirstOrDefault(x => x.Category == FISLiveChannelCategory.Auxiliary1);
- if (auxiliary1 != null)
- {
- videoInfos.Remove(auxiliary1);
- ConfigManager.Save();
- LiveVideoManager.UpdateDeviceResoution();
- }
- config = new FISVideoDeviceInfo();
- }
- }
- VideoDeviceInfoModel model = new VideoDeviceInfoModel(config.Id, config.Name, new List<string>(), new List<FISCameraCaptureCapability>())
- {
- IsEnable = config.IsEnable,
- Width = config.Width,
- Height = config.Height,
- };
- return Result.Success(model);
- }
- /// <summary>
- /// 保存摄像头1信息
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [WebApiAction]
- public Result SaveCamera01Info(VideoDeviceInfoModel request)
- {
- var videoInfos = SonopostUserDefinedSettings.Instance.HardwareSetting.VideoDeviceInfoList;
- var config = videoInfos.FirstOrDefault(x => x.Category == FISLiveChannelCategory.Auxiliary1);
- if (!request.IsEnable)
- {
- if (string.IsNullOrWhiteSpace(request.Id))
- {
- if (config != null)
- {
- videoInfos.Remove(config);
- ConfigManager.Save();
- LiveVideoManager.UpdateDeviceResoution();
- }
- return Result.Success();
- }
- }
- var cameras = DeviceManager.GetCameras();
- var camera = cameras.FirstOrDefault(x => x.Id.Equals(request.Id));
- if (camera == null)
- {
- return Result.Fail("DeviceNotFound");
- }
- if (request.IsEnable)
- {
- if (videoInfos.Any(x => x.Id == request.Id && x.IsEnable && x.Category != FISLiveChannelCategory.Auxiliary1))
- {
- return Result.Fail("DeviceIsOccupied");
- }
- }
- if (config == null)
- {
- config = new FISVideoDeviceInfo
- {
- Category = FISLiveChannelCategory.Auxiliary1,
- };
- videoInfos.Add(config);
- }
- config.Id = camera.Id;
- config.Name = camera.Name;
- config.IsEnable = request.IsEnable;
- config.Width = request.Width;
- config.Height = request.Height;
- config.FrameRate = 20;
- config.IsAvailable = true;
- ConfigManager.Save();
- LiveVideoManager.UpdateDeviceResoution();
- return Result.Success();
- }
- /// <summary>
- /// 获取摄像头2信息
- /// </summary>
- /// <returns></returns>
- [WebApiAction]
- public Result GetCamera02Info()
- {
- var videoInfos = SonopostUserDefinedSettings.Instance.HardwareSetting.VideoDeviceInfoList;
- var config = videoInfos.FirstOrDefault(x => x.Category == FISLiveChannelCategory.Auxiliary2) ?? new FISVideoDeviceInfo();
- DeviceManager.RefreshCameras();
- var cameras = DeviceManager.GetCameras();
- if (!string.IsNullOrEmpty(config.Id))
- {
- var camera = cameras.FirstOrDefault(x => x.Id.Equals(config.Id));
- if (camera == null)
- {
- var auxiliary2 = videoInfos.FirstOrDefault(x => x.Category == FISLiveChannelCategory.Auxiliary2);
- if (auxiliary2 != null)
- {
- videoInfos.Remove(auxiliary2);
- ConfigManager.Save();
- LiveVideoManager.UpdateDeviceResoution();
- }
- config = new FISVideoDeviceInfo();
- }
- }
- VideoDeviceInfoModel model = new VideoDeviceInfoModel(config.Id, config.Name, new List<string>(), new List<FISCameraCaptureCapability>())
- {
- IsEnable = config.IsEnable,
- Width = config.Width,
- Height = config.Height,
- };
- return Result.Success(model);
- }
- /// <summary>
- /// 保存摄像头2信息
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [WebApiAction]
- public Result SaveCamera02Info(VideoDeviceInfoModel request)
- {
- var videoInfos = SonopostUserDefinedSettings.Instance.HardwareSetting.VideoDeviceInfoList;
- var config = videoInfos.FirstOrDefault(x => x.Category == FISLiveChannelCategory.Auxiliary2);
- if (!request.IsEnable)
- {
- if (string.IsNullOrWhiteSpace(request.Id))
- {
- if (config != null)
- {
- videoInfos.Remove(config);
- ConfigManager.Save();
- LiveVideoManager.UpdateDeviceResoution();
- }
- return Result.Success();
- }
- }
- var cameras = DeviceManager.GetCameras();
- var camera = cameras.FirstOrDefault(x => x.Id.Equals(request.Id));
- if (camera == null)
- {
- return Result.Fail("DeviceNotFound");
- }
- if (request.IsEnable)
- {
- if (videoInfos.Any(x => x.Id == request.Id && x.IsEnable && x.Category != FISLiveChannelCategory.Auxiliary2))
- {
- return Result.Fail("DeviceIsOccupied");
- }
- }
- if (config == null)
- {
- config = new FISVideoDeviceInfo
- {
- Category = FISLiveChannelCategory.Auxiliary2,
- };
- videoInfos.Add(config);
- }
- config.Id = camera.Id;
- config.Name = camera.Name;
- config.IsEnable = request.IsEnable;
- config.Width = request.Width;
- config.Height = request.Height;
- config.FrameRate = 20;
- config.IsAvailable = true;
- ConfigManager.Save();
- LiveVideoManager.UpdateDeviceResoution();
- return Result.Success();
- }
- /// <summary>
- /// 开始预览
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [WebApiAction]
- public Result StartPreview(LivePreviewRequest request)
- {
- try
- {
- LiveVideoManager.StartPreview(request.DeviceId, request.Width, request.Height, request.FrameRate);
- return Result.Success();
- }
- catch (Exception ex)
- {
- Logger.WriteLineError($"[{nameof(LiveController)}]{nameof(StartPreview)} error: {ex}");
- return Result.Fail();
- }
- }
- /// <summary>
- /// 停止预览
- /// </summary>
- /// <returns></returns>
- [WebApiAction]
- public Result StopPreview()
- {
- try
- {
- LiveVideoManager.StopPreview();
- return Result.Success();
- }
- catch (Exception ex)
- {
- Logger.WriteLineError($"[{nameof(LiveController)}]{nameof(StopPreview)} error: {ex}");
- return Result.Fail();
- }
- }
- /// <summary>
- /// 获取麦克风列表
- /// </summary>
- /// <returns></returns>
- [WebApiAction]
- public Result GetMics()
- {
- var mics = DeviceManager.GetMics() ?? new List<FISMicInfo>();
- return Result.Success(mics);
- }
- /// <summary>
- /// 刷新麦克风列表
- /// </summary>
- /// <returns></returns>
- [WebApiAction]
- public Result RefreshMics()
- {
- DeviceManager.RefreshMics();
- var mics = DeviceManager.GetMics() ?? new List<FISMicInfo>();
- return Result.Success(mics);
- }
- /// <summary>
- /// 获取麦克风信息
- /// </summary>
- /// <returns></returns>
- [WebApiAction]
- public Result GetMicInfo()
- {
- var config = SonopostUserDefinedSettings.Instance.HardwareSetting.MicDeviceInfo ?? new FISMicDeviceInfo();
- DeviceManager.RefreshMics();
- var mics = DeviceManager.GetMics();
- if (!string.IsNullOrEmpty(config.Id))
- {
- var mic = mics.FirstOrDefault(x => x.Id.Equals(config.Id));
- if (mic == null)
- {
- SonopostUserDefinedSettings.Instance.HardwareSetting.MicDeviceInfo = null;
- ConfigManager.Save();
- LiveVideoManager.UpdateDeviceResoution();
- config = new FISMicDeviceInfo();
- }
- }
- MicDeviceInfoModel model = new MicDeviceInfoModel(config.Id, config.Name, new List<string>(), 0, false)
- {
- IsEnable = config.IsEnable,
- };
- return Result.Success(model);
- }
- /// <summary>
- /// 保存麦克风信息
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [WebApiAction]
- public Result SaveMicInfo(MicDeviceInfoModel request)
- {
- if (!request.IsEnable)
- {
- if (string.IsNullOrWhiteSpace(request.Id))
- {
- if (SonopostUserDefinedSettings.Instance.HardwareSetting.MicDeviceInfo != null)
- {
- SonopostUserDefinedSettings.Instance.HardwareSetting.MicDeviceInfo = null;
- ConfigManager.Save();
- LiveVideoManager.UpdateDeviceResoution();
- }
- return Result.Success();
- }
- }
- var mics = DeviceManager.GetMics();
- var mic = mics.FirstOrDefault(x => x.Id.Equals(request.Id));
- if (mic == null)
- {
- return Result.Fail("DeviceNotFound");
- }
- if (SonopostUserDefinedSettings.Instance.HardwareSetting.MicDeviceInfo == null)
- {
- SonopostUserDefinedSettings.Instance.HardwareSetting.MicDeviceInfo = new FISMicDeviceInfo();
- }
- SonopostUserDefinedSettings.Instance.HardwareSetting.MicDeviceInfo.Id = mic.Id;
- SonopostUserDefinedSettings.Instance.HardwareSetting.MicDeviceInfo.Name = mic.Name;
- SonopostUserDefinedSettings.Instance.HardwareSetting.MicDeviceInfo.IsEnable = request.IsEnable;
- ConfigManager.Save();
- LiveVideoManager.UpdateDeviceResoution();
- return Result.Success();
- }
- /// <summary>
- /// 获取采集卡信息(供杏聆荟使用)
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [WebApiAction]
- public Result GetSonoCaptureCardList()
- {
- return Result.Success(LiveVideoManager.SonoDeviceNames);
- }
- /// <summary>
- /// 获取忽略的麦克风列表(供杏聆荟使用)
- /// </summary>
- /// <returns></returns>
- [WebApiAction]
- public Result GetIgnoreMicList()
- {
- return Result.Success(SonopostSystemSettings.Instance.SkippedMicDeviceNames);
- }
- /// <summary>
- /// 获取忽略的扬声器列表(供杏聆荟使用)
- /// </summary>
- /// <returns></returns>
- [WebApiAction]
- public Result GetIgnoreSpeakerList()
- {
- return Result.Success(SonopostSystemSettings.Instance.SkippedSpeakerDeviceNames);
- }
- [WebApiAction]
- public Result GetCurrentPreviewImage()
- {
- try
- {
- var image = LiveVideoManager.GetCurrentCaptureFrame();
- if (image == null)
- {
- return Result.Success(new FISBase64ImageData(0, 0, "", FailReasonForNullBase64Data.Unknown));
- }
- else
- {
- return Result.Success(image);
- }
- }
- catch (Exception ex)
- {
- Logger.WriteLineError($"[{nameof(LiveController)}]{nameof(GetCurrentPreviewImage)} error: {ex}");
- return Result.Fail();
- }
- }
- }
- }
|