brtv-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