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>
<ARM64BinariesInclude="win-arm64\**" />
<X64BinariesInclude="win-x64\**" />
</ItemGroup>
<TargetName="AfterBuildARM"AfterTargets="Build"Condition=" '$(Platform)' == 'ARM64' ">
<MessageText="Copying ARM64 Binaries..."Importance="High" />
<CopySourceFiles="@(ARM64Binaries)"DestinationFolder="$(OutDir)" />
<MessageText="Cleaning up Unsupported Architecture Dependencies..."Importance="High" />
<RemoveDirDirectories="$(OutDir)\runtimes\win-x64" />
<RemoveDirDirectories="$(OutDir)\runtimes\win-x86" />
<RemoveDirDirectories="$(OutDir)\runtimes\win10-x64" />
<RemoveDirDirectories="$(OutDir)\runtimes\win10-x86" />
</Target>
<TargetName="AfterPublishARM"AfterTargets="Publish"Condition=" '$(Platform)' == 'ARM64' ">
<MessageText="Copying ARM64 Binaries..."Importance="High" />
<CopySourceFiles="@(ARM64Binaries)"DestinationFolder="$(PublishDir)" />
<MessageText="Cleaning up Unsupported Architecture Dependencies..."Importance="High" />
<RemoveDirDirectories="$(PublishDir)\runtimes\win-x64" />
<RemoveDirDirectories="$(PublishDir)\runtimes\win-x86" />
<RemoveDirDirectories="$(PublishDir)\runtimes\win10-x64" />
<RemoveDirDirectories="$(PublishDir)\runtimes\win10-x86" />
<RemoveDirDirectories="$(LinuxPublishRuntimeDirs)*" />
</Target>
<TargetName="AfterBuildX64"AfterTargets="Build"Condition=" '$(Platform)' == 'x64' ">
<MessageText="Copying X64 Binaries..."Importance="High" />
<CopySourceFiles="@(X64Binaries)"DestinationFolder="$(OutDir)" />
<MessageText="Cleaning up Unsupported Architecture Dependencies..."Importance="High" />
<RemoveDirDirectories="$(OutDir)\runtimes\win-arm64" />
<RemoveDirDirectories="$(OutDir)\runtimes\win-x86" />
<RemoveDirDirectories="$(OutDir)\runtimes\win10-arm64" />
<RemoveDirDirectories="$(OutDir)\runtimes\win10-x86" />
<RemoveDirDirectories="$(OutDir)\runtimes\linux**" />
</Target>
<TargetName="AfterPublishX64"AfterTargets="Publish"Condition=" '$(Platform)' == 'x64' ">
<MessageText="Copying X64 Binaries..."Importance="High" />
<CopySourceFiles="@(X64Binaries)"DestinationFolder="$(PublishDir)" />
<MessageText="Cleaning up Unsupported Architecture Dependencies..."Importance="High" />
<RemoveDirDirectories="$(PublishDir)\runtimes\win-arm64" />
<RemoveDirDirectories="$(PublishDir)\runtimes\win-x86" />
<RemoveDirDirectories="$(PublishDir)\runtimes\win10-arm64" />
<RemoveDirDirectories="$(PublishDir)\runtimes\win10-x86" />
<RemoveDirDirectories="$(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.
varcamera=newCamera("192.168.1.100","admin","admin",80,8554);// Same as var camera = new Camera("192.168.1.100");varcameraConnection=newCameraConnection(camera);awaitcameraConnection.ConnectAsync();Subscribe to the VideoFrameReceived event and update video frame:
cameraConnection.VideoFrameReceived+=(sender,frame)=>{varpng=cameraConnection.GetVideoImageAsPng();// Draw png image (or use cameraConnection.GetVideoImage)};Subscribe to the BeamformingMessageReceived event and update beamforming frame:
cameraConnection.BeamformingMessageReceived+=(sender,beamforming)=>{varpng=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:
varsettings=newBeamformingSettings{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();