Skip to main content

HTTP service that provides on demand video streams from NTNDArrays served over EPICS PVA

Project description

CI Coverage PyPI License

pva_to_video

HTTP service that converts EPICS PVA NTNDArray streams into MJPEG video streams consumable by any web browser.

What Where
Source https://github.com/DiamondLightSource/pva-to-video
PyPI pip install pva-to-video
Docker docker run ghcr.io/diamondlightsource/pva-to-video:latest
Releases https://github.com/DiamondLightSource/pva-to-video/releases

Overview

EPICS areaDetector cameras publish images as NTNDArray structures over PVA. Desktop tools like Phoebus can display these streams directly, but web applications cannot speak PVA. pva-to-video bridges the gap by subscribing to a PVA channel on demand and re-encoding the pixel data as an MJPEG stream served over HTTP — a format every browser understands natively via an <img> tag.

How it works

  1. A client requests GET /mjpg/<PV_NAME>.
  2. The service opens a PVA monitor on PV_NAME (if one is not already open).
  3. Each incoming NTNDArray is normalised to uint8 and JPEG-encoded.
  4. Frames are pushed to all connected clients as a multipart/x-mixed-replace MJPEG stream, capped at 30 fps per client.
  5. When the last client disconnects the subscription is kept alive for 60 s to avoid churn, then torn down automatically.

Supported pixel formats: uint8/16/32/64, int8/16/32/64, and float32/64. Greyscale (2-D) and colour (H×W×3 RGB) arrays are both handled.

Usage

Embedding in a web page

Point an <img> tag at the service:

<img src="https://my-server:8080/mjpg/BL01T-DI-CAM-01:PVA:OUTPUT" />

A built-in viewer page is available at GET / for quick manual testing.

Running with pip

pip install pva-to-video
pva-to-video                        # listen on 0.0.0.0:8080
pva-to-video --port 9000            # custom port
pva-to-video --log-level debug      # verbose logging

If cameras are on a different subnet, set the PVA name server:

EPICS_PVA_NAME_SERVERS=192.168.1.50 pva-to-video

Running with Docker

docker run --rm -p 8080:8080 ghcr.io/diamondlightsource/pva-to-video:latest

To reach IOCs on the host network:

docker run --rm --network host ghcr.io/diamondlightsource/pva-to-video:latest

With a remote PVA gateway:

docker run --rm -p 8080:8080 \
  -e EPICS_PVA_NAME_SERVERS=192.168.1.50 \
  ghcr.io/diamondlightsource/pva-to-video:latest

CLI options

Flag Default Description
--host 0.0.0.0 Bind address
--port 8080 Bind port
--log-level info debug, info, warning, or error

Trying it with example-services

The epics-containers/example-services repository provides a simulated areaDetector camera (bl01t-di-cam-01) and a PVA gateway (pvagw) that bridges the camera stream to 127.0.0.1:9075.

Follow the epics-containers workstation setup tutorial to install Docker or Podman and clone example-services, then follow the launch a simulation beamline tutorial to start the simulation IOC.

Once the services are running, start pva-to-video:

EPICS_PVA_NAME_SERVERS=127.0.0.1:9075 pva-to-video

Open http://localhost:8080 in a browser, enter the PV name BL01T-DI-CAM-01:PVA:OUTPUT, and click View to see the live 1024 × 1024 simulated detector image. You can also point an <img> tag directly at the stream:

http://localhost:8080/mjpg/BL01T-DI-CAM-01:PVA:OUTPUT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pva_to_video-0.0.2.tar.gz (128.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pva_to_video-0.0.2-py3-none-any.whl (17.7 kB view details)

Uploaded Python 3

File details

Details for the file pva_to_video-0.0.2.tar.gz.

File metadata

  • Download URL: pva_to_video-0.0.2.tar.gz
  • Upload date:
  • Size: 128.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pva_to_video-0.0.2.tar.gz
Algorithm Hash digest
SHA256 30bfb2274dbec8d763bb2810d67061f5b6adf5074d6bd8b362f338d072f4e9e2
MD5 30ebc9ad7393593e634aa5c43b2e6245
BLAKE2b-256 ae5baf439ff08387df0f83b831289f53a9c3ea34464d687bc6a1ba24c6e32425

See more details on using hashes here.

File details

Details for the file pva_to_video-0.0.2-py3-none-any.whl.

File metadata

  • Download URL: pva_to_video-0.0.2-py3-none-any.whl
  • Upload date:
  • Size: 17.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pva_to_video-0.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 01c0d33f68e0ba1bae2dab41c961e79df939f9f9bb2d18c62d5f80881c2fd869
MD5 01cfc272d25fc552176b6a955e576f05
BLAKE2b-256 e51bf976320bc2966ed6863fb5ae5c8b73d0f0f2ed2d89456d871d798e4263c2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page