This is a C# library that enables seamless integration with cameras using both RTSP and WebSocket protocols. It provides functionalities for video streaming, beamforming image processing, and more.
-
RTSP Video Streaming:
- Receive and process video frames in real time.
- Decode H.264 video frames using the integrated decoder.
-
Beamforming Visualization:
- Retrieve and process beamforming data for visualization.
- Customize beamforming settings such as threshold, range, and mode (Full View or Multi-Source).
-
WebSocket Support:
- Subscribe to and handle WebSocket messages for beamforming updates.
-
Image Conversion Utilities:
- Convert video frames and beamforming data to various formats, including raw pixel data and PNG.
-
Customizable Image Processing:
- Advanced interpolation and dampening algorithms for hotspot visualization.
- Clone the repository or download the source code.
- Add the project to your solution or include the library in your project.
- Ensure all required dependencies are referenced as a nuget package:
FFmpeg.AutoGenOpenCvSharpGoogle.ProtobufWebsocket.Client
- Move dll files from
gui-example\win-x64orgui-example\win-arm64to your project. Folder structure should be same with origin, such as{YOUR_PROJECT}\win-64or{YOUR_PROJECT}\win-arm64 - Open your project's csproj file and add following items.
<ItemGroup>
<ARM64Binaries Include="win-arm64\**" />
<X64Binaries Include="win-x64\**" />
</ItemGroup>
<Target Name="AfterBuildARM" AfterTargets="Build" Condition=" '$(Platform)' == 'ARM64' ">
<Message Text="Copying ARM64 Binaries..." Importance="High" />
<Copy SourceFiles="@(ARM64Binaries)" DestinationFolder="$(OutDir)" />
<Message Text="Cleaning up Unsupported Architecture Dependencies..." Importance="High" />
<RemoveDir Directories="$(OutDir)\runtimes\win-x64" />
<RemoveDir Directories="$(OutDir)\runtimes\win-x86" />
<RemoveDir Directories="$(OutDir)\runtimes\win10-x64" />
<RemoveDir Directories="$(OutDir)\runtimes\win10-x86" />
</Target>
<Target Name="AfterPublishARM" AfterTargets="Publish" Condition=" '$(Platform)' == 'ARM64' ">
<Message Text="Copying ARM64 Binaries..." Importance="High" />
<Copy SourceFiles="@(ARM64Binaries)" DestinationFolder="$(PublishDir)" />
<Message Text="Cleaning up Unsupported Architecture Dependencies..." Importance="High" />
<RemoveDir Directories="$(PublishDir)\runtimes\win-x64" />
<RemoveDir Directories="$(PublishDir)\runtimes\win-x86" />
<RemoveDir Directories="$(PublishDir)\runtimes\win10-x64" />
<RemoveDir Directories="$(PublishDir)\runtimes\win10-x86" />
<RemoveDir Directories="$(LinuxPublishRuntimeDirs)*" />
</Target>
<Target Name="AfterBuildX64" AfterTargets="Build" Condition=" '$(Platform)' == 'x64' ">
<Message Text="Copying X64 Binaries..." Importance="High" />
<Copy SourceFiles="@(X64Binaries)" DestinationFolder="$(OutDir)" />
<Message Text="Cleaning up Unsupported Architecture Dependencies..." Importance="High" />
<RemoveDir Directories="$(OutDir)\runtimes\win-arm64" />
<RemoveDir Directories="$(OutDir)\runtimes\win-x86" />
<RemoveDir Directories="$(OutDir)\runtimes\win10-arm64" />
<RemoveDir Directories="$(OutDir)\runtimes\win10-x86" />
<RemoveDir Directories="$(OutDir)\runtimes\linux**" />
</Target>
<Target Name="AfterPublishX64" AfterTargets="Publish" Condition=" '$(Platform)' == 'x64' ">
<Message Text="Copying X64 Binaries..." Importance="High" />
<Copy SourceFiles="@(X64Binaries)" DestinationFolder="$(PublishDir)" />
<Message Text="Cleaning up Unsupported Architecture Dependencies..." Importance="High" />
<RemoveDir Directories="$(PublishDir)\runtimes\win-arm64" />
<RemoveDir Directories="$(PublishDir)\runtimes\win-x86" />
<RemoveDir Directories="$(PublishDir)\runtimes\win10-arm64" />
<RemoveDir Directories="$(PublishDir)\runtimes\win10-x86" />
<RemoveDir Directories="$(PublishDir)\runtimes\linux**" />
</Target>- Make sure you make to copy dll files when it's new. To make it copy to out directory:
6-1. Select dll files from your Solution Explorer
6-2. Open Properties, Change Copy to Output Directory value to
PreserveNewest
You could refer to gui-example code for example.
var camera = new Camera("192.168.1.100", "admin", "admin", 80, 8554); // Same as var camera = new Camera("192.168.1.100");
var cameraConnection = new CameraConnection(camera);
await cameraConnection.ConnectAsync();Subscribe to the VideoFrameReceived event and update video frame:
cameraConnection.VideoFrameReceived += (sender, frame) =>
{
var png = cameraConnection.GetVideoImageAsPng();
// Draw png image (or use cameraConnection.GetVideoImage)
};Subscribe to the BeamformingMessageReceived event and update beamforming frame:
cameraConnection.BeamformingMessageReceived += (sender, beamforming) =>
{
var png = cameraConnection.GetBeamformingImageAsPng(settings);
// Draw png image (or use cameraConnection.GetBeamformingImage)
};Retrieve the video frame as a byte array or PNG:
byte[] image = cameraConnection.GetVideoImage();
byte[] pngImage = cameraConnection.GetVideoImageAsPng();Generate beamforming images using custom settings:
var settings = new BeamformingSettings
{
Threshold = 0.5f,
Range = 1.0f,
Mode = BeamformingMode.FullView,
UseAverage = true,
Average = 3.0f
};
byte[] beamformingImage = cameraConnection.GetBeamformingImage(settings);
byte[] beamformingPng = cameraConnection.GetBeamformingImageAsPng(settings);Disconnect the camera and clean up resources:
cameraConnection.Disconnect();