April 10, 2018

Using RasPi for Video

The RasPi has great hardware for working with video. Sofar we're able to transcode three streams and run the Pi camera at 30fps, encode and deliver with a few secods of latency, even when accounting for intermediate CDN caching. More details here.

This article is a living document... as of now this is what we use to go live.

Based on the nginx-rtmp config here: GitHub

720:

./ffmpeg -hide_banner -y -codec:v h264_mmal -i rtmp://localhost:1935/ispoogedaily_source_720/ispoogedaily_720 -c:a copy -c:v h264 -profile:v main -sc_threshold 0 -g 60 -keyint_min 50 -vf scale=w=1280:h=720:force_original_aspect_ratio=decrease -b:v 6000k -maxrate 6420k -bufsize 9000k -f flv rtmp://localhost:1935/ispoogedaily_local/ispoogedaily_720

360:

./ffmpeg -hide_banner -y -codec:v h264_mmal -i rtmp://localhost:1935/ispoogedaily_source_360/ispoogedaily_360 -c:a copy -c:v h264 -profile:v main -sc_threshold 0 -g 60 -keyint_min 50 -vf scale=w=640:h=360:force_original_aspect_ratio=decrease -b:v 3000k -maxrate 3210k -bufsize 4500k -f flv rtmp://localhost:1935/ispoogedaily_local/ispoogedaily_360

240:

./ffmpeg -hide_banner -y -codec:v h264_mmal -i rtmp://localhost:1935/ispoogedaily_source_240/ispoogedaily_240 -c:a copy -level:v 1.0 -c:v h264 -profile:v main -sc_threshold 0 -g 60 -keyint_min 60 -vf scale=w=426:h=240:force_original_aspect_ratio=decrease -b:v 800k -maxrate 1000k -bufsize 3000k -f flv rtmp://localhost:1935/ispoogedaily_local/ispoogedaily_240

live twitch:

live youtube:

https://gist.github.com/mikoim/27e4e0dc64e384adbcb91ff10a2d3678

./ffmpeg -i rtmp://localhost:1935/ispoogedaily_local/ispoogedaily_720 \
  -c:v libx264 -preset slow -profile:v high \
  -crf 18 -coder 1 -pix_fmt yuv420p -movflags \
  +faststart -g 30 -bf 2 -c:a aac -b:a 384k \
  -profile:a aac_low -f flv rtmp://a.live.youtube.com/li...FIXME

number of slices:

find /tmp/hls/ispooge.com -name *.ts | wc -l

number of streams:

find /tmp/hls/ispooge.com -name *.m3u8 | wc -l

check tmpfs (where segments are written):

df -h | grep /tmp$

top right small view:

  • screencast

raspivid -p 960,22,320,180 -t 0 -w 320 -h 180 -fps 30 -hf -b 1048576

top left large view:

  • whiteboard

raspivid -p 0,20,960,540 -t 0 -w 960 -h 540 -fps 30 -b 8388608

  • record

raspivid -p 0,20,960,540 -t 0 -w 960 -h 540 -fps 30 -b 8388608 -o sample.h264