Files
vizionStreamer/README.md
2025-12-19 07:46:29 +01:00

7.9 KiB

VizionStreamer

High-performance video streaming application for Technexion cameras with GStreamer integration and Unix Domain Socket control interface.

Depends on: https://github.com/TechNexion-Vision/vizionsdk

Features

  • Continuous Frame Acquisition: Dedicated thread for frame capture from VizionSDK
  • GStreamer Integration: Flexible video processing and output
  • Socket Control API: Runtime configuration via JSON commands over Unix Domain Socket
  • Camera Parameter Control: Exposure, white balance, brightness, contrast, etc.
  • Multiple Output Options: Display, UDP/TCP streaming, file recording, RTSP, MJPEG
  • Performance Monitoring: Real-time FPS statistics
  • Thread-Safe: Mutex-protected operations

Quick Start

Build

cmake -B build -S .
cmake --build build

Run

# Start VizionStreamer
./build/vizionStreamer

Start Streaming (Default Pipeline)

In another terminal:

# Start streaming with default pipeline (local display)
./scripts/start_stream.sh

# Stop streaming
./scripts/stop_stream.sh

That's it! The default pipeline videoconvert ! autovideosink is already configured.

Architecture

┌─────────────────┐
│  VizionSDK      │
│  Camera         │
└────────┬────────┘
         │ VxGetImage()
         ▼
┌─────────────────┐
│  Acquisition    │
│  Loop Thread    │  (StreamingEngine)
└────────┬────────┘
         │ Push frames
         ▼
┌─────────────────┐
│  GStreamer      │
│  Pipeline       │  (appsrc → processing → output)
└────────┬────────┘
         │
         ▼
    Display/Stream/File

┌─────────────────┐
│  Socket Server  │  ← JSON commands
│  (Control API)  │
└─────────────────┘

Control Scripts

Located in scripts/ directory:

Script Description
start_stream.sh Start streaming (use default or configured pipeline)
stop_stream.sh Stop streaming
get_status.sh Show streaming status and current pipeline
get_formats.sh List available camera formats
set_pipeline_display.sh Set pipeline for local display
set_pipeline_udp.sh [host] [port] Set pipeline for UDP streaming
set_pipeline_file.sh [path] Set pipeline for file recording
set_pipeline_mjpeg.sh [port] Set pipeline for MJPEG HTTP streaming

See scripts/README.md for detailed usage.

Common Use Cases

Local Display

./build/vizionStreamer
# In another terminal:
./scripts/start_stream.sh

UDP Streaming to Remote Host

./build/vizionStreamer
# In another terminal:
./scripts/set_pipeline_udp.sh 192.168.1.100 5000
./scripts/start_stream.sh

# On receiving machine:
gst-launch-1.0 udpsrc port=5000 ! application/x-rtp,encoding-name=H264 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! autovideosink

Record to File

./build/vizionStreamer
# In another terminal:
./scripts/set_pipeline_file.sh /tmp/recording.mp4
./scripts/start_stream.sh
# Let it run, then:
./scripts/stop_stream.sh

MJPEG HTTP Streaming

./build/vizionStreamer
# In another terminal:
./scripts/set_pipeline_mjpeg.sh 8080
./scripts/start_stream.sh

# View in browser:
firefox http://localhost:8080

Socket Control API

Full API documentation: SOCKET_API.md

Socket Path: /tmp/vizion_control.sock

Available Commands

  • get_formats - List camera formats
  • set_format - Change resolution/framerate/format
  • start_stream - Start streaming
  • stop_stream - Stop streaming
  • get_status - Get streaming status
  • set_pipeline - Configure GStreamer pipeline
  • set_exposure - Configure exposure
  • set_whitebalance - Configure white balance
  • set_brightness - Adjust brightness
  • set_contrast - Adjust contrast
  • set_saturation - Adjust saturation
  • set_sharpness - Adjust sharpness
  • set_gamma - Adjust gamma
  • set_gain - Adjust gain

Example

# Manual command
echo '{"command":"start_stream"}' | socat - UNIX-CONNECT:/tmp/vizion_control.sock

# Set custom pipeline
echo '{"command":"set_pipeline","params":{"pipeline":"videoconvert ! x264enc ! rtph264pay ! udpsink host=192.168.1.100 port=5000"}}' | socat - UNIX-CONNECT:/tmp/vizion_control.sock

# Get status
echo '{"command":"get_status"}' | socat - UNIX-CONNECT:/tmp/vizion_control.sock

GStreamer Pipeline Examples

Display

videoconvert ! autovideosink

UDP H.264 Streaming

videoconvert ! x264enc tune=zerolatency bitrate=2000 ! rtph264pay ! udpsink host=192.168.1.100 port=5000

File Recording

videoconvert ! x264enc ! mp4mux ! filesink location=/tmp/output.mp4

TCP Streaming

videoconvert ! x264enc ! h264parse ! mpegtsmux ! tcpserversink host=0.0.0.0 port=5000

MJPEG HTTP

videoconvert ! jpegenc ! multipartmux ! tcpserversink host=0.0.0.0 port=8080

Tee (Display + Record)

tee name=t ! queue ! videoconvert ! autovideosink t. ! queue ! x264enc ! mp4mux ! filesink location=out.mp4

Dependencies

  • VizionSDK: Camera interface (located at /opt/vizionsdk)
  • GStreamer 1.0: Video processing (gstreamer-1.0, gstreamer-app-1.0)
  • CMake: Build system (>= 3.20)
  • C++23: Compiler support
  • socat: For socket communication (control scripts)

Install Dependencies (Debian/Ubuntu)

sudo apt install build-essential cmake pkg-config socat \
    libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
    gstreamer1.0-plugins-good gstreamer1.0-plugins-bad \
    gstreamer1.0-plugins-ugly gstreamer1.0-x

Project Structure

vizionStreamer/
├── main.cpp                    # Main application
├── SocketServer.{h,cpp}        # Unix domain socket server
├── CameraController.{h,cpp}    # Command processing & camera control
├── StreamingEngine.{h,cpp}     # Acquisition loop & streaming
├── GStreamerPipeline.{h,cpp}   # GStreamer pipeline wrapper
├── CMakeLists.txt              # Build configuration
├── config/
│   └── VxConfig.conf           # VizionSDK configuration
├── scripts/                    # Control scripts
│   ├── README.md
│   ├── start_stream.sh
│   ├── stop_stream.sh
│   ├── get_status.sh
│   ├── set_pipeline_*.sh
│   └── get_formats.sh
├── SOCKET_API.md               # Complete API documentation
└── README.md                   # This file

Configuration Files

VxConfig.conf

Automatically copied to build directory during build. Contains VizionSDK camera configuration.

Performance

The acquisition loop displays statistics every second:

FPS: 30 | Total frames: 1234 | Frame size: 4147200 bytes

Typical performance:

  • Local Display: 30 FPS @ 1080p
  • UDP Streaming: 30 FPS @ 1080p with H.264 encoding
  • File Recording: Limited by disk I/O

Troubleshooting

No cameras found

  • Check camera connection
  • Run /opt/vizionsdk/init_driver.sh if needed
  • Check dmesg for USB errors

Pipeline fails to start

  • Verify GStreamer plugins are installed
  • Test pipeline manually: gst-launch-1.0 videotestsrc ! YOUR_PIPELINE
  • Check pipeline syntax

Socket connection refused

  • Ensure VizionStreamer is running
  • Check socket exists: ls -l /tmp/vizion_control.sock
  • Verify permissions

Low FPS

  • Reduce resolution or framerate
  • Use hardware encoding if available (vaapih264enc instead of x264enc)
  • Check CPU usage

License

See VizionSDK license terms.

Support

For issues and questions, refer to: