commit 3c3d3a067be47f9db268d4817d937a49ecf5f051
parent 9a39dea48b13099733de2f6ff98de64901702b09
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(-)
diff --git a/brtv-start.sh b/brtv-start.sh
@@ -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
@@ -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
@@ -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
@@ -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