tbrtv-start.sh - 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
---
tbrtv-start.sh (3423B)
---
1 #!/bin/sh
2 # generate title animations and start streaming server
3
4 pass="$(cat icecastpass)"
5
6 if [ $# -ne 1 ]; then
7 printf 'usage: %s <memecache_path>\n' "$0" >&2
8 exit
9 fi
10
11 ### CONFIGURATION START
12
13 # streaming server executable
14 #bin=vlc
15
16 # intermediate playlist file
17 playlist="playlist"
18
19 # memecache source dir
20 memecache="$1"
21
22 # converted memecache dir
23 memecache_conv="memecache"
24
25 # title animations dir
26 title="title"
27
28 # ffmpeg codec flags for generated animations
29 ffmpeg_codec="-acodec libopus -b:a 96K -vcodec libvpx -f webm -vf scale=1280:-1 -r 30 -ac 2"
30
31 # target video resolution
32 video_resolution=1280x720
33
34 # slide style
35 bgcolor=magenta
36 fcolor=white
37
38 # show image memes for this duration, must be two digits [s]
39 image_display_time=10
40
41 # show title slides for this duration, must be two digits [s]
42 title_display_time=05
43
44 ### CONFIGURATION END
45
46
47 fit_img_16_9() {
48 convert -resize "$video_resolution"\> -size "$video_resolution" "$1" \
49 xc:"$bgcolor" +swap -gravity center -composite "$2"
50 }
51
52 video_from_img() {
53 ffmpeg -y \
54 -f lavfi \
55 -i anullsrc=r=48000 \
56 -i "$1" \
57 -t "00:00:${image_display_time}" \
58 $ffmpeg_codec \
59 "$2";
60 }
61
62 title_slide() {
63 img="$(basename "${1%.*}".png)"
64 convert -size "$video_resolution" "xc:${bgcolor}" \
65 -pointsize 48 -fill "$fgcolor" \
66 -gravity center -draw "text 0,0 '#${img%.*}'" "$img"
67 ffmpeg -y \
68 -f lavfi \
69 -i anullsrc=r=48000 \
70 -i "$img" \
71 -t "00:00:${title_display_time}" \
72 $ffmpec_codec \
73 "$2" && rm "$img"
74 }
75
76 video_conv() {
77 ffmpeg -y -i "$1" $ffmpeg_codec -max_muxing_queue_size 1024 "$2"
78 }
79
80 mkdir -p "$title"
81 mkdir -p "$memecache_conv"
82
83 # generate video from each image
84 for f in "$memecache"/*.jpg "$memecache"/*.JPG "$memecache"/*.png "$memecache"/*.PNG; do
85 out="${memecache_conv}/$(basename "${f%.*}.webm")"
86 if [ -e "$f" ] && [ ! -e "$out" ]; then
87 printf 'in: %s, out: %s\n' "$f" "$out"
88 fit_img_16_9 "$f" "${out%.*}.jpg"
89 video_from_img "${out%.webm}.jpg" "${out}"
90 fi
91 done
92
93 # make animation for fallback stream
94 if [ ! -f bitreich-tv.webm ]; then
95 title_slide bitreich-tv bitreich-tv.webm
96 fi
97
98
99 # make title slides for video and converted images and encode to common codec
100 for f in "$memecache"/*.mkv \
101 "$memecache"/*.mp4 \
102 "$memecache"/*.webm \
103 "$memecache_conv"/*.webm; do
104
105 title_path="${title}/$(basename "${f%.*}.webm")"
106 [ ! -e "$title_path" ] && title_slide "$f" "$title_path"
107
108 out="${memecache_conv}/$(basename "${f%.*}.webm")"
109 [ ! -e "$out" ] && video_conv "$f" "$out"
110 done
111
112 # generate random playlist from converted memes and add title slides
113 find "$memecache_conv" -maxdepth 1 -name "*.webm" -type f | \
114 sort -R | \
115 awk -v memecachedir="$memecache" -v titledir="$title" '
116 function add_title(s) {
117 sub(/memecache/, "title", s);
118 return s
119 }
120 {line=$0;
121 print "file \""add_title($line)"\"";
122 print "file \""$0"\""}' | sed "s/\"/'/g" > "$playlist"
123 #print "file \""$0"\""}' | sed "s/\"/'/g" |grep -v title> "$playlist"
124
125 printf '\nstarting fallback stream\n'
126 ffmpeg -loglevel quiet \
127 -stream_loop -1 -i bitreich-tv.webm
128 -f webm -codec copy
129 icecast://source:${pass}@localhost:8000/brtvfallback
130
131 exit 0
132
133 sleep 5
134
135 printf '\nstarting stream\n'
136
137 ffmpeg -f concat -safe 0 -stream_loop -1 -i "$playlist" \
138 -f webm -cluster_size_limit 2M -cluster_time_limit 5100 -content_type video/webm \
139 -analyzeduration 2M -probesize 2M \
140 -codec copy \
141 -deadline realtime -threads 8 \
142 icecast://source:${pass}@localhost:8000/brtv