using SHH.Contracts; using System.Collections.ObjectModel; using System.Windows.Input; namespace SHH.CameraDashboard { public class VideoWallViewModel : ViewModelBase { // 引用推流接收服务 private readonly VideoPushServer _pushServer; // 视频列表 public ObservableCollection VideoTiles { get; } = new ObservableCollection(); // 控制 UniformGrid 的列数 (决定是 2x2 还是 3x3) private int _columns = 2; public int Columns { get => _columns; set => SetProperty(ref _columns, value); } // 切换布局命令 public ICommand SetLayoutCommand { get; } public VideoWallViewModel() { SetLayoutCommand = new RelayCommand(ExecuteSetLayout); // 1. 初始化并启动接收服务 _pushServer = new VideoPushServer(); _pushServer.OnFrameReceived += OnGlobalFrameReceived; // 2. 启动监听端口 (比如 6000) // 之后你的采集端 ForwarderClient 需要 Connect("tcp://你的IP:6000") _pushServer.Start(6000); // 3. 初始化格子 (不再需要传入 IP/Port 去主动连接了) // 我们用 CameraId 或 Name 来作为匹配标识 InitVideoTiles(); } /// /// 全局接收回调:收到任何一路视频都会进这里 /// private void OnGlobalFrameReceived(VideoPayload payload) { // 1. 在 VideoTiles 集合中找到对应的格子 // 假设 payload.CameraId 与我们 VideoTileViewModel 中的 ID 对应 //var targetTile = VideoTiles.FirstOrDefault(t => t.id == payload.CameraId); //if (targetTile != null) //{ // // 2. 将数据交给格子去渲染 // targetTile.UpdateFrame(payload); //} } private void InitVideoTiles() { // 假设我们预设 4 个格子,分别对应不同的摄像头 ID // 这里 ID 必须和采集端发送的 VideoPayload.CameraId 一致 //VideoTiles.Add(new VideoTileViewModel("1004", "仓库通道")); } private void ExecuteSetLayout(string layoutType) { switch (layoutType) { case "1x1": Columns = 1; break; case "2x2": Columns = 2; break; case "3x3": Columns = 3; break; case "4x4": Columns = 4; break; default: Columns = 2; break; } } } }