-
-
Save russfeld/0878b1f8eaf7409136b9125ce5e1458f to your computer and use it in GitHub Desktop.
| #!/bin/bash | |
| # ================================================================= | |
| # Stream configuration file for Raspberry Pi Camera | |
| # | |
| # @author Russell Feldhausen ([email protected]) | |
| # @version 2019-06-05 | |
| # | |
| # 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. | |
| # | |
| # This was tested and built on Raspbian 9 installed using Noobs | |
| # ================================================================= | |
| # Set width and height of output video | |
| WIDTH=1920 | |
| HEIGHT=1080 | |
| # Set output framerate | |
| FRAMERATE=30 | |
| # Set keyframe spacing (must be double the framerate) | |
| KEYFRAME=60 | |
| # Set bitrate (Twitch recommends 3500000) | |
| BITRATE=3500000 | |
| # Set stream URL | |
| URL= | |
| # Set stream key | |
| KEY= | |
| # Command | |
| raspivid -n -t 0 -w $WIDTH -h $HEIGHT -fps $FRAMERATE -b $BITRATE -g $KEYFRAME -o - | ffmpeg -f lavfi -i anullsrc -c:a aac -r $FRAMERATE -i - -g $KEYFRAME -strict experimental -threads 4 -vcodec copy -map 0:a -map 1:v -b:v $BITRATE -preset ultrafast -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. So, in the ffmpeg command above | |
| # a blank audio channel is included. It was not required for Twitch | |
| # in my testing. | |
| # ================================================================= |
That looks awesome! Thanks for the update. I'll have to try it sometime.
thank you, it's working like a charm.
Just want to share some appreciations to @russfeld for the script and @florian-luce for the systemd implementation. Works like a charm! 🙏❤
This script works brilliantly. A tip if you have the NOIR camera: Add -awb greyworld to the raspivid command so that the output doesn't look pink.
I get the following warnings :
[h264 @ 0x212b090] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
[flv @ 0x21dcc40] Timestamps are unset in a packet for stream 1. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
Thanks for this amazing script, i was checking on the how to add audio to it. I saw the comments about adding an input using a usb soundcard input. In my case I just needed to add a background music to the stream with no need of sync with the video, so my plan is to use prerecorded mp3 audio file, here is how I modified the command for that purpose:
raspivid -n -t 0 -w $WIDTH -h $HEIGHT -fps $FRAMERATE -b $BITRATE -g $KEYFRAME -o - | ffmpeg -i audio-file.mp3 -c:a aac -r $FRAMERATE -i - -g $KEYFRAME -strict experimental -threads 4 -vcodec copy -map 0:a -map 1:v -b:v $BITRATE -preset ultrafast -f flv "${URL}/${KEY}"
Hi first for making this script its been a huge help, I have a problem since raspivid is no longer working, I have tried to modify it by changing it to: libcamera-vid -n -t 0 --width $WIDTH --height $HEIGHT --frames $FRAMERATE -g $KEYFRAME -b $BITRATE -o -| ffmpeg but in twitch, I only get a blank screen and 0kbps bitrate. Any idea of what can I do to fix this?
UPDATE:
I've made an updated tool that works with libcamera and with more additions. Here it is: https://github.com/diegozalez/RaspyStream
This is brilliant, thank you so much for this, works a treat!
This is brilliant, thank you so much for this, works a treat!
Thanks a lot!!!! it means to me very much !!!!
I got it working with a sound card, but you might need to recompile FFmpeg. I also added audio-video syncing and camera settings: