tFix title and image viewing duration, create fallback stream - bitreich-memest… | |
git clone git://src.adamsgaard.dk/bitreich-memestats | |
Log | |
Files | |
Refs | |
LICENSE | |
--- | |
commit 3c3d3a067be47f9db268d4817d937a49ecf5f051 | |
parent 9a39dea48b13099733de2f6ff98de64901702b09 | |
Author: Anders Damsgaard <[email protected]> | |
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 | |
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:-… | |
# 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 … | |
+ 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"… | |
+ 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_tim… | |
+ 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 … | |
+ -analyzeduration 2M -probesize 2M \ | |
+ -codec copy \ | |
+ -deadline realtime -threads 8 \ | |
+ icecast://source:hasselkospiserkrymmel@localhost:8000/brtv |