tFix title and image viewing duration, create fallback stream - bitreich-memestats - statistical analysis of tags in Freenode/#bitreich-en
 (HTM) git clone git://src.adamsgaard.dk/bitreich-memestats
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit 3c3d3a067be47f9db268d4817d937a49ecf5f051
 (DIR) parent 9a39dea48b13099733de2f6ff98de64901702b09
 (HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
       Date:   Thu, 11 Jun 2020 13:42:37 +0000
       
       Fix title and image viewing duration, create fallback stream
       
       Diffstat:
         M brtv-start.sh                       |     100 ++++++++++++++++++-------------
       
       1 file changed, 57 insertions(+), 43 deletions(-)
       ---
 (DIR) diff --git a/brtv-start.sh b/brtv-start.sh
       t@@ -1,6 +1,5 @@
        #!/bin/sh
       -# start streaming server, but beforehand reencode memecache and
       -# generate title animations if necessary
       +# generate title animations and start streaming server
        
        if [ $# -ne 1 ]; then
                printf 'usage: %s <memecache_path>\n' "$0" >&2
       t@@ -9,24 +8,23 @@ fi
        
        ### CONFIGURATION START
        
       -# mkv streaming server executable
       -# git://github.com/klaxa/mkvserver_mk2
       -bin=mkvserver_mk2
       +# streaming server executable
       +#bin=vlc
       +
       +# intermediate playlist file
       +playlist="playlist"
        
        # memecache source dir
        memecache="$1"
        
        # converted memecache dir
       -memecache_conv=memecache
       +memecache_conv="memecache"
        
        # title animations dir
        title="title"
        
       -# desired ffmpeg codec flags
       -ffmpeg_codec="-c:v libx264 -c:a libvorbis -f matroska"
       -
       -# port for streaming socket (combined stream hosted on port 8080)
       -commport=12345
       +# ffmpeg codec flags for generated animations
       +ffmpeg_codec="-acodec libopus -b:a 96K -vcodec libvpx -f webm -vf scale=1280:-1 -r 30 -ac 2"
        
        # target video resolution
        video_resolution=1280x720
       t@@ -35,11 +33,11 @@ video_resolution=1280x720
        bgcolor=magenta
        fcolor=white
        
       -# show image memes for this duration [s]
       +# show image memes for this duration, must be two digits [s]
        image_display_time=10
        
       -# show title slides for this duration [s]
       -title_display_time=5
       +# show title slides for this duration, must be two digits [s]
       +title_display_time=05
        
        ### CONFIGURATION END
        
       t@@ -54,73 +52,89 @@ video_from_img() {
                        -f lavfi \
                        -i anullsrc=r=48000 \
                        -i "$1" \
       -                -t "00:${3}:00" \
       +                -t "00:00:${image_display_time}" \
                        $ffmpeg_codec \
                        "$2";
        }
        
        title_slide() {
                img="$(basename "${1%.*}".png)"
       -        convert -size "$video_resolution" "xc:${bgcolor}" -pointsize 48 -fill "$fgcolor" \
       +        convert -size "$video_resolution" "xc:${bgcolor}" \
       +                -pointsize 48 -fill "$fgcolor" \
                        -gravity center -draw "text 0,0 '#${img%.*}'" "$img"
                ffmpeg -y \
                        -f lavfi \
                        -i anullsrc=r=48000 \
                        -i "$img" \
       -                -t "00:${title_display_time}:00" \
       +                -t "00:00:${title_display_time}" \
                        $ffmpec_codec \
       -                "$2";
       +                "$2" && rm "$img"
        }
        
        video_conv() {
       -        ffmpeg -y -i "$1" $ffmpeg_codec "$2"
       +        ffmpeg -y -i "$1" $ffmpeg_codec -max_muxing_queue_size 1024 "$2"
        }
        
       -
        mkdir -p "$title"
        mkdir -p "$memecache_conv"
        
        # generate video from each image
       -for f in "$memecache"/*.jpg "$memecache"/*.png "$memecache"/*.JPG; do
       -        out="${memecache_conv}/$(basename "${f%.*}.mkv")"
       -        if [ ! -e "$out" ]; then
       +for f in "$memecache"/*.jpg "$memecache"/*.JPG "$memecache"/*.png "$memecache"/*.PNG; do
       +        out="${memecache_conv}/$(basename "${f%.*}.webm")"
       +        if [ -e "$f" ] && [ ! -e "$out" ]; then
       +                printf 'in: %s, out: %s\n' "$f" "$out"
                        fit_img_16_9 "$f" "${out%.*}.jpg"
       -                video_from_img "${out%.mkv}.jpg" "${out}" "${image_display_time}"
       +                video_from_img "${out%.webm}.jpg" "${out}"
                fi
        done
        
       +# make animation for fallback stream
       +if [ ! -f bitreich-tv.webm ]; then
       +        title_slide bitreich-tv bitreich-tv.webm
       +fi
       +
       +
        # make title slides for video and converted images and encode to common codec
        for f in "$memecache"/*.mkv \
                 "$memecache"/*.mp4 \
                         "$memecache"/*.webm \
       -                 "$memecache_conv"/*.mkv; do
       +                 "$memecache_conv"/*.webm; do
        
       -        title_path="${title}/$(basename "${f%.*}.mkv")"
       -        [ ! -e "${title_path}" ] && title_slide "$f" "$title_path"
       +        title_path="${title}/$(basename "${f%.*}.webm")"
       +        [ ! -e "$title_path" ] && title_slide "$f" "$title_path"
        
       -        out="${memecache_conv}/$(basename "${f%.*}.mkv")"
       -        [ ! -e "${out}" ] && video_conv "$f" "$out"
       +        out="${memecache_conv}/$(basename "${f%.*}.webm")"
       +        [ ! -e "$out" ] && video_conv "$f" "$out"
        done
        
        # generate random playlist from converted memes and add title slides
       -find "$memecache_conv" -maxdepth 1 -name "*.mkv" -type f | sort -R | \
       -        sed "s/^/file '/;s/$/'/" | \
       -        awk -v titledir="$title" '
       +find "$memecache_conv" -maxdepth 1 -name "*.webm" -type f | \
       +        sort -R | \
       +        awk -v memecachedir="$memecache" -v titledir="$title" '
                function add_title(s) {
       -                sub(/\.\//, titledir"/", s);
       +                sub(/memecache/, "title", s);
                        return s
                }
                {line=$0;
       -        print add_title($line);
       -        print $0}' > playlist
       +        print "file \""add_title($line)"\"";
       +        print "file \""$0"\""}' | sed "s/\"/'/g" > "$playlist"
       +        #print "file \""$0"\""}' | sed "s/\"/'/g" |grep -v title> "$playlist"
       +
       +printf '\nstarting fallback stream\n'
       +ffmpeg -loglevel quiet \
       +        -stream_loop -1 -i bitreich-tv.webm
       +        -f webm -codec copy
       +        icecast://source:hasselkospiserkrymmel@localhost:8000/brtvfallback
       +
       +exit 0
        
       -netcat -l -p "$commport" | $bin >/dev/null 2>&1 &
       -sleep 2
       +sleep 5
        
       -ffmpeg -f concat -safe 0 -i playlist \
       -        -f matroska \
       -        $ffmpeg_codec \
       -        -max_muxing_queue_size 9999 \
       -        tcp://localhost:$commport
       +printf '\nstarting stream\n'
        
       -pkill $bin
       +ffmpeg -f concat -safe 0 -stream_loop -1 -i "$playlist" \
       +        -f webm -cluster_size_limit 2M -cluster_time_limit 5100 -content_type video/webm \
       +        -analyzeduration 2M -probesize 2M \
       +        -codec copy \
       +        -deadline realtime -threads 8 \
       +        icecast://source:hasselkospiserkrymmel@localhost:8000/brtv