Welcome!
This is the source code to twitch.tv/ADanaLife_
It is composed of two parts:
- A Ruby script that generates a randomized playlist
- A Bash script that starts an ffmpeg process
Thanks for watching!
-Dana
Welcome!
This is the source code to twitch.tv/ADanaLife_
It is composed of two parts:
Thanks for watching!
-Dana
| #!/usr/bin/env ruby | |
| # this ugly script generates a playlist for FFMPEG | |
| # use the dir passed in via CLI | |
| vid_dir = ARGV.shift | |
| # find all the files in the dir | |
| all_files = Dir.glob("#{vid_dir}/**/*") | |
| # but only incude MP4 files | |
| files = all_files.select{|f| f =~ /\.MP4$/ } | |
| # create a hash that organizes files by date taken | |
| by_day = {} | |
| files.each do |file| | |
| date = file.sub(/.*\//,'')[0..8] | |
| by_day[date] ||= [] | |
| by_day[date] << file | |
| end | |
| # since some files are in a "read-only" subdir, make sure | |
| # those are in the correct order when sorted | |
| by_day.each do |date, file_list| | |
| file_list.sort! do |a,b| | |
| a.sub(/\/RO/,'') <=> b.sub(/\/RO/,'') | |
| end | |
| end | |
| # print the formatted output for ffmpeg | |
| by_day.keys.shuffle.each do |day| | |
| by_day[day].each do |file| | |
| puts "file '#{file}'" | |
| end | |
| end |
| #!/usr/bin/env bash | |
| # This script takes a directory of videos and streams them to Twitch | |
| # | |
| # I use it for streaming dashcam footage, and because of this I apply | |
| # a filter to blur out some a portion of the screen. | |
| #TODO: check if we have ffmpeg and fail gracefully | |
| #TODO: the blur needs to not cover the E/W | |
| if [[ $# -eq 0 ]] ; then | |
| echo "Usage: $0 [stream key] [dir containing vids]" | |
| exit 1 | |
| fi | |
| STREAM_KEY="$1" | |
| VID_DIR="$2" | |
| ffmpeg \ | |
| -hide_banner \ | |
| -f concat \ | |
| -safe 0 \ | |
| -i <(./smart-shuffle.rb $VID_DIR) \ | |
| -filter_complex \ | |
| "[0:v]crop=180:50:0:in_h-out_h,boxblur=10[fg]; \ | |
| [0:v][fg]overlay=0:main_h-overlay_h[v]" \ | |
| -map "[v]" \ | |
| -s 1920x1080 \ | |
| -preset fast \ | |
| -crf 28 \ | |
| -an \ | |
| -c:v libx264 \ | |
| -x264-params "nal-hrd=cbr" \ | |
| -pix_fmt yuv420p \ | |
| -r 30 \ | |
| -minrate 850k -maxrate 850k -b:v 900k -bufsize 280k \ | |
| -force_key_frames 'expr:gte(t,n_forced*2)' \ | |
| -f flv \ | |
| "rtmp://live.twitch.tv/app/$STREAM_KEY" | |
| #################################################################### | |
| # safe to put old configs down here cause we wont ever get down here | |
| #################################################################### | |
| exit 0 | |
| # these are other options we could try/have tried | |
| -r 30 \ | |
| -maxrate 12M \ | |
| -bufsize 6M \ | |
| -framerate 15 \ | |
| -preset slow \ | |
| -g 60 \ | |
| -preset slower \ | |
| -c:v mpeg2video \ | |
| -loglevel info \ | |
| -vcodec copy \ | |
| -b:v 1M \ | |
| -minrate 1M \ | |
| -maxrate 1M \ | |
| -bufsize 2M \ | |
| -profile:v baseline \ | |
| -level 3.0 \ | |
| -movflags +faststart \ |