A ffmpeg/rust based HLS stream generator

Related tags

Video hls-streamer
Overview

hls-streamer

Stream your heart's content with HLS.

Movtivation

I've got a CCTV camera from AliExpress, I know I can use ffmpeg hls demuxer to split up the stream into HLS segments and serve nginx over the files to make an HLS stream.

But then I learned that my camera can only do H265 stream, while HLS supports H265, no mainstream browsers support H265 natively. FFMPEG tries to transcode the video on the fly and it is a very expensive operation, even with hardware support: 400% software vs 100% hardware CPU usage. I've come up with this idea that only when someone accesses the stream should the transcoding start.

Highlight

  • Written in Rust, minimal resource usage: the app itself takes <5K memory to run1.
  • FFMPEG/transcoding only starts first time accessing the stream.
  • FFMPEG/transcoding stops when access stops.
  • Comes with a simple web page: it's ready to view the result!

Installation

Docker

For an onvif compatible camera, we can use its rtsp stream.

$ docker run -d \
  -e FFMPEG_INPUT="-rtsp_transport tcp -i rtsp://NAME:PASSWORD@CAMERA_IP/onvif2"
  ghcr.io/simophin/hls-streamer

Docker compose

Refer to the rest of the documentation for the usage of FFMPEG_INPUT.

docker-compose.yaml

services:  
  webcam:
    image: ghcr.io/simophin/hls-streamer:latest
    restart: always
    ports:
      - 8989:8989
    devices:
      # Device mapping only needed for hardware acceleration 
      - /dev/dri/renderD128:/dev/dri/renderD128
    volumes:
      # Optional. Use a tmpfs for data storage to reduce writes to your disks.
      - hls-data:/data
    environment:
      - FFMPEG_INPUT=-vaapi_device /dev/dri/renderD128 -rtsp_transport tcp -i rtsp://USER:PASS@CAMERA_IP/onvif2 -vf format=nv12,hwupload -b:v 2M -c:v h264_vaapi

volumes:
  hls-data:
    driver: local
    driver_opts:
      type: tmpfs
      device: tmpfs
      o: size=200m

Build from source

You'll need to set up Rust toolchain first, see rustup

Clone the source and build

$ cargo build --release

Once built, you can run via:

$ FFMPEG_INPUT=xxx ./target/release/hls-streamer

You'll also need to have ffmpeg>4.0 installed to use the app.

Only Linux system is tested at this time.

Configuration

Environment varaiables

Name Default value Description
FFMPEG_INPUT FFMPEG input parameters. e.g. -rtsp_transport tcp -i rtsp://NAME:PASSWORD@CAMERA_IP/onvif2. See below for examples.
HLS_DIR /data HLS data storage directory. It's recommended to use a memory based system like tmpfs to avoid frequent write to disks.
LISTEN_ADDRESS 0.0.0.0 Http server listening address
LISTEN_PORT 8989 Http server listening port
TIMEOUT_SECONDS 120 The waiting time before a stream is considered idle.

Usage

Once you have the app running, by default, you will have these two links:

http://localhost:8989 -> a simple webpage showing the HLS stream

http://localhost:8989/master.m3u8 -> the HLS playlist itself

The playlist file request will be withheld until the playlist file is generated. This is to avoid the first time you access the playlist because ffmpeg is not ready and you'd have got a 404 for that file.

Screenshots

Screen Shot 2022-01-08 at 4 16 38 PM

Input examples

These examples demostrate what you can put into FFMPEG_INPUT environment variable.

Copying the camera stream (i.e. no transcoding)

-rtsp_transport tcp -i rtsp://NAME:PASSWORD@CAMERA_IP/onvif2 -vf copy

Hardware H264 encoding (VAAPI)

-vaapi_device /dev/dri/renderD128 -rtsp_transport tcp -i rtsp://NAME:PASSWORD@CAMERA_IP/onvif2 -vf format=nv12,hwupload -b:v 2M -c:v h264_vaapi

Footnotes

  1. The measurement was indicative only. FFMPEG process is excluded.

You might also like...
Pure-rust implementation of legacy H.263 video codec and associated color transforms

website | demo | nightly builds | wiki h263-rs h263-rs is a pure-Rust implementation of ITU-T Recommendation H.263 (2005/08), a video codec commonly u

A not well-named youtube's videos downloader written in Rust 🦀

ytdl-rs A not well-named youtube's videos downloader written in Rust 🦀 For information about how to use, legal section, next steps in the project, co

Yet another video to ASCII animation (in Rust)
Yet another video to ASCII animation (in Rust)

Yet another video to ASCII tool (in Rust) Requirements opencv Installation cargo install video2ascii You may also want to add

This is a lightweight audio-video player built in Rust using FFmpeg libraries. It demonstrates the usage of FFmpeg with Rust to play back video files.

FFmpeg Rust Video Player This is a lightweight audio-video player built in Rust using FFmpeg libraries. It demonstrates the usage of FFmpeg with Rust

A fork of the abandoned ffmpeg-next crate which is a fork of the abandoned ffmpeg crate

This is a fork of the abandoned ffmpeg-next crate which is a fork of the abandoned ffmpeg crate. Currently supported FFmpeg versions: 4.x, 5.x. Build

Xiu - A simple and secure live media server in pure Rust (RTMP/HTTP-FLV/HLS/Relay).🦀
Xiu - A simple and secure live media server in pure Rust (RTMP/HTTP-FLV/HLS/Relay).🦀

Xiu is a simple and secure live media server written by pure Rust, it now supports popular live protocols like RTMP/HLS/HTTP-FLV (and maybe other protocols in the future), you can deploy it as a stand-alone server or a cluster using the relay feature.

decode a byte stream of varint length-encoded messages into a stream of chunks

length-prefixed-stream decode a byte stream of varint length-encoded messages into a stream of chunks This crate is similar to and compatible with the

GBS/LSDj visualizer based on SameBoy and FFmpeg
GBS/LSDj visualizer based on SameBoy and FFmpeg

GBPresenter GBPresenter is a tool I wrote to generate visualizations of GameBoy chiptunes, based on SameBoy, FFmpeg, and Slint. The visualization desi

ffmpeg libraries precompiled for WebAsembly/WASI, as a Rust crate.

FFMPEG crate for WebAssembly/WASI This crate bundles FFMPEG's libraries, precompiled for WebAssembly. No native installation required. Compatible with

rsmpeg is a thin&safe layer above the FFmpeg's Rust bindings
rsmpeg is a thin&safe layer above the FFmpeg's Rust bindings

A Rust crate that exposes FFmpeg's power as much as possible.

Rust port of ffmpeg's native AAC encoder

raash 🪇 An attempt at RIIR-ing the native AAC encoder from ffmpeg. First, I used c2rust to translate all relevant C code into Rust, and I'm in the pr

📼 Wrapper around ffmpeg which simplifies merging of multiple videos
📼 Wrapper around ffmpeg which simplifies merging of multiple videos

Vidmerger A wrapper around ffmpeg which simplifies merging of multiple videos. 🙉 What is this exactly? Vidmerger is a command-line-tool which uses ff

AV1 encoding tool with fast VMAF sampling. Uses svt-av1, ffmpeg & vmaf
AV1 encoding tool with fast VMAF sampling. Uses svt-av1, ffmpeg & vmaf

ab-av1 AV1 encoding tool with fast VMAF sampling. Uses svt-av1, ffmpeg & vmaf. Command: auto-encode Automatically determine the best crf to deliver th

Wrap a standalone FFmpeg binary in an intuitive Iterator interface. 🏍

FFmpeg Sidecar 🏍 Wrap a standalone FFmpeg binary in an intuitive Iterator interface. Motivation The core goal of this project is to provide a method

Sūshì is a simple but customizable static site generator / blog generator written in Rust

sūshì Sūshì is a simple but customizable static site generator / blog generator written in Rust. Installation Install with Cargo (Recommended) cargo i

Lightweight stream-based WebSocket implementation for Rust.

Tungstenite Lightweight stream-based WebSocket implementation for Rust. use std::net::TcpListener; use std::thread::spawn; use tungstenite::server::ac

PostQuet: Stream PostgreSQL tables/queries to Parquet files seamlessly with this high-performance, Rust-based command-line tool.

STATUS: IN DEVELOPMENT PostQuet: Streaming PostgreSQL to Parquet Exporter PostQuet is a powerful and efficient command-line tool written in Rust that

Stream-based FSEvents API bindings.

fsevent-stream Stream-based FSEvents API bindings. Features Support directory-granular and file-granular events. Retrieve related file inode with kFSE

Stream-based visual programming language for systems observability
Stream-based visual programming language for systems observability

Stream-based visual programming language for systems observability. Metalens allows to build observability programs in a reactive and visual way. On L

Comments
  • Bump anyhow from 1.0.66 to 1.0.68

    Bump anyhow from 1.0.66 to 1.0.68

    Bumps anyhow from 1.0.66 to 1.0.68.

    Release notes

    Sourced from anyhow's releases.

    1.0.67

    • Improve the backtrace captured when context() is used on an Option (#280)
    Commits
    • 867763b Release 1.0.68
    • c0a87d0 Opt out -Zrustdoc-scrape-examples on docs.rs
    • 1cc707b Release 1.0.67
    • 613b261 Update build status badge
    • 0f922d7 Disable backtrace CI on Rust 1.50
    • acecd9b Update ui test suite to nightly-2022-12-15
    • 0bac51f Time out workflows after 45 minutes
    • 60e8800 Fix renamed let_underscore_drop lint
    • 8d1c734 Update ui test suite to nightly-2022-11-16
    • 451651b Update ui test suite to nightly-2022-11-11
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump async-std from 1.10.0 to 1.12.0

    Bump async-std from 1.10.0 to 1.12.0

    Bumps async-std from 1.10.0 to 1.12.0.

    Release notes

    Sourced from async-std's releases.

    v1.12.0

    This release stabilizes some long-awaited APIs that help people build async interfaces and interoperate with other APIs.

    Added

    • task::spawn_blocking is now stabilized. We consider it a fundamental API for bridging between blocking code and async code, and we widely use it within async-std's own implementation.
    • Add TryFrom implementations to convert TcpListener, TcpStream, UdpSocket, UnixDatagram, UnixListener, and UnixStream to their synchronous equivalents, including putting them back into blocking mode.

    Changed

    • async-std no longer depends on num_cpus; it uses functionality in the standard library instead (via async-global-executor).
    • Miscellaneous documentation fixes and cleanups.

    v1.11.0

    This release improves compile times by up to 55% on initial builds, and up to 75% on recompilation. Additionally we've added a few new APIs and made some tweaks.

    Added

    • TcpListener::into_incoming to convert a TcpListener into a stream of incoming TCP connections

    Removed

    • The internal extension_trait macro had been removed. This drastically improves compile times for async-std, but changes the way our documentation is rendered. This is a cosmetic change only, and all existing code should continue to work as it did be fore.

    Changed

    • Some internal code has been de-macro-ified, making for quicker compile times.
    • We now use the default recursion limit.

    Docs

    • Several docs improvements / fixes.
    Changelog

    Sourced from async-std's changelog.

    [1.12.0] - 2022-06-18

    Added

    • std::task::spawn_blocking is now stabilized. We consider it a fundamental API for bridging between blocking code and async code, and we widely use it within async-std's own implementation.
    • Add TryFrom implementations to convert TcpListener, TcpStream, UdpSocket, UnixDatagram, UnixListener, and UnixStream to their synchronous equivalents, including putting them back into blocking mode.

    Changed

    • async-std no longer depends on num_cpus; it uses functionality in the standard library instead (via async-global-executor).
    • Miscellaneous documentation fixes and cleanups.

    [1.11.0] - 2022-03-22

    This release improves compile times by up to 55% on initial builds, and up to 75% on recompilation. Additionally we've added a few new APIs and made some tweaks.

    Added

    • TcpListener::into_incoming to convert a TcpListener into a stream of incoming TCP connections

    Removed

    • The internal extension_trait macro had been removed. This drastically improves compile times for async-std, but changes the way our documentation is rendered. This is a cosmetic change only, and all existing code should continue to work as it did before.

    Changed

    • Some internal code has been de-macro-ified, making for quicker compile times.
    • We now use the default recursion limit.

    Docs

    • Several docs improvements / fixes.
    Commits
    • 1130279 Merge pull request #1027 from joshtriplett/twelve
    • 6856d50 Cargo.toml: Bump version to 1.12.0
    • df53df2 CHANGELOG.md: Changelog for 1.12.0
    • 27ed889 CHANGELOG.md: Fix typo
    • 2aa8a43 Merge pull request #1026 from joshtriplett/remove-old-test-script
    • 16b2796 Merge pull request #1025 from joshtriplett/unbors
    • 4534db5 Merge pull request #1024 from joshtriplett/remove-pre-std-future-docs
    • e287d62 Merge pull request #1022 from joshtriplett/rustfmt-stable
    • ca83050 Switch branch name to main
    • 422c3dd Remove wasm-test.sh (not invoked in CI)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump anyhow from 1.0.52 to 1.0.66

    Bump anyhow from 1.0.52 to 1.0.66

    Bumps anyhow from 1.0.52 to 1.0.66.

    Release notes

    Sourced from anyhow's releases.

    1.0.66

    • Reduce unhelpful backtrace frames in backtraces captured during a context call (#279)

    1.0.65

    • impl Provider for anyhow::Error

    1.0.64

    • Correctly propagate Backtrace when using #[source] anyhow::Error with thiserror crate (#231)

    1.0.63

    1.0.62

    • Fix extra rebuilding when interleaving command-line cargo invocations with IDE builds (#261)

    1.0.61

    • Work around rust-analyzer builds poisoning all subsequent command-line cargo builds (#252)

    1.0.60

    • Propagate --target to rustc invocation when deciding about backtrace support (#249, thanks @​RalfJung)

    1.0.59

    • Update crates.io metadata to include no-std category

    1.0.58

    • Fix some broken links in documentation

    1.0.57

    • Remove a log4rs-specific workaround from bail! macro implementation

    1.0.56

    • Add must_use warning when an Error created by anyhow! is not used, perhaps because the programmer meant to write bail! instead (#229)

    1.0.55

    • Documentation improvements

    1.0.54

    • Construct more helpful error message from ensure! when the expression involves a negative literal const generic as the first generic argument of a method call (#224)

    1.0.53

    Commits
    • 8de29aa Release 1.0.66
    • 54fc812 Merge pull request #279 from dtolnay/contextbacktrace
    • 131249b Remove 2 frames of noise from 'context' backtraces
    • f2123ab Ui test changes for trybuild 1.0.66
    • 9bd74a1 Restore pre-nightly-2022-10-05 behavior of test_path PhantomData tests
    • 77c4fa4 Update test suite to nightly-2022-10-05
    • 7b171d6 Ignore bool_to_int_with_if clippy lint in test suite
    • 94ae34b Raise minimum tested toolchain to rust 1.56
    • 94f6f4d Remove default package.readme metadata from Cargo.toml
    • 4de2068 Release 1.0.65
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump futures from 0.3.19 to 0.3.25

    Bump futures from 0.3.19 to 0.3.25

    Bumps futures from 0.3.19 to 0.3.25.

    Release notes

    Sourced from futures's releases.

    0.3.25

    • Fix soundness issue in join! and try_join! macros (#2649)
    • Implement Clone for sink::Drain (#2650)

    0.3.24

    • Fix incorrect termination of select_with_strategy streams (#2635)

    0.3.23

    • Work around MSRV increase due to a cargo bug.

    0.3.22

    • Fix Sync impl of BiLockGuard (#2570)
    • Fix partial iteration in FuturesUnordered (#2574)
    • Fix false detection of inner panics in Shared (#2576)
    • Add Mutex::lock_owned and Mutex::try_lock_owned (#2571)
    • Add io::copy_buf_abortable (#2507)
    • Remove Unpin bound from TryStreamExt::into_async_read (#2599)
    • Make run_until_stalled handle self-waking futures (#2593)
    • Use FuturesOrdered in try_join_all (#2556)
    • Fix orderings in LocalPool waker (#2608)
    • Fix stream::Chunk adapters size hints (#2611)
    • Add push_front and push_back to FuturesOrdered (#2591)
    • Deprecate FuturesOrdered::push in favor of FuturesOrdered::push_back (#2591)
    • Performance improvements (#2583, #2626)
    • Documentation improvements (#2579, #2604, #2613)

    0.3.21

    • Fix potential data race in FlattenUnordered that introduced in 0.3.20 (#2566)

    0.3.20

    • Fix stacked borrows violations when -Zmiri-tag-raw-pointers is enabled. This raises MSRV of futures-task to 1.45. (#2548, #2550)
    • Change FuturesUnordered to respect yielding from future (#2551)
    • Add StreamExt::{flatten_unordered, flat_map_unordered} (#2083)
    Changelog

    Sourced from futures's changelog.

    0.3.25 - 2022-10-20

    • Fix soundness issue in join! and try_join! macros (#2649)
    • Implement Clone for sink::Drain (#2650)

    0.3.24 - 2022-08-29

    • Fix incorrect termination of select_with_strategy streams (#2635)

    0.3.23 - 2022-08-14

    • Work around MSRV increase due to a cargo bug.

    0.3.22 - 2022-08-14

    • Fix Sync impl of BiLockGuard (#2570)
    • Fix partial iteration in FuturesUnordered (#2574)
    • Fix false detection of inner panics in Shared (#2576)
    • Add Mutex::lock_owned and Mutex::try_lock_owned (#2571)
    • Add io::copy_buf_abortable (#2507)
    • Remove Unpin bound from TryStreamExt::into_async_read (#2599)
    • Make run_until_stalled handle self-waking futures (#2593)
    • Use FuturesOrdered in try_join_all (#2556)
    • Fix orderings in LocalPool waker (#2608)
    • Fix stream::Chunk adapters size hints (#2611)
    • Add push_front and push_back to FuturesOrdered (#2591)
    • Deprecate FuturesOrdered::push in favor of FuturesOrdered::push_back (#2591)
    • Performance improvements (#2583, #2626)
    • Documentation improvements (#2579, #2604, #2613)

    0.3.21 - 2022-02-06

    • Fix potential data race in FlattenUnordered that introduced in 0.3.20 (#2566)

    0.3.20 - 2022-02-06

    NOTE: This release has been yanked due to a bug fixed in 0.3.21.

    • Fix stacked borrows violations when -Zmiri-tag-raw-pointers is enabled. This raises MSRV of futures-task to 1.45. (#2548, #2550)
    • Change FuturesUnordered to respect yielding from future (#2551)
    • Add StreamExt::{flatten_unordered, flat_map_unordered} (#2083)
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
Owner
I like fast things: fast internet, fast apps, fast learning...
null
Xiu - A simple and secure live media server in pure Rust (RTMP/HTTP-FLV/HLS/Relay).🦀

Xiu is a simple and secure live media server written by pure Rust, it now supports popular live protocols like RTMP/HLS/HTTP-FLV (and maybe other protocols in the future), you can deploy it as a stand-alone server or a cluster using the relay feature.

HarlanC 602 Jan 2, 2023
ffmpeg libraries precompiled for WebAsembly/WASI, as a Rust crate.

FFMPEG crate for WebAssembly/WASI This crate bundles FFMPEG's libraries, precompiled for WebAssembly. No native installation required. Compatible with

Frank Denis 45 Dec 14, 2022
rsmpeg is a thin&safe layer above the FFmpeg's Rust bindings

A Rust crate that exposes FFmpeg's power as much as possible.

Lark Technologies Pte. Ltd. 384 Jan 2, 2023
📼 Wrapper around ffmpeg which simplifies merging of multiple videos

Vidmerger A wrapper around ffmpeg which simplifies merging of multiple videos. ?? What is this exactly? Vidmerger is a command-line-tool which uses ff

Thomas Gotwig 51 Dec 16, 2022
AV1 encoding tool with fast VMAF sampling. Uses svt-av1, ffmpeg & vmaf

ab-av1 AV1 encoding tool with fast VMAF sampling. Uses svt-av1, ffmpeg & vmaf. Command: auto-encode Automatically determine the best crf to deliver th

Alex Butler 92 Jan 1, 2023
Wrap a standalone FFmpeg binary in an intuitive Iterator interface. 🏍

FFmpeg Sidecar ?? Wrap a standalone FFmpeg binary in an intuitive Iterator interface. Motivation The core goal of this project is to provide a method

Nathan Babcock 26 Feb 22, 2023
Rust-based video player for astrophotography

Astro Video Player Rust-based video player for astrophotography videos in SER and AVI format. Supports debayering of RAW color images. Status: Works w

Andy Grove 6 May 7, 2022
Media Cleaner is a simple CLI tool to clean up your media library based on your Overseerr requests and Tautulli history, written in Rust.

Media Cleaner Media Cleaner is a simple CLI tool to clean up your media library based on your Overseerr requests and Tautulli history, written in Rust

Felix Bjerhem Aronsson 21 Mar 22, 2023
Rust high level RTSP client

RRTSP Client Currently works, but a lot of work to do. PRs welcome! Examples, crates.io, better Readme.md and other things coming soon.

Lucas Zanela 13 Dec 26, 2022
High-level RTSP multimedia streaming library, in Rust

High-level RTSP multimedia streaming library, in Rust. Good support for ONVIF RTSP/1.0 IP surveillance cameras, as needed by Moonfire NVR. Works around brokenness in cheap closed-source cameras.

Scott Lamb 108 Jan 8, 2023