commit 4cd41bb24ae99df1a7b018632619ed6357763f15 parent 8b472486508e8fc511caba8c525d6519e1ee7383 Author: Anders Damsgaard <anders@adamsgaard.dk> Date: Sun, 19 Apr 2020 20:09:52 +0000 Add preliminary brtv script for converting media and starting server Diffstat:
A | brtv-start.sh | | | 116 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 116 insertions(+), 0 deletions(-)
diff --git a/brtv-start.sh b/brtv-start.sh @@ -0,0 +1,116 @@ +#!/bin/sh + +# mkv streaming server executable +# git://github.com/klaxa/mkvserver_mk2 +bin=mkvserver_mk2 + +# memecache source dir +memecache=../memecache + +# converted memecache dir +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 + +# target video resolution +video_resolution=1280x720 + +# slide style +bgcolor=magenta +fcolor=white + +# show image memes for this duration [s] +image_display_time=10 + +# show title slides for this duration [s] +title_display_time=5 + + + +fit_img_16_9() { + convert -resize "$video_resolution"\> -size "$video_resolution" "$1" \ + xc:"$bgcolor" +swap -gravity center -composite "$2" +} + +video_from_img() { + ffmpeg -y \ + -f lavfi \ + -i anullsrc=r=48000 \ + -i "$1" \ + -t "00:${3}:00" \ + $ffmpeg_codec \ + "$2" +} + +title_slide() { + convert -size 640x480 xc:"$bgcolor" -pointsize 48 -fill "$fgcolor" \ + -gravity center -draw "text 0,0 '#${1%.*}'" "/tmp/${1%.*}.png" + ffmpeg -y \ + -f lavfi \ + -i anullsrc=r=48000 \ + -i "/tmp/${1%.*}.png" \ + -t "00:${title_display_time}:00" \ + $ffmpec_codec\ + "$2" +} + +video_conv() { + ffmpeg -y -i "$1" $ffmpeg_codec "$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 + fit_img_16_9 "$f" "${out%.*}.jpg" + video_from_img "${out%.mkv}.jpg" "${out}" "${image_display_time}" + fi +done + +# 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 + + title_path="${title}/$(basename "${f%.*}.mkv")" + [ ! -e "${title_path}" ] && title_slide "$f" "$title_path" + + out="${memecache_conv}/$(basename "${f%.*}.mkv")" + [ ! -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" ' + function add_title(s) { + sub(/\.\//, titledir"/", s); + return s + } + {line=$0; + print add_title($line); + print $0}' > playlist + +netcat -l -p "$commport" | $bin >/dev/null 2>&1 & +sleep 2 + +ffmpeg -f concat -safe 0 -i playlist \ + -f matroska \ + $ffmpeg_codec \ + -max_muxing_queue_size 9999 \ + tcp://localhost:$commport + + +pkill $bin