From 04d7fd3520ffe139e1106ecee97c9d97d164638b Mon Sep 17 00:00:00 2001 From: Fredrik Baberg Date: Wed, 15 Mar 2023 03:36:50 +0100 Subject: [PATCH] Add initial files for ustreamer --- camera-ustreamer/DOCS.md | 36 +++++++ camera-ustreamer/Dockerfile | 92 ++++++++++++++++ camera-ustreamer/README.md | 5 + camera-ustreamer/config.yaml | 28 +++++ camera-ustreamer/rootfs/etc/caddy/Caddyfile | 4 + .../rootfs/etc/services.d/proxy/finish | 9 ++ .../rootfs/etc/services.d/proxy/run | 11 ++ .../rootfs/etc/services.d/ustreamer/finish | 9 ++ .../rootfs/etc/services.d/ustreamer/run | 9 ++ .../etc/janus/janus.plugin.ustreamer.jcfg | 3 + camera-ustreamer/rootfs/server/index.html | 100 ++++++++++++++++++ 11 files changed, 306 insertions(+) create mode 100644 camera-ustreamer/DOCS.md create mode 100644 camera-ustreamer/Dockerfile create mode 100644 camera-ustreamer/README.md create mode 100644 camera-ustreamer/config.yaml create mode 100644 camera-ustreamer/rootfs/etc/caddy/Caddyfile create mode 100644 camera-ustreamer/rootfs/etc/services.d/proxy/finish create mode 100644 camera-ustreamer/rootfs/etc/services.d/proxy/run create mode 100644 camera-ustreamer/rootfs/etc/services.d/ustreamer/finish create mode 100644 camera-ustreamer/rootfs/etc/services.d/ustreamer/run create mode 100644 camera-ustreamer/rootfs/opt/janus/etc/janus/janus.plugin.ustreamer.jcfg create mode 100644 camera-ustreamer/rootfs/server/index.html diff --git a/camera-ustreamer/DOCS.md b/camera-ustreamer/DOCS.md new file mode 100644 index 0000000..c45cb93 --- /dev/null +++ b/camera-ustreamer/DOCS.md @@ -0,0 +1,36 @@ +# Documentation + +## Configuration + +- `mjpg_input`: Specify input arguments for mjpg_streamer. + +## How to use + +Set input arguments through `mjpg_input` configuration option, start the add-on. + +## Accessing camera from Home Assistant + +The camera stream and snapshot can be accessed by e.g. [MJPEG IP Camera](https://www.home-assistant.io/integrations/mjpeg/), with URLs: +* MJPEG URL: `http:///?action=stream` +* Still image URL: `http:///?action=snapshot`. + +Addon hostname can be found under [addon settings](https://my.home-assistant.io/redirect/supervisor_addon/?addon=b7aa59c4_camera-mjpg-streamer&repository_url=https%3A%2F%2Fgithub.com%2Ffredrikbaberg%2Fha-3dprinter-addons). + +## Ingress? + +Ingress support is included only to verify that the camera can be accessed. Streaming will most likely only work in the "JavaScript" tab. + +## Testing + +For testing you can set `mjpg_input` to: +> input_file.so -f /www_mjpg -e + +This will result in showing a test image. + +## Versions + +Some notes regarding the software and versions. +Not all software is installed for all images. + +- mjpg-streamer + - Compiled from [https://github.com/jacksonliam/mjpg-streamer](https://github.com/jacksonliam/mjpg-streamer). diff --git a/camera-ustreamer/Dockerfile b/camera-ustreamer/Dockerfile new file mode 100644 index 0000000..2b6ffcf --- /dev/null +++ b/camera-ustreamer/Dockerfile @@ -0,0 +1,92 @@ +ARG BUILD_FROM="ghcr.io/home-assistant/amd64-base" +ARG JANUS_GATEWAY_VERSION="1.1.3" +ARG USTREAMER_VERSION="5.38" + +FROM ${BUILD_FROM} AS builder +ARG JANUS_GATEWAY_VERSION +ARG USTREAMER_VERSION +ENV LANG C.UTF-8 + +# Janus +RUN apk add -U --virtual .build-deps-janus \ + build-base \ + autoconf \ + automake \ + libtool \ + libconfig-dev \ + glib-dev \ + libnice-dev \ + jansson-dev \ + openssl-dev \ + zlib-dev \ + libsrtp-dev \ + curl-dev \ + libogg-dev \ + libwebsockets-dev \ + libusrsctp-dev +RUN wget -qO- https://github.com/meetecho/janus-gateway/archive/v${JANUS_GATEWAY_VERSION}.tar.gz | tar xz -C /tmp +WORKDIR /tmp/janus-gateway-${JANUS_GATEWAY_VERSION} +RUN sh autogen.sh +RUN ./configure --prefix=/opt/janus +RUN make +RUN make install +RUN make configs + +# Ustreamer +RUN apk add -U --virtual .build-deps-ustreamer \ + sed \ + build-base \ + libevent-dev \ + libbsd-dev \ + libjpeg-turbo-dev \ + musl-dev \ + alsa-lib-dev \ + speexdsp-dev \ + opus-dev \ + glib-dev \ + jansson-dev +RUN wget -qO- https://github.com/pikvm/ustreamer/archive/v${USTREAMER_VERSION}.tar.gz | tar xz -C /tmp +WORKDIR /tmp/ustreamer-${USTREAMER_VERSION} +RUN ln -s /opt/janus/include/janus /usr/include/janus +RUN sed --in-place --expression 's|^#include "refcount.h"$|#include "../refcount.h"|g' /usr/include/janus/plugins/plugin.h +RUN make WITH_PTHREAD_NP=0 WITH_JANUS=1 +RUN make install +RUN mv janus/libjanus_ustreamer.so /opt/janus/lib/janus/plugins/libjanus_ustreamer.so + +FROM ${BUILD_FROM} AS final +ENV LANG C.UTF-8 + +RUN apk add -U \ + alsa-lib \ + curl \ + glib \ + glib \ + jansson \ + jansson \ + libbsd \ + libconfig \ + libevent \ + libjpeg-turbo \ + libnice \ + libogg \ + libsrtp \ + libtool \ + libusrsctp \ + libwebsockets \ + musl \ + openssl \ + opus \ + speexdsp \ + zlib \ + caddy + +COPY --from=builder /opt/janus /opt/janus +COPY --from=builder /usr/local/bin/ustreamer /usr/local/bin/ustreamer + +COPY rootfs/ / + +WORKDIR / + +# # Make files executable +# # RUN chmod +x /etc/cont-init.d/*.sh +# # RUN chmod +x /etc/services.d/*/* diff --git a/camera-ustreamer/README.md b/camera-ustreamer/README.md new file mode 100644 index 0000000..e010b0c --- /dev/null +++ b/camera-ustreamer/README.md @@ -0,0 +1,5 @@ +# mjpg-streamer + +Provides camera stream through `mjpg-streamer`, to be used by e.g. OctoPrint addon. + +Instructions are provided in the tab "Docs". diff --git a/camera-ustreamer/config.yaml b/camera-ustreamer/config.yaml new file mode 100644 index 0000000..7bc9e7f --- /dev/null +++ b/camera-ustreamer/config.yaml @@ -0,0 +1,28 @@ +name: "Camera-mjpg-streamer" +version: "2022.7.0" +slug: "camera-mjpg-streamer" +description: "Camera streaming addon for Home Assistant, based on mjpg-streamer." +url: "https://github.com/fredrikbaberg/ha-3dprinter-addons/tree/main/camera-mjpg-streamer" +ingress: true +ingress_stream: true +panel_icon: mdi:camera +panel_title: mjpg-streamer +arch: + - armv7 + - amd64 + - armhf + - aarch64 + - i386 +stage: experimental +init: false +video: true +usb: true +ports: + 80/tcp: null +ports_description: + 80/tcp: Web-based interface (Not required for Ingress) +options: + mjpg_input: "input_uvc.so -n" +schema: + mjpg_input: "str" +image: ghcr.io/fredrikbaberg/ha-addon-camera-mjpg-streamer-{arch} diff --git a/camera-ustreamer/rootfs/etc/caddy/Caddyfile b/camera-ustreamer/rootfs/etc/caddy/Caddyfile new file mode 100644 index 0000000..278b20f --- /dev/null +++ b/camera-ustreamer/rootfs/etc/caddy/Caddyfile @@ -0,0 +1,4 @@ +localhost + +root * /server +file_server \ No newline at end of file diff --git a/camera-ustreamer/rootfs/etc/services.d/proxy/finish b/camera-ustreamer/rootfs/etc/services.d/proxy/finish new file mode 100644 index 0000000..382feb6 --- /dev/null +++ b/camera-ustreamer/rootfs/etc/services.d/proxy/finish @@ -0,0 +1,9 @@ +#!/usr/bin/execlineb -S0 +# ============================================================================== +# Add-on: mjpg-streamer +# Take down the S6 supervision tree when Nginx fails +# ============================================================================== +if -n { s6-test $# -ne 0 } +if -n { s6-test ${1} -eq 256 } + +s6-svscanctl -t /var/run/s6/services diff --git a/camera-ustreamer/rootfs/etc/services.d/proxy/run b/camera-ustreamer/rootfs/etc/services.d/proxy/run new file mode 100644 index 0000000..c792302 --- /dev/null +++ b/camera-ustreamer/rootfs/etc/services.d/proxy/run @@ -0,0 +1,11 @@ +#!/usr/bin/with-contenv bashio +# ============================================================================== +# Add-on: mjpg-streamer +# Runs the Nginx daemon +# ============================================================================== + +# Wait for aiortc web server to be available +bashio::net.wait_for 80 + +bashio::log.info "Starting proxy..." +# exec caddy run -config /etc/caddy/Caddyfile diff --git a/camera-ustreamer/rootfs/etc/services.d/ustreamer/finish b/camera-ustreamer/rootfs/etc/services.d/ustreamer/finish new file mode 100644 index 0000000..1ecc5e9 --- /dev/null +++ b/camera-ustreamer/rootfs/etc/services.d/ustreamer/finish @@ -0,0 +1,9 @@ +#!/usr/bin/execlineb -S0 +# ============================================================================== +# Add-on: mjpg-streamer +# Take down the S6 supervision tree when mjpg-streamer fails +# ============================================================================== +if -n { s6-test $# -ne 0 } +if -n { s6-test ${1} -eq 256 } + +s6-svscanctl -t /var/run/s6/services diff --git a/camera-ustreamer/rootfs/etc/services.d/ustreamer/run b/camera-ustreamer/rootfs/etc/services.d/ustreamer/run new file mode 100644 index 0000000..52f5786 --- /dev/null +++ b/camera-ustreamer/rootfs/etc/services.d/ustreamer/run @@ -0,0 +1,9 @@ +#!/usr/bin/with-contenv bashio +# ============================================================================== +# Add-on: mjpg-streamer +# Runs mjpg-streamer +# ============================================================================== + +bashio::log.info "Starting mjpg-streamer.." + +mjpg_streamer -i "$(bashio::config 'mjpg_input')" -o "output_http.so -w /www_mjpg -p 80" diff --git a/camera-ustreamer/rootfs/opt/janus/etc/janus/janus.plugin.ustreamer.jcfg b/camera-ustreamer/rootfs/opt/janus/etc/janus/janus.plugin.ustreamer.jcfg new file mode 100644 index 0000000..0b87836 --- /dev/null +++ b/camera-ustreamer/rootfs/opt/janus/etc/janus/janus.plugin.ustreamer.jcfg @@ -0,0 +1,3 @@ +memsink: { + object = "demo::ustreamer::h264" +} \ No newline at end of file diff --git a/camera-ustreamer/rootfs/server/index.html b/camera-ustreamer/rootfs/server/index.html new file mode 100644 index 0000000..4afba9d --- /dev/null +++ b/camera-ustreamer/rootfs/server/index.html @@ -0,0 +1,100 @@ + + + + + µStreamer H.264 demo + + + + + + + + + + \ No newline at end of file