[Guide] How to stream a test image for extension testing

The problem

When submitting an extension for review, you have to provide a test stream that’s online and has the extension installed. You basically have to stream 24 hours a day until your extension is approved. Not everyone has stable internet or wants to hog the dev-rig for this.

The solution

We are going to use ffmpeg to stream a static test image 24/7 with very little cpu usage.

How (Linux)

  • Install ffmpeg (usually sudo apt install ffmpeg)
  • create an image with your desired resolution (I use 640 x 360, but you can use 720p or 1080p)
    call it bg.png or bg.jpg
  • get your stream key from Dashboard -> Settings (Channel)
  • open a terminal and navigate to the folder with the image
  • run ffmpeg -nostdin -framerate 15 -re -loop 1 -i bg.png -f flv -vcodec libx264 -pix_fmt yuv420p -preset slow -r 15 -g 30 "rtmp://live-fra.twitch.tv/app/YOURSTREAMKEY" -nostats </dev/null >/dev/null 2>&1 &

Congratulations, you are now streaming a static test image to twitch

Command breakdown

  • -nosdtin to suppress some terminal outputs
  • -framerate 15 -re -loop 1 -i bg.png loops one image at 15fps in real time
    if you don’t use -re it’s reading the image as fast as it can, using all ressources
  • -f flv -vcodec libx264 -pix_fmt yuv420p are the twitch recommended codec settings
  • -preset slow sets the encoding speed to compression ratio
    other options are ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow
    if ffmpeg can’t keep up, increase the speed
  • -r 15 -g 30 sets the output fps to 15 and the keyframe interval to 2
    if keyframe interval is more than 4*fps twitch will show error messages
  • "rtmp://live-fra.twitch.tv/app/YOURSTREAMKEY" is the stream url, live-fra is Frankfurt, you should change this to your closest server from this list
  • -nostats </dev/null >/dev/null 2>&1 suppresses more terminal output by sending it to /dev/null
  • & this runs the command and frees up the terminal, basically running the process in the background

How to Stop

After running the command, the terminal gives you a process id, like 28010 or something. You can stop ffmpeg by typing kill 28010 in the terminal. If you don’t know the id, type top to get a process list and look for ffmpeg (usually at the top). Ctrl + C to leave top

The best solution

If you really don’t want to use your own Pc, you can do this from a cheap linux server in the cloud. I use a 5$/month Digital Ocean droplet. If you use my referral link you get 10$ for free. My 640 x 360 png uses 11% CPU and 8% RAM. By doing this you need to use ssh, so you have to put nohup before the ffmpeg command, so it doesn’t stop, when you terminate the ssh session:
nohup ffmpeg -nostdin -framerate 15 -re -loop 1 -i bg.png -f flv -vcodec libx264 -pix_fmt yuv420p -preset slow -r 15 -g 30 "rtmp://live-fra.twitch.tv/app/YOURSTREAMKEY" -nostats </dev/null >/dev/null 2>&1 &

Troubleshooting

  • make sure you use YOUR stream key and the right image name
  • if you want to see output or errors run the command in the terminal foreground:
    ffmpeg -framerate 15 -re -loop 1 -i bg.png -f flv -vcodec libx264 -pix_fmt yuv420p -preset slow -r 15 -g 30 "rtmp://live-fra.twitch.tv/app/YOURSTREAMKEY"
    Ctrl + C to end it
7 Likes

Hi, I found this interesting, does everyone have to do this?
is complicated, here in Brazil energy and internet is not cheap, apart from the time we spend developing nor is it certainty of financial return, I was lucky to find your guide.
I could do this in my cloud of heroku? thank you.

@edit

works in a different way for me, when I run the command on the terminal, I have to go into some different channel and then return to mine to work

Face that problem frequently, will try this out next time I face it. Thanks

Thanks for inspiring this one-click (almost) solution: