Skip to main content

Open Source Cross-Platform Transcoding Service & SDK

Project description

GhostStream

Open-Source Video Transcoding Server

License: MIT Python 3.10+ Platform

GhostStream is a hardware-accelerated video transcoding server with automatic GPU detection, adaptive bitrate streaming, and minimal configuration. It serves as the transcoding backend for GhostHub but can be used standalone.

Quick Start

Pre-built Binaries

Platform Download Run
Windows GhostStream.exe Double-click
Linux GhostStream-Linux chmod +x && ./GhostStream-Linux
macOS GhostStream-macOS chmod +x && ./GhostStream-macOS

Requires FFmpeg. The application will provide installation instructions if FFmpeg is not found.

From Source

git clone https://github.com/BleedingXiko/GhostStream.git
cd GhostStream
python run.py

The launcher creates a virtual environment, installs dependencies, and starts the server.

Docker

# CPU-only
docker run -d -p 8765:8765 ghcr.io/bleedingxiko/ghoststream

# NVIDIA GPU
docker run -d -p 8765:8765 --gpus all ghcr.io/bleedingxiko/ghoststream:nvidia

SDK Installation

pip install ghoststream              # SDK only (lightweight)
pip install ghoststream[server]      # Full server with all dependencies

Usage

Python SDK (recommended):

from ghoststream import GhostStreamClient, TranscodeStatus

client = GhostStreamClient(manual_server="localhost:8765")

# Synchronous (Flask/gevent compatible)
job = client.transcode_sync(source="https://example.com/video.mp4", resolution="720p")
print(f"Stream URL: {job.stream_url}")

# Or async
async with GhostStreamClient(manual_server="localhost:8765") as client:
    job = await client.transcode(source="https://example.com/video.mp4")
    print(f"Stream URL: {job.stream_url}")

curl:

curl -X POST http://localhost:8765/api/transcode/start \
  -H "Content-Type: application/json" \
  -d '{"source": "https://example.com/video.mp4", "mode": "stream"}'

See the examples/ directory for additional usage examples.

Features

  • HLS Streaming - Real-time transcoding with immediate playback
  • Adaptive Bitrate (ABR) - Multiple quality variants for bandwidth adaptation
  • HDR to SDR - Automatic tone mapping for HDR content
  • Codec Support - H.264, H.265/HEVC, VP9, AV1
  • Batch Processing - Queue multiple files with optional two-pass encoding
  • Hardware Acceleration - NVIDIA NVENC, Intel QuickSync, AMD AMF, Apple VideoToolbox
  • Automatic Fallback - Falls back to software encoding if hardware fails
  • Thermal Management - Reduces load when GPU temperature is high

Supported Hardware Encoders

Platform Encoder Detection
NVIDIA NVENC Automatic via nvidia-smi
Intel QuickSync Automatic via VA-API
AMD AMF/VCE Automatic
Apple VideoToolbox Native macOS support
CPU libx264/libx265 Always available

API Reference

Endpoints

Method Endpoint Description
POST /api/transcode/start Start a transcoding job
GET /api/transcode/{id}/status Get job status & progress
POST /api/transcode/{id}/cancel Cancel a job
DELETE /api/transcode/{id} Delete job & cleanup
GET /api/health Health check
GET /api/capabilities Hardware & codec info
WS /ws/progress Real-time progress via WebSocket

Start Transcode Request

{
  "source": "https://example.com/video.mp4",
  "mode": "stream",           // "stream", "abr", or "batch"
  "output": {
    "resolution": "720p",     // "4k", "1080p", "720p", "480p", "original"
    "video_codec": "h264",    // "h264", "h265", "vp9", "av1"
    "audio_codec": "aac",     // "aac", "opus", "copy"
    "hw_accel": "auto"        // "auto", "nvenc", "qsv", "software"
  },
  "start_time": 0             // Seek to position (seconds)
}

Response

{
  "job_id": "abc-123",
  "status": "processing",
  "stream_url": "http://localhost:8765/stream/abc-123/master.m3u8",
  "progress": 0
}

Examples

File Description
demo.py Basic demo with auto-play
demo.html Browser-based demo
minimal.py Minimal Python example
quickstart.py Interactive examples
curl_examples.md HTTP/curl commands
web_player.html Full-featured web player

Configuration

Create ghoststream.yaml to customize (optional):

server:
  host: 0.0.0.0
  port: 8765

transcoding:
  max_concurrent_jobs: 2
  segment_duration: 4
  tone_map_hdr: true
  retry_count: 3

hardware:
  prefer_hw_accel: true
  fallback_to_software: true

GhostHub Integration

GhostStream serves as the transcoding backend for GhostHub.

Architecture

┌─────────────────────────────────┐      ┌─────────────────────────────────┐
│        Raspberry Pi             │      │         Your PC                 │
│  ┌───────────────────────────┐  │      │  ┌───────────────────────────┐  │
│  │       GhostHub            │  │ WiFi │  │      GhostStream          │  │
│  │    (Media Server)         │◄─┼──────┼─►│   (GPU Transcoder)        │  │
│  └───────────────────────────┘  │      │  └───────────────────────────┘  │
└─────────────────────────────────┘      └─────────────────────────────────┘
  • Auto-Discovery: GhostStream advertises via mDNS (_ghoststream._tcp.local)
  • On-Demand: Transcoding occurs only when requested
  • Local Network: No internet connection required

Python SDK

pip install ghoststream
from ghoststream import GhostStreamClient, TranscodeStatus

# Auto-discover on network
client = GhostStreamClient()
client.start_discovery()

# Or connect directly
client = GhostStreamClient(manual_server="192.168.1.100:8765")

# Synchronous API (Flask/gevent compatible)
job = client.transcode_sync(
    source="http://pi:5000/media/video.mkv",
    resolution="1080p"
)
if job.status != TranscodeStatus.ERROR:
    print(job.stream_url)

# Async API
job = await client.transcode(source="http://pi:5000/media/video.mkv")

WebSocket Progress

# Subscribe to job updates
ws.send({"type": "subscribe", "job_ids": ["job-123"]})

# Receive real-time progress
{"type": "progress", "job_id": "job-123", "data": {"progress": 45.2}}
{"type": "status_change", "job_id": "job-123", "data": {"status": "ready"}}

Contributing

Contributions are welcome. See CONTRIBUTING.md for guidelines.

# Development setup
git clone https://github.com/BleedingXiko/GhostStream.git
cd GhostStream
python -m venv venv && source venv/bin/activate  # or venv\Scripts\activate on Windows
pip install -r requirements.txt
python -m ghoststream --log-level DEBUG

License

MIT License - see LICENSE for details.

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

ghoststream-1.1.0.tar.gz (128.0 kB view details)

Uploaded Source

Built Distribution

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

ghoststream-1.1.0-py3-none-any.whl (121.4 kB view details)

Uploaded Python 3

File details

Details for the file ghoststream-1.1.0.tar.gz.

File metadata

  • Download URL: ghoststream-1.1.0.tar.gz
  • Upload date:
  • Size: 128.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.1

File hashes

Hashes for ghoststream-1.1.0.tar.gz
Algorithm Hash digest
SHA256 dc8f956e793ad03ad60070222cb2fbe7ede8f1952554d5df5fa1d336ffe06976
MD5 b9b985066c9218db93d108525407845a
BLAKE2b-256 e2c5c48179143878e6fddfc0374b76877e42de08229c26ecab05c8e681d8a9e9

See more details on using hashes here.

File details

Details for the file ghoststream-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: ghoststream-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 121.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.1

File hashes

Hashes for ghoststream-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 cceaabb1b897ff5a6b856b0e4bbfdd2bf3ebeff8c3e4f77246cd7a68e0073c87
MD5 043194f46b5f76acc9afc7a66611c609
BLAKE2b-256 207c10aff011e13d145a4ef6bd036ecb4096323eb4fa1a7f0d87774fcb9a97f4

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