Skip to content

Repository files navigation

FX API (C#)

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.


Features

  • 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.

Installation

  1. Clone the repository or download the source code.
  2. Add the project to your solution or include the library in your project.
  3. Ensure all required dependencies are referenced as a nuget package:
    • FFmpeg.AutoGen
    • OpenCvSharp
    • Google.Protobuf
    • Websocket.Client
  4. Move dll files from gui-example\win-x64 or gui-example\win-arm64 to your project. Folder structure should be same with origin, such as {YOUR_PROJECT}\win-64 or {YOUR_PROJECT}\win-arm64
  5. 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>
  1. 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

Usage

You could refer to gui-example code for example.

Initialize Camera Connection

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();

Receive Video Frames

Subscribe to the VideoFrameReceived event and update video frame:

cameraConnection.VideoFrameReceived+=(sender,frame)=>{varpng=cameraConnection.GetVideoImageAsPng();// Draw png image (or use cameraConnection.GetVideoImage)};

Retrieve Beamforming Data

Subscribe to the BeamformingMessageReceived event and update beamforming frame:

cameraConnection.BeamformingMessageReceived+=(sender,beamforming)=>{varpng=cameraConnection.GetBeamformingImageAsPng(settings);// Draw png image (or use cameraConnection.GetBeamformingImage)};

Process Video Image

Retrieve the video frame as a byte array or PNG:

byte[]image=cameraConnection.GetVideoImage();byte[]pngImage=cameraConnection.GetVideoImageAsPng();

Process Beamforming Data

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 Camera

Disconnect the camera and clean up resources:

cameraConnection.Disconnect();

Dependencies


About

FX Viewer Core API

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages