Files
Ayay/SHH.CameraDashboard/Pages/CameraWall/VideoWallViewModel.cs

84 lines
2.8 KiB
C#
Raw Normal View History

using SHH.Contracts;
using System.Collections.ObjectModel;
using System.Windows.Input;
namespace SHH.CameraDashboard
{
public class VideoWallViewModel : ViewModelBase
{
// 引用推流接收服务
private readonly VideoPushServer _pushServer;
// 视频列表
public ObservableCollection<VideoTileViewModel> VideoTiles { get; } = new ObservableCollection<VideoTileViewModel>();
// 控制 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<string>(ExecuteSetLayout);
// 1. 初始化并启动接收服务
_pushServer = new VideoPushServer();
_pushServer.OnFrameReceived += OnGlobalFrameReceived;
// 2. 启动监听端口 (比如 6000)
// 之后你的采集端 ForwarderClient 需要 Connect("tcp://你的IP:6000")
_pushServer.Start(6000);
// 3. 初始化格子 (不再需要传入 IP/Port 去主动连接了)
// 我们用 CameraId 或 Name 来作为匹配标识
InitVideoTiles();
}
/// <summary>
/// 全局接收回调:收到任何一路视频都会进这里
/// </summary>
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", "仓库通道"));
}
public void AddCamera(string ip, int port, string name)
{
var tile = new VideoTileViewModel(ip, port, name);
VideoTiles.Add(tile);
}
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;
}
}
}
}