Skip to content

Instantly share code, notes, and snippets.

@metalolf
Forked from russfeld/picam-stream.sh
Last active September 23, 2023 11:06
Show Gist options
  • Save metalolf/0b5f3c874308ab2e0df953e892e17fd3 to your computer and use it in GitHub Desktop.
Save metalolf/0b5f3c874308ab2e0df953e892e17fd3 to your computer and use it in GitHub Desktop.
Stream Raspberry Pi Camera to Twitch
#!/bin/bash
# =================================================================
# Stream configuration file for Raspberry Pi Camera
#
# @author Russell Feldhausen (russfeldh@gmail.com)
# @version 2019-06-05
# @forked 2023-01-15 by fwnklr
#
# This set of commands should allow you to stream video from your
# Raspberry Pi Camera to Twitch and Youtube (and possibly other
# RTMP endpoints) with decent quality and performance.
#
# You may need to install raspivid and/or ffmpeg to use this script.
# =================================================================
# Set width and height of output video
WIDTH=1920
HEIGHT=1080
# Set output framerate
FRAMERATE=30
#Set Rotation
ROTATION=0
# Set keyframe spacing (must be double the framerate)
KEYFRAME=60
# Set bitrate (Twitch recommends 3500000)
BITRATE=3500000
# Camera Settings (includes commands)
# If you use a hdmi-csi bridge these setting should be handled with care
SATURATION=25 #sa
SHARPNESS= #sh
CONTRAST= #co
BRIGHTNESS= #br
AWB= #awb
ISO= #iso
SHUTTERSPEED= #ss
EXPOSURE= #ex
EV=0 #ev
ANTIFLICKER= #fli
IMAGEEFFECT= #ifx
# Set video offset
OFFSET=0.5
# Set Audio input (check using "arecord -l")
INPUT=plughw:2,0
# Set stream URL
URL=rtmp://ber.contribute.live-video.net/app
# Set stream key
KEY=
# Command
raspivid -o - -t 0 -w $WIDTH -h $HEIGHT -fps $FRAMERATE -b $BITRATE -rot $ROTATION -g $KEYFRAME -sa $SATURATION -awb $AWB -ev $EV -f | /home/pi/ffmpeg/ffmpeg -use_wallclock_as_timestamps 1 -thread_queue_size 10240 -f h264 -r 30 -i - -itsoffset $OFFSET -f alsa -thread_queue_size 10240 -ac 2 -i $INPUT -vcodec copy -acodec aac -ac 2 -ar 44100 -ab 192k -f flv "${URL}/${KEY}"
# =================================================================
# Full Documentation of Command Options
#
# +++ raspivid +++
# -n = no preview window
# -t = time to capture (0 to disable, which allows streaming)
# -w = video width
# -h = video height
# -fps = output framerate (max 30 for 1080p, 60 for 720p)
# -b = bitrate
# -g = keyframe rate (refresh period)
# -o - = output to stdout (allows piping to ffmpeg)
#
# +++ ffmpeg +++
# -f lavfi = use lavfi filter (see note below)
# -i anullsrc = grab blank input (see note below)
# -c:a aac = set audio codec to aac
# -r = output framerate (should match raspivid framerate)
# -i - = read input from stdin (piped from ffmpeg)
# -g = keyframe rate (refresh period)
# -strict experimental = allow nonstandard things
# -threads 4 = set number of encoding threads to 4 (# of cores)
# -vcodec copy = use video as-is (do not re-encode video)
# -map 0:a = use the audio from input 0 (see note below)
# -map 1:v = use the video from input 1 (raspivid)
# -b:v = bitrate
# -preset ultrafast = use the ultrafast encoding preset
# -f flv = set output format to flv for streaming
# "${URL}/{KEY}" = specify RTMP URL as output for stream
#
# ** NOTE **
# According to some information online, YouTube will reject a live
# stream without an audio channel.
# =================================================================
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment