Introduction
Introduction Statistics Contact Development Disclaimer Help
tAdd preliminary brtv main script - bitreich-tv - meme tv encoding and streaming
git clone git://src.adamsgaard.dk/bitreich-tv
Log
Files
Refs
---
commit 3a8559a5c96734befbfdb580c7e8a2ab491ea6d4
Author: Anders Damsgaard <[email protected]>
Date: Tue, 11 Aug 2020 17:29:44 +0200
Add preliminary brtv main script
Diffstat:
A brtv-start.sh | 151 +++++++++++++++++++++++++++++…
1 file changed, 151 insertions(+), 0 deletions(-)
---
diff --git a/brtv-start.sh b/brtv-start.sh
t@@ -0,0 +1,151 @@
+#!/bin/sh
+# generate title animations and start streaming server
+
+pass="$(gpg2 -q -d icecastpass.gpg)"
+
+if [ $# -ne 1 ]; then
+ printf 'usage: %s <memecache_path>\n' "$0" >&2
+ exit
+fi
+
+### CONFIGURATION START
+
+# intermediate playlist file
+playlist="playlist_$(date +%Y-%m-%d)"
+
+# memecache source dir
+memecache="$1"
+
+# converted memecache dir
+memecache_conv="memecache_conv"
+
+# title animations dir
+title="title"
+
+# ffmpeg flags for generated videos
+video_ext="webm"
+ffmpeg_codec="-loglevel error -acodec libopus -b:a 96K -vcodec libvpx -b:v 64k…
+out_video="brtv_$(date +%Y-%m-%d).${video_ext}"
+#out_video_duration="24:00:00"
+out_video_duration="00:05:00"
+
+# 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
+
+### CONFIGURATION END
+
+
+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 "${image_display_time}" \
+ $ffmpeg_codec \
+ "$2";
+}
+
+title_slide() {
+ img="$(basename "${1%.*}".png)"
+ 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 "${title_display_time}" \
+ $ffmpec_codec \
+ "$2" && rm "$img"
+}
+
+video_conv() {
+ 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,jpeg,JPG,png,PNG}; do
+ out="${memecache_conv}/$(basename "${f%.*}.${video_ext}")"
+ 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%.${video_ext}}.jpg" "${out}"
+ fi
+done
+
+# make animation for fallback stream
+if [ ! -f "bitreich-tv.${video_ext}" ]; then
+ title_slide bitreich-tv bitreich-tv.${video_ext}
+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"/*."${video_ext}"; do
+
+ title_path="${title}/$(basename "${f%.*}.webm")"
+ [ ! -e "$title_path" ] && title_slide "$f" "$title_path"
+
+ 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 "*.webm" -type f | \
+ sort -R | \
+ awk -v memecachedir="$memecache" -v titledir="$title" '
+ function add_title(s) {
+ sub(/memecache/, "title", s);
+ return s
+ }
+ {line=$0;
+ 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:${pass}@localhost:8000/brtvfallback
+
+
+# encode daily video file
+ffmpeg -n -f concat -safe 0 -i "$playlist" \
+ -f "${video_ext}" -cluster_size_limit 2M -cluster_time_limit 5100 -con…
+ -analyzeduration 2M -probesize 2M \
+ -codec copy \
+ -deadline realtime -threads 8 \
+ -to "$out_video_duration"
+ "$video_out"
+
+exit 0
+
+printf '\nstarting stream\n'
+
+ffmpeg -f concat -safe 0 -stream_loop -1 -i "$video_out" \
+ -f webm -cluster_size_limit 2M -cluster_time_limit 5100 -content_type …
+ -analyzeduration 2M -probesize 2M \
+ -codec copy \
+ -deadline realtime -threads 8 \
+ icecast://source:${pass}@adamsgaard.dk:3232/brtv
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.