首次提交

This commit is contained in:
tanglong 2025-09-15 12:58:01 +08:00
commit 127052091e
24 changed files with 12510 additions and 0 deletions

9
.gitignore vendored Normal file
View File

@ -0,0 +1,9 @@
.vs
.vscode
bin
obj
*.jfm
*.dbmdl
*.user
node_modules
.dll

View File

@ -0,0 +1,9 @@
<Application x:Class="Wpf_AiSportsMicrospace.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Wpf_AiSportsMicrospace"
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>

View File

@ -0,0 +1,13 @@
using System.Configuration;
using System.Data;
using System.Windows;
namespace Wpf_AiSportsMicrospace;
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
}

View File

@ -0,0 +1,10 @@
using System.Windows;
[assembly:ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]

View File

@ -0,0 +1,146 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Media;
using Yztob.AiSports.Inferences.Things;
namespace Wpf_AiSportsMicrospace.Common
{
/// <summary>
/// 基于WPF的人体骨骼绘制器
/// </summary>
internal class HumanGraphicsRenderer
{
private readonly Typeface _typeface;
private IList<Human> _humans;
private IList<BoundingBox> _objects;
private readonly object _mutex = new object();
public HumanGraphicsRenderer()
{
_typeface = new Typeface(new FontFamily("Microsoft YaHei UI"), FontStyles.Normal, FontWeights.Normal, FontStretches.Normal);
}
#region
public float ScaleRatio { get; set; } = 1f;
public float OffsetX { get; set; }
public float OffsetY { get; set; }
public System.Windows.Media.Color NoseColor { get; set; } = (System.Windows.Media.Color)ColorConverter.ConvertFromString("#FF8000");
public System.Windows.Media.Color LeftColor { get; set; } = (System.Windows.Media.Color)ColorConverter.ConvertFromString("#0075f2");
public System.Windows.Media.Color RightColor { get; set; } = (System.Windows.Media.Color)ColorConverter.ConvertFromString("#00AA00");
public float BonedWidth { get; set; } = 4;
public bool DrawLabel { get; set; } = true;
public IList<Human> Humans
{
get => _humans;
set { lock (_mutex) { _humans = value; } }
}
public IList<BoundingBox> Objects
{
get => _objects;
set { lock (_mutex) { _objects = value; } }
}
#endregion
#region
private void DrawLine(DrawingContext dc, Keypoint begin, Keypoint end, System.Windows.Media.Color color)
{
var pen = new Pen(new SolidColorBrush(color), BonedWidth);
dc.DrawLine(pen,
new Point(begin.X * ScaleRatio + OffsetX, begin.Y * ScaleRatio + OffsetY),
new Point(end.X * ScaleRatio + OffsetX, end.Y * ScaleRatio + OffsetY));
}
private void DrawPoints(DrawingContext dc, IList<Keypoint> points)
{
foreach (var kp in points)
{
var x = kp.X * ScaleRatio + OffsetX;
var y = kp.Y * ScaleRatio + OffsetY;
// 绘制阴影点
dc.DrawEllipse(new SolidColorBrush(System.Windows.Media.Color.FromRgb(255, 255, 238)), null, new Point(x, y), 5, 5);
// 左右和鼻子颜色
var brush = new SolidColorBrush(LeftColor);
if (kp.Name == "nose")
brush = new SolidColorBrush(NoseColor);
else if (kp.Name.StartsWith("right_"))
brush = new SolidColorBrush(RightColor);
dc.DrawEllipse(brush, null, new Point(x, y), 4, 4);
}
}
private void DrawSkeleton(DrawingContext dc, IList<Keypoint> points)
{
var pointDict = points.ToDictionary(p => p.Name, p => p);
// 简单骨架连线示例
DrawLine(dc, pointDict["right_wrist"], pointDict["right_elbow"], System.Windows.Media.Colors.White);
DrawLine(dc, pointDict["right_elbow"], pointDict["right_shoulder"], System.Windows.Media.Colors.White);
DrawLine(dc, pointDict["right_shoulder"], pointDict["left_shoulder"], System.Windows.Media.Colors.White);
DrawLine(dc, pointDict["left_shoulder"], pointDict["left_elbow"], System.Windows.Media.Colors.White);
DrawLine(dc, pointDict["left_elbow"], pointDict["left_wrist"], System.Windows.Media.Colors.White);
// 头部
DrawLine(dc, pointDict["nose"], pointDict["left_eye"], System.Windows.Media.Colors.White);
DrawLine(dc, pointDict["nose"], pointDict["right_eye"], System.Windows.Media.Colors.White);
}
private void DrawBoxes(DrawingContext dc, IList<BoundingBox> boxes)
{
foreach (var box in boxes)
{
var color = System.Windows.Media.Colors.Red; // 这里可根据box.Label.Color转换
var pen = new Pen(new SolidColorBrush(color), 2);
var rect = new Rect(
box.X * ScaleRatio + OffsetX,
box.Y * ScaleRatio + OffsetY,
(box.RightX - box.X) * ScaleRatio,
(box.BottomY - box.Y) * ScaleRatio);
dc.DrawRectangle(null, pen, rect);
if (DrawLabel)
{
var formattedText = new FormattedText(
box.Label.Name + $" {box.Confidence:N6}",
System.Globalization.CultureInfo.CurrentCulture,
FlowDirection.LeftToRight,
_typeface,
12,
new SolidColorBrush(color),
1.0);
dc.DrawText(formattedText, new Point(rect.Left + 5, rect.Top + 5));
}
}
}
#endregion
#region
public void Drawing(DrawingContext dc)
{
lock (_mutex)
{
if (Humans?.Any() == true)
{
foreach (var human in Humans)
{
DrawSkeleton(dc, human.Keypoints);
DrawPoints(dc, human.Keypoints);
}
}
if (Objects?.Any() == true)
DrawBoxes(dc, Objects);
}
}
#endregion
}
}

View File

@ -0,0 +1,160 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using Yztob.AiSports.Inferences.Things;
using Yztob.AiSports.Postures.Sports;
namespace Wpf_AiSportsMicrospace.Common
{
/// <summary>
/// 运动检后台线程顺序检测队列
/// </summary>
internal class SportDetectionQueue
{
#region
/// <summary>
/// 队列条目
/// </summary>
private class QueueItem
{
/// <summary>
/// 获取或设置帧序号
/// </summary>
public long Number { get; set; }
/// <summary>
/// 获取或设置人体结果
/// </summary>
public Human Human { get; set; }
/// <summary>
/// 获取或设置器材物品
/// </summary>
public IList<BoundingBox> Objects { get; set; }
}
#endregion
#region
private readonly Queue<QueueItem> _queues;
private int _signral = 0; //0-停止 1-执行中 2-停止信号
#endregion
#region
/// <summary>
/// 初始化队列
/// </summary>
public SportDetectionQueue()
{
_queues = new Queue<QueueItem>();
}
#endregion
#region
/// <summary>
/// 获取或设置要执行的运动分析器
/// </summary>
public SportBase Sport { get; set; }
public bool IsRuning
{
get
{
return _signral != 0;
}
}
#endregion
#region
/// <summary>
/// 检测工作任务
/// </summary>
private void Detecting()
{
_signral = 1;
while (_signral == 1)
{
//无队列
if (!_queues.Any())
{
Thread.Sleep(5);
continue;
}
var item = _queues.Dequeue();
if (item == null)
continue;
if (!Sport.Equipment)
Sport.Pushing(item.Human);
else
Sport.Pushing(item.Human, item.Objects);
}
_signral = 0;
}
#endregion
#region
/// <summary>
/// 入队等待检测
/// </summary>
/// <param name="number">帧序号</param>
/// <param name="human">人体结构</param>
/// <param name="objects">器材列表</param>
public void Enqueue(long number, Human human, IList<BoundingBox> objects)
{
if (!this.IsRuning)
return;
//为空也不记录
if (human == null && objects?.Any() != true)
return;
var item = new QueueItem
{
Number = number,
Human = human,
Objects = objects,
};
_queues.Enqueue(item);
}
/// <summary>
/// 开始检测
/// </summary>
public void Start()
{
if (_signral != 0)
return;
_signral = 1;
_queues.Clear();//队列清空
var thread = new Thread(Detecting);
thread.IsBackground = true;
thread.Start();
}
/// <summary>
/// 停止检测推送
/// </summary>
public void Stop()
{
if (_signral != 1)
return;
_signral = 2;
_queues.Clear();
}
/// <summary>
/// 清空队列
/// </summary>
public void Clear()
{
_queues.Clear();
}
#endregion
}
}

View File

@ -0,0 +1,44 @@
using System;
using System.Windows;
using System.Windows.Controls;
namespace Wpf_AiSportsMicrospace
{
/// <summary>
/// 一些扩展方法
/// </summary>
internal static class Extensions
{
public const string TITLE = "AI运动微空间";
/// <summary>
/// 弹出信息提示框
/// </summary>
/// <param name="control">当前控件或窗体实例</param>
/// <param name="message">信息消息</param>
internal static MessageBoxResult ShowInformation(this Control control, string message)
{
return MessageBox.Show(message, TITLE, MessageBoxButton.OK, MessageBoxImage.Information);
}
/// <summary>
/// 弹出错误提示框
/// </summary>
/// <param name="control">当前控件或窗体实例</param>
/// <param name="message">错误消息</param>
internal static MessageBoxResult ShowError(this Control control, string message = "发生一个未知错误,详情请查看日志。")
{
return MessageBox.Show(message, TITLE, MessageBoxButton.OK, MessageBoxImage.Error);
}
/// <summary>
/// 弹出警告对话框
/// </summary>
/// <param name="control">当前控件或窗体实例</param>
/// <param name="message">警告消息</param>
internal static MessageBoxResult ShowWarning(this Control control, string message)
{
return MessageBox.Show(message, TITLE, MessageBoxButton.OKCancel, MessageBoxImage.Warning);
}
}
}

View File

@ -0,0 +1,37 @@
<Window x:Class="Wpf_AiSportsMicrospace.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Wpf_AiSportsMicrospace"
mc:Ignorable="d" Title="AI运动微空间" Height="700" Width="1200">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="250"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 左侧控制面板 -->
<StackPanel Grid.Column="0" Margin="10">
<ComboBox x:Name="sportList"
Height="25"
DisplayMemberPath="Name"
SelectedValuePath="Key"
SelectionChanged="sportList_SelectionChanged" d:IsHidden="True"/>
<TextBox x:Name="host" Margin="0,10,0,0" Text="192.168.3.64"/>
<TextBox x:Name="userName" Margin="0,10,0,0" Text="admin"/>
<TextBox x:Name="password" Margin="0,10,0,0" Text="yd708090"/>
<TextBox x:Name="port" Margin="0,10,0,0" Text="554"/>
<Button Content="Ping" Margin="0,10,0,0" Click="ping_Click"/>
<Button x:Name="startOrStop" Content="开始" Margin="0,10,0,0" Click="startOrStop_Click"/>
<TextBlock x:Name="sportCounts" Text="0" Margin="0,20,0,0"/>
<TextBlock x:Name="sportTimes" Text="00'00''"/>
</StackPanel>
<!-- 右侧视频预览 -->
<Canvas x:Name="rtspPreviewCanvas" Grid.Column="1" Background="Black"/>
</Grid>
</Window>

View File

@ -0,0 +1,159 @@
using Emgu.CV.Reg;
using System.Diagnostics;
using System.IO;
using System.Net.NetworkInformation;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Wpf_AiSportsMicrospace.Common;
using Yztob.AiSports.Common;
using Yztob.AiSports.Inferences.Abstractions;
using Yztob.AiSports.Inferences.Things;
using Yztob.AiSports.Postures.Sports;
using Yztob.AiSports.Postures.Things;
using Yztob.AiSports.Sensors.Abstractions;
using Yztob.AiSports.Sensors.Things;
namespace Wpf_AiSportsMicrospace;
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
#region
private IHumanPredictor _humanPredictor;
private IObjectDetector _objectDetector;
private HumanGraphicsRenderer _humanGraphicsRenderer;
private readonly List<SportDescriptor> _sports;
private SportBase _sport;
private readonly SportDetectionQueue _detectQueue;
#endregion
public MainWindow()
{
InitializeComponent();
// 输出到控制台
_humanPredictor = HumanPredictorFactory.Create(HumanPredictorType.SingleHigh);
_objectDetector = ObjectDetectorFactory.CreateSportGoodsDetector();
_humanGraphicsRenderer = new HumanGraphicsRenderer();
_humanGraphicsRenderer.DrawLabel = false;
_sports = SportBase.GetSports();
_detectQueue = new SportDetectionQueue();
this.sportList.ItemsSource = _sports;
this.sportList.SelectedIndex = 0;
this.OnSelectedSport();
}
private void sportList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
this.OnSelectedSport();
}
private void OnSelectedSport()
{
var sport = SportBase.Create(_sports[this.sportList.SelectedIndex].Key);
sport.OnTicked += this.OnSportTick;
if (_sport?.IsCounting == true)
sport.Start();
_sport?.Stop();
_detectQueue.Stop();
_sport = sport;
_detectQueue.Sport = _sport;
}
private void ping_Click(object sender, RoutedEventArgs e)
{
var host = this.host.Text.Trim();
if (string.IsNullOrWhiteSpace(host))
{
this.ShowError("相机主机地址/IP不能为空。");
return;
}
var pinger = new Ping();
var reply = pinger.Send(host, 10);
if (reply.Status == IPStatus.Success)
this.ShowInformation("与相机通信正常。");
else
this.ShowError($"与相机通信失败,错误:{reply.Status}。");
}
private void startOrStop_Click(object sender, RoutedEventArgs e)
{
var host = this.host.Text.Trim();
if (string.IsNullOrWhiteSpace(host))
{
this.ShowError("相机主机地址/IP不能为空。");
return;
}
var userName = this.userName.Text.Trim();
if (string.IsNullOrWhiteSpace(userName))
{
this.ShowError("用户名不能为空。");
return;
}
var password = this.password.Text.Trim();
if (string.IsNullOrWhiteSpace(password))
{
this.ShowError("密码不能为空。");
return;
}
var port = 554u;//RTSP协议默认端口是554
var tempPath = "./temps";
if (!Directory.Exists(tempPath))
Directory.CreateDirectory(tempPath);
var _webcamClient = WebcamClient.CreateRTSP(host, userName, password, port);
//处理抽帧回调
_webcamClient.OnExtractFrame += this.OnFrameExtracted;
_webcamClient.StartExtract();//开始抽帧
}
private async void OnFrameExtracted(VideoFrame frame)
{
//获得帧二进制流,保存图像、人体识别竺
var buffer = frame.GetImageBuffer(ImageFormat.Jpeg).ToArray();
await File.WriteAllBytesAsync($"./temps/{frame.Number}.jpg", buffer);
//可以进一步进行人体识别等
var humanResult = await Task.Run<HumanInferenceResult>(() => _humanPredictor.Predicting(buffer, frame.Number));
var human = humanResult?.Humans?.FirstOrDefault();
_detectQueue.Enqueue(frame.Number, human, null);
//var count = _sport.GetFormatCounts();
}
private void OnSportTick(int counts, int times)
{
var ts = TimeSpan.FromSeconds(times);
// 使用 Dispatcher 调用 UI 更新
this.Dispatcher.BeginInvoke(new Action(() =>
{
this.sportCounts.Text = _sport.GetFormatCounts(); // counts.ToString();
this.sportTimes.Text = _sport.GetFormatTimes(); // ts.ToString(@"mm\'ss\"");
// 如果需要触发停止逻辑
//if (!_sport.IsCounting)
// this.startOrStop_Click(null, null);
}));
//VoiceBroadcast.PlayTick();
}
}

View File

@ -0,0 +1,54 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UseWPF>true</UseWPF>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AutoMapper" Version="15.0.1" />
<PackageReference Include="Emgu.CV" Version="4.12.0.5764" />
<PackageReference Include="Emgu.CV.runtime.windows" Version="4.12.0.5764" />
<PackageReference Include="FFmpeg.AutoGen" Version="7.1.1" />
<PackageReference Include="FFmpeg.AutoGen.Abstractions" Version="7.1.1" />
<PackageReference Include="FFmpeg.AutoGen.Bindings.DynamicallyLoaded" Version="7.1.1" />
<PackageReference Include="Microsoft.Management.Infrastructure" Version="3.0.0" />
<PackageReference Include="Microsoft.ML" Version="4.0.2" />
<PackageReference Include="Microsoft.ML.OnnxRuntime" Version="1.22.1" />
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.11" />
<PackageReference Include="SixLabors.ImageSharp.Drawing" Version="2.1.7" />
<PackageReference Include="SkiaSharp" Version="3.119.0" />
<PackageReference Include="System.Speech" Version="9.0.9" />
</ItemGroup>
<ItemGroup>
<Reference Include="Yunzhi.Library">
<HintPath>..\sdks\Yunzhi.Library.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Yztob.AiSports.Common">
<HintPath>..\sdks\Yztob.AiSports.Common.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Yztob.AiSports.Inferences">
<HintPath>..\sdks\Yztob.AiSports.Inferences.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Yztob.AiSports.Postures">
<HintPath>..\sdks\Yztob.AiSports.Postures.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Yztob.AiSports.Sensors">
<HintPath>..\sdks\Yztob.AiSports.Sensors.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Yztob.AiSports.Sensors.WinForm">
<HintPath>..\sdks\Yztob.AiSports.Sensors.WinForm.dll</HintPath>
<Private>True</Private>
</Reference>
</ItemGroup>
</Project>

View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.13.35828.75 d17.13
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wpf_AiSportsMicrospace", "Wpf_AiSportsMicrospace.csproj", "{345052A8-36AD-4739-80F6-991A4DD84ADC}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{345052A8-36AD-4739-80F6-991A4DD84ADC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{345052A8-36AD-4739-80F6-991A4DD84ADC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{345052A8-36AD-4739-80F6-991A4DD84ADC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{345052A8-36AD-4739-80F6-991A4DD84ADC}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {86C400B0-7773-468C-B42F-0FDDD4087BDF}
EndGlobalSection
EndGlobal

12
readme.txt Normal file
View File

@ -0,0 +1,12 @@
一、文件结构
├── FFmpeg 媒体处理库ffmpeg预编译库调试和发布时需拷至主目录
├── models 开发包所需的模型文件,调试和发布时需拷至主目录
├── src demo项目源码文件夹
├── sdks SDK的.net程序集文件夹
│ └── Yunzhi.Library.dll 基础工具类库
│ └── Yztob.AiSports.Common.dll AI运动开发套件的公共库
│ └── Yztob.AiSports.Inferences.dll 人体、体育器材检测推理库
│ └── Yztob.AiSports.Postures.dll 姿态、运动分析库
│ └── Yztob.AiSports.Sensors.dll 设备、传感器操作库
│ └── Yztob.AiSports.Sensors.WinForm.dll 设备、传感器WinForm组件库

BIN
sdks/Yunzhi.Library.dll Normal file

Binary file not shown.

5097
sdks/Yunzhi.Library.xml Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -0,0 +1,502 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Yztob.AiSports.Common</name>
</assembly>
<members>
<member name="T:Yztob.AiSports.Common.Abstractions.IDebugTrackChannel">
<summary>
<seealso cref="T:Yztob.AiSports.Common.DebugTracker"/>跟踪追踪抽象接口
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Abstractions.IDebugTrackChannel.Output(System.String,System.String)">
<summary>
输出一条不带格式化的消息
</summary>
<param name="source">消息来源</param>
<param name="message">消息文本</param>
</member>
<member name="M:Yztob.AiSports.Common.Abstractions.IDebugTrackChannel.Output(System.String,System.String,System.Object[])">
<summary>
输出一条带格式化的消息
</summary>
<param name="source">消息来源</param>
<param name="format">消息格式文本</param>
<param name="args">输出参数</param>
</member>
<member name="T:Yztob.AiSports.Common.AiSportLicense">
<summary>
授权相关操作入口
</summary>
</member>
<member name="M:Yztob.AiSports.Common.AiSportLicense.GetMachineId">
<summary>
获取机器识别信息
</summary>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Common.AiSportLicense.Activate(System.String)">
<summary>
激活SDK
</summary>
<param name="licenseText">授权码</param>
<returns>
0: 注册成功
10参数不正确
11机器码不符
100试用授权到期
-1000发生未知异常<seealso cref="T:System.Exception"/>异常
</returns>
</member>
<member name="M:Yztob.AiSports.Common.AiSportLicense.Checking">
<summary>
检查当前SDK激活状态
</summary>
<returns>
0: 激活状态正常
10未激活/无授权文件
11机器码不符
100试用授权到期
-1000发生未知异常<seealso cref="T:System.Exception"/>异常
</returns>
</member>
<member name="T:Yztob.AiSports.Common.DebugTracker">
<summary>
AI运动相关调试信息追踪器
</summary>
</member>
<member name="M:Yztob.AiSports.Common.DebugTracker.#cctor">
<summary>
全局初始化
</summary>
</member>
<member name="P:Yztob.AiSports.Common.DebugTracker.Enabled">
<summary>
获取或设置是否启用消息输出
</summary>
</member>
<member name="P:Yztob.AiSports.Common.DebugTracker.Channels">
<summary>
获取消息输出通道
</summary>
<remarks>
默认会有<seealso cref="T:Yztob.AiSports.Common.Implement.ConsoleDebugTrackChannel"/>通道
</remarks>
</member>
<member name="M:Yztob.AiSports.Common.DebugTracker.Output(System.String,System.String)">
<summary>
向追踪通道输出一条不带格式化追踪消息
</summary>
<param name="source">消息来源</param>
<param name="message">要输入的消息</param>
</member>
<member name="M:Yztob.AiSports.Common.DebugTracker.Output(System.String,System.String,System.Object[])">
<summary>
向追踪通道输出一条带格式化的消息
</summary>
<param name="source">消息来源</param>
<param name="format">消息格式文本</param>
<param name="args">输出参数</param>
</member>
<member name="T:Yztob.AiSports.Common.Fonts">
<summary>
AI运动需要用到的渲染字体相关
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Fonts.GetFontBuffer">
<summary>
获取默认渲染字体字节流
</summary>
<returns></returns>
</member>
<member name="T:Yztob.AiSports.Common.Implement.ConsoleDebugTrackChannel">
<summary>
控制台调试追踪通道
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Implement.ConsoleDebugTrackChannel.Output(System.String,System.String)">
<inheritdoc />
</member>
<member name="M:Yztob.AiSports.Common.Implement.ConsoleDebugTrackChannel.Output(System.String,System.String,System.Object[])">
<inheritdoc />
</member>
<member name="T:Yztob.AiSports.Common.Implement.DiagnosisDebugTrackChannel">
<summary>
诊断Debugger调试追踪通道
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Implement.DiagnosisDebugTrackChannel.Output(System.String,System.String)">
<inheritdoc />
</member>
<member name="M:Yztob.AiSports.Common.Implement.DiagnosisDebugTrackChannel.Output(System.String,System.String,System.Object[])">
<inheritdoc />
</member>
<member name="T:Yztob.AiSports.Common.Implement.LogDebugTrackChannel">
<summary>
日志形式调试追踪通道
</summary>
<remarks>注意要配置名为ai-debugger的日志输出器</remarks>
</member>
<member name="M:Yztob.AiSports.Common.Implement.LogDebugTrackChannel.Output(System.String,System.String)">
<inheritdoc />
</member>
<member name="M:Yztob.AiSports.Common.Implement.LogDebugTrackChannel.Output(System.String,System.String,System.Object[])">
<inheritdoc />
</member>
<member name="T:Yztob.AiSports.Common.Licenses.FeatureCpuPartMap">
<summary>
表示受权机器CPU部件特性图
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.FeatureCpuPartMap.#ctor">
<summary>
初始化CPU部件特征图
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.FeatureCpuPartMap.Extracting">
<summary>
提取CPU特征
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.FeatureCpuPartMap.Print">
<inheritdoc />
</member>
<member name="T:Yztob.AiSports.Common.Licenses.FeatureDiskPartMap">
<summary>
表示受权机器硬盘部件特性图
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.FeatureDiskPartMap.#ctor">
<summary>
初始化网卡部件特征图
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.FeatureDiskPartMap.Extracting">
<summary>
提取CPU特征
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.FeatureDiskPartMap.Print">
<inheritdoc />
</member>
<member name="T:Yztob.AiSports.Common.Licenses.FeatureItem">
<summary>
表示一条受权机器特征条目
</summary>
</member>
<member name="P:Yztob.AiSports.Common.Licenses.FeatureItem.Key">
<summary>
获取或设置特征唯一键
</summary>
</member>
<member name="P:Yztob.AiSports.Common.Licenses.FeatureItem.Value">
<summary>
获取或设置特征值
</summary>
</member>
<member name="T:Yztob.AiSports.Common.Licenses.FeatureMap">
<summary>
表示受权机器特征图
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.FeatureMap.#ctor">
<summary>
初始化特征图
</summary>
</member>
<member name="P:Yztob.AiSports.Common.Licenses.FeatureMap.CPU">
<summary>
获取或设置CPU特征值
</summary>
</member>
<member name="P:Yztob.AiSports.Common.Licenses.FeatureMap.Networks">
<summary>
获取或设置网卡特征集
</summary>
</member>
<member name="P:Yztob.AiSports.Common.Licenses.FeatureMap.Disks">
<summary>
获取或设置硬盘特征集
</summary>
</member>
<member name="P:Yztob.AiSports.Common.Licenses.FeatureMap.Digests">
<summary>
获取或设置特征图哈希摘要
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.FeatureMap.CalculateDigests">
<summary>
生成特征指纹
</summary>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.FeatureMap.Print">
<summary>
打包受权机器整体特征图
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.FeatureMap.ToJson">
<summary>
将当前对象转换成JSON对象
</summary>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.FeatureMap.Extracting">
<summary>
提取当前特征图,加密输出
</summary>
<returns></returns>
</member>
<member name="T:Yztob.AiSports.Common.Licenses.FeatureNetworkAdapterPartMap">
<summary>
表示受权机器网卡部件特性图
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.FeatureNetworkAdapterPartMap.#ctor">
<summary>
初始化网卡部件特征图
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.FeatureNetworkAdapterPartMap.Extracting">
<summary>
提取CPU特征
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.FeatureNetworkAdapterPartMap.Print">
<inheritdoc />
</member>
<member name="T:Yztob.AiSports.Common.Licenses.FeaturePartMap">
<summary>
表示某一类部件的特征图
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.FeaturePartMap.#ctor(System.String[])">
<summary>
初始化部件特征图
</summary>
<param name="digestKeys">生成特征摘要KEY</param>
</member>
<member name="P:Yztob.AiSports.Common.Licenses.FeaturePartMap.FeatureKeys">
<summary>
获取或设置用于生成特征摘要KEY
</summary>
</member>
<member name="P:Yztob.AiSports.Common.Licenses.FeaturePartMap.Features">
<summary>
获取或设置特征集列表
</summary>
</member>
<member name="P:Yztob.AiSports.Common.Licenses.FeaturePartMap.Digests">
<summary>
获取或设置部件特征图哈希摘要
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.FeaturePartMap.CalculateDigests">
<summary>
生成特征指纹
</summary>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.FeaturePartMap.Print">
<summary>
打印特征信息
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.FeaturePartMap.ToJson">
<summary>
将当前对象转换成JSON对象
</summary>
<returns></returns>
</member>
<member name="T:Yztob.AiSports.Common.Licenses.LicenseException">
<summary>
授权相关错误异常
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.LicenseException.#ctor(System.String,System.Int32,System.Exception)">
<summary>
初始化异常
</summary>
<param name="message">错误信息</param>
<param name="code">错误代码</param>
<param name="innterException">内部异常</param>
</member>
<member name="T:Yztob.AiSports.Common.Licenses.LicenseImplant">
<summary>
链接嵌入式授权相关服务
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.LicenseImplant.Checking">
<summary>
检查当前SDK激活状态
</summary>
<returns>
0: 激活状态正常
10未激活/无授权文件
11机器码不符
100试用授权到期
-1000发生未知异常<seealso cref="T:System.Exception"/>异常
</returns>
</member>
<member name="T:Yztob.AiSports.Common.Licenses.Protection">
<summary>
RSA非对称加/解
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.Protection.GetMaxEncryptSize(System.Security.Cryptography.RSA,System.Security.Cryptography.RSAEncryptionPadding)">
<summary>
获取RSA每次最多参加密多少数据
</summary>
<param name="rsa"></param>
<param name="padding">填充模式</param>
<returns></returns>
<exception cref="T:System.NotSupportedException"></exception>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.Protection.Encrypting(System.Byte[])">
<summary>
加密二进制流数据
</summary>
<param name="buffer">要加密的数据缓冲区</param>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.Protection.Encrypting(System.String)">
<summary>
加密文本数据
</summary>
<param name="plain">明文文本</param>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.Protection.Decrypting(System.String)">
<summary>
解密指定的文本
</summary>
<param name="ciphertext">私钥加密的文本Base64字符串</param>
<returns></returns>
</member>
<member name="T:Yztob.AiSports.Common.Licenses.RelaxRsaEncipher">
<summary>
宽松版RSA加密算法
</summary>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.RelaxRsaEncipher.#ctor(System.Security.Cryptography.RSAParameters)">
<summary>
初始化加密器
</summary>
<param name="parameters">RSA加密参数</param>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.RelaxRsaEncipher.RemovePkcs1Padding(System.Byte[])">
<summary>
移除数据中的PKcs#1.5填充
</summary>
<param name="paddedData">已填充的数据</param>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.RelaxRsaEncipher.FromByteArray(System.Byte[])">
<summary>
从字节流加密流中创建大整数如果有前导0则先删除
</summary>
<param name="buffer"></param>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Common.Licenses.RelaxRsaEncipher.PublicDecrypt(System.Byte[])">
<summary>
使用公钥解密
</summary>
<param name="encryptedData">加密数据</param>
<returns></returns>
</member>
<member name="T:Yztob.AiSports.Common.Properties.Resources">
<summary>
一个强类型的资源类,用于查找本地化的字符串等。
</summary>
</member>
<member name="P:Yztob.AiSports.Common.Properties.Resources.ResourceManager">
<summary>
返回此类使用的缓存的 ResourceManager 实例。
</summary>
</member>
<member name="P:Yztob.AiSports.Common.Properties.Resources.Culture">
<summary>
重写当前线程的 CurrentUICulture 属性,对
使用此强类型资源类的所有资源查找执行重写。
</summary>
</member>
<member name="P:Yztob.AiSports.Common.Properties.Resources.AlibabaPuHuiTi_3_Light">
<summary>
查找 System.Byte[] 类型的本地化资源。
</summary>
</member>
<member name="T:Yztob.AiSports.Common.SportAppSettingService">
<summary>
AI运动应用公共设定服务
</summary>
</member>
<member name="M:Yztob.AiSports.Common.SportAppSettingService.#cctor">
<summary>
全局初始化
</summary>
</member>
<member name="M:Yztob.AiSports.Common.SportAppSettingService.Get``1(System.String,System.Func{``0})">
<summary>
获取配置
</summary>
<typeparam name="T">配置类型</typeparam>
<param name="key">配置节唯一键</param>
<param name="defaultGetter">若值不存在取默认取器</param>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Common.SportAppSettingService.Set``1(System.String,``0)">
<summary>
设定配置
</summary>
<typeparam name="T">配置类型</typeparam>
<param name="key">配置节唯一键</param>
<param name="value">配置参数</param>
</member>
<member name="M:Yztob.AiSports.Common.SportAppSettingService.Save">
<summary>
持久化保存当前配置致文件中
</summary>
</member>
<member name="T:Yztob.AiSports.Common.Things.LicenseInfo">
<summary>
授权许可信息
</summary>
</member>
<member name="P:Yztob.AiSports.Common.Things.LicenseInfo.Type">
<summary>
获取或设置授权类型
</summary>
</member>
<member name="P:Yztob.AiSports.Common.Things.LicenseInfo.MachineId">
<summary>
获取或设置受权机器唯一识别码
</summary>
</member>
<member name="P:Yztob.AiSports.Common.Things.LicenseInfo.Owner">
<summary>
获取或设置,受权主体(公司、个人)名称
</summary>
</member>
<member name="P:Yztob.AiSports.Common.Things.LicenseInfo.GrantTimestamp">
<summary>
获取或设置授予许可的时间戳单位UTC时间
</summary>
</member>
<member name="T:Yztob.AiSports.Common.Things.LicenseType">
<summary>
授权类型
</summary>
</member>
<member name="F:Yztob.AiSports.Common.Things.LicenseType.Trial">
<summary>
试用评估授权
</summary>
</member>
<member name="F:Yztob.AiSports.Common.Things.LicenseType.Permanent">
<summary>
永久授权
</summary>
</member>
</members>
</doc>

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -0,0 +1,153 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Yztob.AiSports.Sensors.WinForm</name>
</assembly>
<members>
<member name="T:Yztob.AiSports.Sensors.WinForm.Properties.Resources">
<summary>
一个强类型的资源类,用于查找本地化的字符串等。
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.WinForm.Properties.Resources.ResourceManager">
<summary>
返回此类使用的缓存的 ResourceManager 实例。
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.WinForm.Properties.Resources.Culture">
<summary>
重写当前线程的 CurrentUICulture 属性,对
使用此强类型资源类的所有资源查找执行重写。
</summary>
</member>
<member name="T:Yztob.AiSports.Sensors.WinForm.RTSPPreview">
<summary>
RTSP网络视频预览组件
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.WinForm.RTSPPreview.#ctor">
<summary>
初始化RTSP播放器
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.WinForm.RTSPPreview.Host">
<summary>
获取或设置相机主机名/IP
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.WinForm.RTSPPreview.Port">
<summary>
获取或设置端口号
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.WinForm.RTSPPreview.UserName">
<summary>
获取或设置用户名或密码
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.WinForm.RTSPPreview.Password">
<summary>
获取或设置密码
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.WinForm.RTSPPreview.Adaptive">
<summary>
获取或设置自应用大小,保持同比缩放
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.WinForm.RTSPPreview.IsPlaying">
<summary>
获取当前是否正在播放
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.WinForm.RTSPPreview.ScaleRatio">
<summary>
获取当前画面与原始帧图像的缩放比例
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.WinForm.RTSPPreview.OffsetX">
<summary>
获取当画面缩放后X轴的偏移量即黑边大小
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.WinForm.RTSPPreview.OffsetY">
<summary>
获取当画面缩放后X轴的偏移量即黑边大小
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.WinForm.RTSPPreview.OnExtracted">
<summary>
获取或设置抽帧响应
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.WinForm.RTSPPreview.OnFrameProcessing">
<summary>
获取或设置帧图像处理响应
</summary>
<remarks>
如果有进一步处理图像的要求,如图像推理检测、截屏保存等需要,可以监听此响应
响应为jpeg图像参数分别为图像宽度、图像高度、图像二制流.
</remarks>
</member>
<member name="E:Yztob.AiSports.Sensors.WinForm.RTSPPreview.FrameViewPaint">
<summary>
帧展示视图绘制事件
</summary>
<remarks>可以利用此事件在窗口绘制日期,提示语等</remarks>
</member>
<member name="M:Yztob.AiSports.Sensors.WinForm.RTSPPreview.OnPaint(System.Windows.Forms.PaintEventArgs)">
<inheritdoc />
</member>
<member name="M:Yztob.AiSports.Sensors.WinForm.RTSPPreview.Dispose">
<inheritdoc />
</member>
<member name="M:Yztob.AiSports.Sensors.WinForm.RTSPPreview.Play">
<summary>
启动抽帧/预览
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.WinForm.RTSPPreview.Stop">
<summary>
停止预览
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.WinForm.RTSPPreview.SaveFrameToJpeg(System.String)">
<summary>
对当前播放的帧进行保存
</summary>
<param name="path">图片保存路径</param>
</member>
<member name="F:Yztob.AiSports.Sensors.WinForm.RTSPPreview.components">
<summary>
必需的设计器变量。
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.WinForm.RTSPPreview.Dispose(System.Boolean)">
<summary>
清理所有正在使用的资源。
</summary>
<param name="disposing">如果应释放托管资源,为 true否则为 false。</param>
</member>
<member name="M:Yztob.AiSports.Sensors.WinForm.RTSPPreview.InitializeComponent">
<summary>
设计器支持所需的方法 - 不要修改
使用代码编辑器修改此方法的内容。
</summary>
</member>
<member name="T:Yztob.AiSports.Sensors.WinForm.TransparentLayer">
<summary>
透明层背景
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.WinForm.TransparentLayer.#ctor">
<summary>
初始化控件
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.WinForm.TransparentLayer.CreateParams">
<summary>
获取创建控件句柄时所需要的创建参数
</summary>
</member>
</members>
</doc>

Binary file not shown.

View File

@ -0,0 +1,380 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Yztob.AiSports.Sensors</name>
</assembly>
<members>
<member name="T:Yztob.AiSports.Sensors.Abstractions.CameraProtocol">
<summary>
相机操控协议
</summary>
</member>
<member name="F:Yztob.AiSports.Sensors.Abstractions.CameraProtocol.Local">
<summary>
本机设备本机连接USB、自带等相机
</summary>
</member>
<member name="F:Yztob.AiSports.Sensors.Abstractions.CameraProtocol.RTSP">
<summary>
实时流传输协议(Real Time Streaming Protocol RTSP)
</summary>
</member>
<member name="T:Yztob.AiSports.Sensors.Abstractions.CameraStatus">
<summary>
相机设备状态
</summary>
</member>
<member name="F:Yztob.AiSports.Sensors.Abstractions.CameraStatus.Unknown">
<summary>
状态未知
</summary>
</member>
<member name="F:Yztob.AiSports.Sensors.Abstractions.CameraStatus.Initialized">
<summary>
设备连接已初始化
</summary>
</member>
<member name="F:Yztob.AiSports.Sensors.Abstractions.CameraStatus.Connected">
<summary>
已连接
</summary>
</member>
<member name="F:Yztob.AiSports.Sensors.Abstractions.CameraStatus.Closed">
<summary>
已关闭/已断开
</summary>
</member>
<member name="T:Yztob.AiSports.Sensors.Abstractions.FrameExtracted">
<summary>
抽到帧回调到响应委托
</summary>
<param name="frame">提取的视频帧</param>
</member>
<member name="T:Yztob.AiSports.Sensors.Abstractions.WebcamClient">
<summary>
网络相机抽象客户端
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.Abstractions.WebcamClient.#ctor(Yztob.AiSports.Sensors.Abstractions.CameraProtocol)">
<summary>
初始化相机客户端
</summary>
<param name="protocol">相机协议</param>
</member>
<member name="P:Yztob.AiSports.Sensors.Abstractions.WebcamClient.Protocol">
<summary>
获取当前客户端支持的协议
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.Abstractions.WebcamClient.Status">
<summary>
获取或设置当前设备状态
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.Abstractions.WebcamClient.OnExtractFrame">
<summary>
获取或设置帧处理回调
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.Abstractions.WebcamClient.Connect">
<summary>
连接当前设备
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.Abstractions.WebcamClient.Disconnect">
<summary>
断开设备设备连接
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.Abstractions.WebcamClient.StartExtract">
<summary>
开始抽取帧图像
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.Abstractions.WebcamClient.StopExtract">
<summary>
停止抽取帧图像
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.Abstractions.WebcamClient.Dispose">
<summary>
释放当前设备资源
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.Abstractions.WebcamClient.CreateRTSP(System.String,System.String,System.String,System.UInt32)">
<summary>
创建RTSP客户端实例
</summary>
<param name="host">主机名/IP地址</param>
<param name="port">端口号</param>
<param name="userName">用户名</param>
<param name="password">密码</param>
<returns></returns>
</member>
<member name="T:Yztob.AiSports.Sensors.Implement.Extensions">
<summary>
一些扩展方法
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.Implement.Extensions.ResolvingAVStringError(System.Int32)">
<summary>
调用av_strerror解析错误说明
</summary>
<param name="error">错误代码地址</param>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Sensors.Implement.Extensions.ThrowExceptionIfError(System.Int32)">
<summary>
如果AV相关函数执行有错误则抛异常
</summary>
<param name="error">错代码地址</param>
<returns></returns>
<exception cref="T:System.ApplicationException">抛出程序异常</exception>
</member>
<member name="T:Yztob.AiSports.Sensors.Implement.FFmpegLoader">
<summary>
FFmpeg框架加载器
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.Implement.FFmpegLoader.RegisterFFmpegBinaries">
<summary>
注册FFmpeg二进制库
</summary>
<exception cref="T:System.NotSupportedException">非windows平台时引发</exception>
</member>
<member name="M:Yztob.AiSports.Sensors.Implement.FFmpegLoader.Initiailze">
<summary>
初始化FFmpeg类库
</summary>
</member>
<member name="T:Yztob.AiSports.Sensors.Implement.RTSPWebcamClient">
<summary>
RTSP协议网络相机客户端
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.Implement.RTSPWebcamClient.#cctor">
<summary>
全局初始化
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.Implement.RTSPWebcamClient.#ctor(System.String,System.UInt32,System.String,System.String)">
<summary>
初始化RTSP相机客户端
</summary>
<param name="host">相机主机名、IP</param>
<param name="port">端口号</param>
<param name="userName">用户名</param>
<param name="password">密码</param>
</member>
<member name="M:Yztob.AiSports.Sensors.Implement.RTSPWebcamClient.Extracting">
<summary>
执行抽帧
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.Implement.RTSPWebcamClient.Connect">
<inheritdoc />
</member>
<member name="M:Yztob.AiSports.Sensors.Implement.RTSPWebcamClient.Disconnect">
<inheritdoc />
</member>
<member name="M:Yztob.AiSports.Sensors.Implement.RTSPWebcamClient.StartExtract">
<inheritdoc />
</member>
<member name="M:Yztob.AiSports.Sensors.Implement.RTSPWebcamClient.StopExtract">
<inheritdoc />
</member>
<member name="M:Yztob.AiSports.Sensors.Implement.RTSPWebcamClient.Dispose">
<inheritdoc />
</member>
<member name="T:Yztob.AiSports.Sensors.Implement.VideoFrameConverter">
<summary>
视频帧格式转换器
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.Implement.VideoFrameConverter.#ctor(System.Drawing.Size,FFmpeg.AutoGen.Abstractions.AVPixelFormat,System.Drawing.Size,FFmpeg.AutoGen.Abstractions.AVPixelFormat)">
<summary>
初始化帧转换器
</summary>
<param name="sourceSize">帧原始大小</param>
<param name="sourcePixelFormat">帧图像像素格式</param>
<param name="destinationSize">目标大小</param>
<param name="destinationPixelFormat">目标像素格式</param>
<exception cref="T:System.ApplicationException">ffmpeg原始异常</exception>
</member>
<member name="M:Yztob.AiSports.Sensors.Implement.VideoFrameConverter.Convert(FFmpeg.AutoGen.Abstractions.AVFrame)">
<summary>
执行帧转
</summary>
<param name="sourceFrame">原始帧</param>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Sensors.Implement.VideoFrameConverter.Dispose">
<summary>
释放当前转换器资源
</summary>
</member>
<member name="T:Yztob.AiSports.Sensors.Implement.VideoStreamDecoder">
<summary>
视频流解码器
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.Implement.VideoStreamDecoder.#ctor(System.String,FFmpeg.AutoGen.Abstractions.AVHWDeviceType)">
<summary>
初始化解码器
</summary>
<param name="url">设备访问url</param>
<param name="HWDeviceType">硬件设备类型</param>
</member>
<member name="P:Yztob.AiSports.Sensors.Implement.VideoStreamDecoder.CodecName">
<summary>
获取解码器名称
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.Implement.VideoStreamDecoder.FrameSize">
<summary>
获取帧图像大小
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.Implement.VideoStreamDecoder.PixelFormat">
<summary>
获取帧格式
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.Implement.VideoStreamDecoder.TryDecodeNextFrame(FFmpeg.AutoGen.Abstractions.AVFrame@)">
<summary>
偿试获取流的下一帧
</summary>
<param name="frame">输出的图像帧</param>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Sensors.Implement.VideoStreamDecoder.GetContextInfo">
<summary>
获取当前帧格式信息
</summary>
<returns>帧上下文信息字典</returns>
</member>
<member name="M:Yztob.AiSports.Sensors.Implement.VideoStreamDecoder.Dispose">
<summary>
释放当前解码器资源
</summary>
</member>
<member name="T:Yztob.AiSports.Sensors.Things.ImageFormat">
<summary>
图像格式
</summary>
</member>
<member name="F:Yztob.AiSports.Sensors.Things.ImageFormat.Jpeg">
<summary>
jpg、jpeg格式
</summary>
</member>
<member name="F:Yztob.AiSports.Sensors.Things.ImageFormat.Png">
<summary>
png格式
</summary>
</member>
<member name="T:Yztob.AiSports.Sensors.Things.VideoFrame">
<summary>
表示一个视频帧
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.Things.VideoFrame.#ctor(Yztob.AiSports.Sensors.Implement.VideoFrameConverter,System.Int32,System.Int32,FFmpeg.AutoGen.Abstractions.AVFrame)">
<summary>
初始化视频帧
</summary>
<param name="converter">帧格式转换器,由<seealso cref="T:Yztob.AiSports.Sensors.Implement.VideoStreamDecoder"/>提供</param>
<param name="width">帧宽度</param>
<param name="height">帧高度</param>
<param name="frame">ffpmeg帧数据指针</param>
</member>
<member name="P:Yztob.AiSports.Sensors.Things.VideoFrame.Number">
<summary>
获取或设置帧序号每次播放从0开始
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.Things.VideoFrame.Width">
<summary>
获取帧宽度,单位:像素
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.Things.VideoFrame.Height">
<summary>
获取帧高度,单位:像素
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.Things.VideoFrame.Frame">
<summary>
获取FFmpeg原始帧
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.Things.VideoFrame.Timestamp">
<summary>
获取或设置时间戳从UTC:2000-01-01开始的耗秒数
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.Things.VideoFrame.GetImageBuffer(Yztob.AiSports.Sensors.Things.ImageFormat)">
<summary>
将当前帧转换成指定格式图像,并返回图像缓冲区数组
</summary>
<param name="format">要转换的格式</param>
<returns></returns>
</member>
<member name="M:Yztob.AiSports.Sensors.Things.VideoFrame.GetImageStream(Yztob.AiSports.Sensors.Things.ImageFormat)">
<summary>
将当前帧转换成指定格式图像,并获取二进制流
</summary>
<param name="format">要转换的目标格式</param>
<returns></returns>
</member>
<member name="T:Yztob.AiSports.Sensors.Things.VideoFrameWithBuffer">
<summary>
表示一个携带帧缓冲区的视频信息
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.Things.VideoFrameWithBuffer.#ctor(System.Int32,System.Int32,System.Byte[])">
<summary>
初始化帧缓冲区的视频信息
</summary>
<param name="width">帧宽度</param>
<param name="height">帧高度</param>
<param name="buffer">帧缓冲区</param>
</member>
<member name="P:Yztob.AiSports.Sensors.Things.VideoFrameWithBuffer.Number">
<summary>
获取或设置帧序号每次播放从0开始
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.Things.VideoFrameWithBuffer.Width">
<summary>
获取帧宽度,单位:像素
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.Things.VideoFrameWithBuffer.Height">
<summary>
获取帧高度,单位:像素
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.Things.VideoFrameWithBuffer.Buffer">
<summary>
获取FFmpeg原始帧
</summary>
</member>
<member name="P:Yztob.AiSports.Sensors.Things.VideoFrameWithBuffer.Timestamp">
<summary>
获取或设置时间戳从UTC:2000-01-01开始的耗秒数
</summary>
</member>
<member name="T:Yztob.AiSports.Sensors.Utility">
<summary>
一些相关的公共工具方法
</summary>
</member>
<member name="M:Yztob.AiSports.Sensors.Utility.GetHWPixelFormat(FFmpeg.AutoGen.Abstractions.AVHWDeviceType)">
<summary>
根据<paramref name="hwDevice"/>返回相互格式
</summary>
<param name="hwDevice">解码设备类型</param>
<returns></returns>
</member>
</members>
</doc>