#!/bin/bash -e target_url="${1:-srt://127.0.0.1:9000}" ffmpeg_pid= call_ffmpeg() { command ffmpeg -hide_banner "$@" } daemon_ffmpeg() { call_ffmpeg "$@" & ffmpeg_pid=$! } shutdown_ffmpeg() { if is_ffmpeg_running then kill "$ffmpeg_pid" || true wait "$ffmpeg_pid" || true fi ffmpeg_pid= } is_ffmpeg_running() { [ -n "$ffmpeg_pid" ] && kill -0 "$ffmpeg_pid" } on_exit() { shutdown_ffmpeg } trap on_exit EXIT offline=0 while true do found_audio_source="" while read -r line do declare -a "found_source=($(sed -e 's/"/\\"/g' -e "s/'/\"/g" -e 's/[][`~!@#$%^&*():;<>.,?/\|{}=+-]/\\&/g' <<< "$line"))" found_source[0]=$(sed -e 's/\\\([`~!@#$%^&*():;<>.,?/\|{}=+-]\)/\1/g' <<< "${found_source[0]}") found_source[1]=$(sed -e 's/\\\([`~!@#$%^&*():;<>.,?/\|{}=+-]\)/\1/g' <<< "${found_source[1]}") case "${found_source[0]}" in *\(IDHPC\ Main\ Audio\)) found_audio_source="${found_source[0]}" ;; esac done < <(call_ffmpeg -loglevel info -extra_ips 192.168.188.21 -find_sources true -f libndi_newtek -i "dummy" 2>&1 | grep -Po "'(.+)'\s+'(.+)" | tee) if [ -z "$found_audio_source" ] then offline=$(( offline + 1 )) else offline=0 fi if ! is_ffmpeg_running && [ -n "$found_audio_source" ] then echo "starting ffmpeg with audio source: $found_audio_source" >&2 # HACK - can't use the standard mpegts here, but liquidsoap will happily accept anything ffmpeg can parse (by default)… so let's just use nut here even though it feels super duper wrong daemon_ffmpeg -loglevel warning -extra_ips 192.168.188.21 -f libndi_newtek -i "$found_audio_source" -c copy -f nut -write_index false "${target_url}" elif is_ffmpeg_running && [ -z "$found_audio_source" ] && [ "$offline" -gt 0 ] then echo "shutting down ffmpeg since no source has been found" >&2 shutdown_ffmpeg # it won't shut down by itself unfortunately fi sleep 1 done