From 5000945d758dbcac51d8d61bfa80dbc449e82640 Mon Sep 17 00:00:00 2001 From: Jonas Smedegaard Date: Fri, 28 Apr 2017 00:36:12 +0200 Subject: Rename captureDVCAM+edit+encode+stream → stream. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/captureDVCAM+edit+encode+stream | 92 ------------------------------------- bin/stream | 92 +++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 92 deletions(-) delete mode 100755 bin/captureDVCAM+edit+encode+stream create mode 100755 bin/stream diff --git a/bin/captureDVCAM+edit+encode+stream b/bin/captureDVCAM+edit+encode+stream deleted file mode 100755 index 0e99129..0000000 --- a/bin/captureDVCAM+edit+encode+stream +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/sh - -set -e - -# TODO: Externalize to site-specific configfile -[ $# -gt 0 ] || set -- morla 5002 -- dvcam ../../content/icon_small.png - -exit1() { - echo >&2 "ERROR: $1" - exit 1 -} - -while [ $# -gt 0 ]; do - case $1 in - --) - shift; break;; - *) - if [ -z "$HOST" ]; then - HOST=$1 - elif [ -z "$FIRSTPORT" ]; then - FIRSTPORT=$1 - else - exit1 "Too many arguments: Max. 2 about target" - fi - ;; - esac - shift -done - -# TODO: Externalize to site-specific configfile -[ $# -gt 0 ] || set -- dvcam ../../content/icon_small.png - -while [ $# -gt 0 ]; do - case $1 in - alsa=*) ALSA=${1#*=}; AINPUT=$((AINPUT+1));; - alsa) ALSA=default; AINPUT=$((AINPUT+1));; - dvcam=*) DVCAM=${1#*=}; XINPUT=$((XINPUT+1));; - dvcam) DVCAM=auto; XINPUT=$((XINPUT+1));; - *.png) LOGO=$1; WINPUT=$((WINPUT+1));; - --) shift; break;; - *) exit1 "Unsupported input: $1";; - esac - shift -done - -HOST=${HOST:-127.0.0.1} -if [ "$HOST" = "$(hostname --short)" ]; then - IP=127.0.0.1 -else - IP=$(host "$HOST" | grep -Po 'address \K\S+') -fi - -[ -n "$AINPUT$VINPUT$XINPUT" ] || exit1 "Too few arguments: Min. 1 A/V source" -[ -z "$AINPUT" ] || [ -z "$VINPUT" ] || [ -z "$XINPUT" ] || exit1 "Too many arguments: Max. 2 A/V sources" -[ -z "$AINPUT" ] || [ $AINPUT -eq 1 ] || exit1 "Too many arguments: Max. 1 audio source" -[ -z "$VINPUT" ] || [ $VINPUT -eq 1 ] || exit1 "Too many arguments: Max. 1 video source" -[ -z "$WINPUT" ] || [ $WINPUT -eq 1 ] || exit1 "Too many arguments: Max. 1 watermark source" -[ -z "$XINPUT" ] || [ $XINPUT -eq 1 ] || exit1 "Too many arguments: Max. 1 multimedia source" -VSTREAMINDEX=1 -[ -n "$AINPUT" ] || VSTREAMINDEX=0 - -FIRSTPORT=${FIRSTPORT:-5002} # even number - next 3 ports used too - -ACHANNELS=2 -AFRAMERATE=48000 -ABITRATE=32000 - -HEIGHT=360 -VBITRATE=256000 - -# based on http://www.webmproject.org/docs/encoder-parameters/#real-time-cbr-encoding-and-streaming -# + scale+watermark trick based on http://stackoverflow.com/a/10937357 -# + Add 1s latency (deadline) -# + Use same RTP payload types as GStreamer -ffmpeg -hide_banner -threads auto -re \ - ${ALSA:+-f alsa -sample_rate "$AFRAMERATE" -channels "$ACHANNELS" -thread_queue_size 1024 -i "$ALSA"} \ - ${DVCAM:+-f iec61883 -i $DVCAM} \ - ${LOGO:+-i "$LOGO"} \ - -filter_complex \ - "[$VSTREAMINDEX:v]scale=-1:$HEIGHT[bg]${LOGO:+; - [bg][$((VSTREAMINDEX+1)):v]overlay=main_w-overlay_w-20:main_h-overlay_h-20[v]}" \ - -map '0:a' \ - -codec:a libopus -ac "$ACHANNELS" -ar "$AFRAMERATE" -b:a "$ABITRATE" \ - -f rtp -payload_type 111 "rtp://$IP:$FIRSTPORT?pkt_size=1200" \ - -map '[v]' \ - -pix_fmt yuv420p \ - -codec:v vp8 -quality realtime -deadline 1000000 -cpu-used 15 \ - -b:v "$VBITRATE" -minrate "$VBITRATE" -maxrate "$VBITRATE" \ - -undershoot-pct 95 -bufsize $((6000*VBITRATE/1000)) -rc_init_occupancy $((4000*VBITRATE/1000)) \ - -max-intra-rate 0 \ - -qmin 4 -qmax 56 \ - -f rtp -payload_type 100 "rtp://$IP:$((FIRSTPORT+2))?pkt_size=1200" diff --git a/bin/stream b/bin/stream new file mode 100755 index 0000000..0e99129 --- /dev/null +++ b/bin/stream @@ -0,0 +1,92 @@ +#!/bin/sh + +set -e + +# TODO: Externalize to site-specific configfile +[ $# -gt 0 ] || set -- morla 5002 -- dvcam ../../content/icon_small.png + +exit1() { + echo >&2 "ERROR: $1" + exit 1 +} + +while [ $# -gt 0 ]; do + case $1 in + --) + shift; break;; + *) + if [ -z "$HOST" ]; then + HOST=$1 + elif [ -z "$FIRSTPORT" ]; then + FIRSTPORT=$1 + else + exit1 "Too many arguments: Max. 2 about target" + fi + ;; + esac + shift +done + +# TODO: Externalize to site-specific configfile +[ $# -gt 0 ] || set -- dvcam ../../content/icon_small.png + +while [ $# -gt 0 ]; do + case $1 in + alsa=*) ALSA=${1#*=}; AINPUT=$((AINPUT+1));; + alsa) ALSA=default; AINPUT=$((AINPUT+1));; + dvcam=*) DVCAM=${1#*=}; XINPUT=$((XINPUT+1));; + dvcam) DVCAM=auto; XINPUT=$((XINPUT+1));; + *.png) LOGO=$1; WINPUT=$((WINPUT+1));; + --) shift; break;; + *) exit1 "Unsupported input: $1";; + esac + shift +done + +HOST=${HOST:-127.0.0.1} +if [ "$HOST" = "$(hostname --short)" ]; then + IP=127.0.0.1 +else + IP=$(host "$HOST" | grep -Po 'address \K\S+') +fi + +[ -n "$AINPUT$VINPUT$XINPUT" ] || exit1 "Too few arguments: Min. 1 A/V source" +[ -z "$AINPUT" ] || [ -z "$VINPUT" ] || [ -z "$XINPUT" ] || exit1 "Too many arguments: Max. 2 A/V sources" +[ -z "$AINPUT" ] || [ $AINPUT -eq 1 ] || exit1 "Too many arguments: Max. 1 audio source" +[ -z "$VINPUT" ] || [ $VINPUT -eq 1 ] || exit1 "Too many arguments: Max. 1 video source" +[ -z "$WINPUT" ] || [ $WINPUT -eq 1 ] || exit1 "Too many arguments: Max. 1 watermark source" +[ -z "$XINPUT" ] || [ $XINPUT -eq 1 ] || exit1 "Too many arguments: Max. 1 multimedia source" +VSTREAMINDEX=1 +[ -n "$AINPUT" ] || VSTREAMINDEX=0 + +FIRSTPORT=${FIRSTPORT:-5002} # even number - next 3 ports used too + +ACHANNELS=2 +AFRAMERATE=48000 +ABITRATE=32000 + +HEIGHT=360 +VBITRATE=256000 + +# based on http://www.webmproject.org/docs/encoder-parameters/#real-time-cbr-encoding-and-streaming +# + scale+watermark trick based on http://stackoverflow.com/a/10937357 +# + Add 1s latency (deadline) +# + Use same RTP payload types as GStreamer +ffmpeg -hide_banner -threads auto -re \ + ${ALSA:+-f alsa -sample_rate "$AFRAMERATE" -channels "$ACHANNELS" -thread_queue_size 1024 -i "$ALSA"} \ + ${DVCAM:+-f iec61883 -i $DVCAM} \ + ${LOGO:+-i "$LOGO"} \ + -filter_complex \ + "[$VSTREAMINDEX:v]scale=-1:$HEIGHT[bg]${LOGO:+; + [bg][$((VSTREAMINDEX+1)):v]overlay=main_w-overlay_w-20:main_h-overlay_h-20[v]}" \ + -map '0:a' \ + -codec:a libopus -ac "$ACHANNELS" -ar "$AFRAMERATE" -b:a "$ABITRATE" \ + -f rtp -payload_type 111 "rtp://$IP:$FIRSTPORT?pkt_size=1200" \ + -map '[v]' \ + -pix_fmt yuv420p \ + -codec:v vp8 -quality realtime -deadline 1000000 -cpu-used 15 \ + -b:v "$VBITRATE" -minrate "$VBITRATE" -maxrate "$VBITRATE" \ + -undershoot-pct 95 -bufsize $((6000*VBITRATE/1000)) -rc_init_occupancy $((4000*VBITRATE/1000)) \ + -max-intra-rate 0 \ + -qmin 4 -qmax 56 \ + -f rtp -payload_type 100 "rtp://$IP:$((FIRSTPORT+2))?pkt_size=1200" -- cgit v1.2.3