27 Sep 2026 · 7 min read
A Steam store broadcast is an RTMP ingest. Anything that can speak RTMP can feed it: OBS, ffmpeg, a hardware encoder or a hosted service. This page is the whole picture for developers: who is allowed to broadcast, where the upload URL and token come from, the exact encode Steam wants, working ffmpeg commands, and the handful of things that make a correct stream stay invisible.
Valve checks the account, not the software. The Steam account that sends the stream must:
Games marked Adult-Only cannot be broadcast at all. A fresh account created just for streaming fails the first check, and it is the most common reason a setup that looks right never appears.
steamcommunity.com/broadcast/upload and choose Create RTMP Token. Steam picks an upload server near you and shows its RTMP URL.In any RTMP client the URL goes in the server field and the token in the stream key field. Tools that take one address want the two joined with a slash: rtmp://YOUR-UPLOAD-URL/YOUR-TOKEN.
These are Valve’s published requirements, not suggestions. The right-hand column is what Loopcast sends, which sits safely inside every limit.
Two of these cause most rejected or stuttering streams: a keyframe interval left on the encoder’s automatic setting, and variable bitrate. 60 fps is allowed, but at a 7,000 kbps ceiling 30 fps gives each frame twice the bits, which is the better trade for a looped trailer. More detail is in Steam broadcast video specs.
This takes any video, scales and pads it to 1080p at 30 fps, encodes it to the spec above and loops it forever:
ffmpeg -re -stream_loop -1 -i input.mp4 \ -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,fps=30" \ -c:v libx264 -preset veryfast -profile:v high -level:v 4.1 -pix_fmt yuv420p \ -g 60 -keyint_min 60 -sc_threshold 0 \ -b:v 6000k -minrate 6000k -maxrate 6000k -bufsize 12000k -x264-params nal-hrd=cbr \ -c:a aac -b:a 128k -ar 44100 -ac 2 \ -f flv "rtmp://YOUR-UPLOAD-URL/YOUR-TOKEN"
-re sends at real-time speed instead of as fast as the disk allows. -g 60, -keyint_min 60 and -sc_threshold 0 pin a keyframe to every 2 seconds, including across scene cuts. The three rate flags plus nal-hrd=cbr make the bitrate actually constant rather than capped.
Encoding 1080p live costs a few CPU cores for as long as the broadcast runs. For a loop, it is cheaper to encode the file to the spec once (with HandBrake or ffmpeg) and then send it without re-encoding:
ffmpeg -re -stream_loop -1 -i steam-ready.mp4 -c copy \ -f flv "rtmp://YOUR-UPLOAD-URL/YOUR-TOKEN"
Before you rely on a pre-encoded file, check what is actually in it:
ffprobe -v error -select_streams v:0 \ -show_entries stream=codec_name,profile,level,width,height,r_frame_rate,bit_rate \ steam-ready.mp4
You want h264, High, level 41, 1920 by 1080 and 30/1. ffprobe does not report the keyframe interval directly, so if in doubt, re-encode with the flags above.
An RTMP connection drops sooner or later: a network blip, an ingest restart on Valve’s side, a router reboot. ffmpeg exits when that happens and does not come back on its own. The minimum for an unattended broadcast is a loop that restarts it:
until false; do
ffmpeg -re -stream_loop -1 -i steam-ready.mp4 -c copy \
-f flv "rtmp://YOUR-UPLOAD-URL/YOUR-TOKEN"
sleep 5
doneThat covers the connection. It does not cover the machine. Whatever runs this has to stay powered, awake and online for as long as you want the page live, which is the real cost of doing it yourself. A small VPS works better than a desktop, since it never sleeps or installs updates overnight, but you are still the one who finds out when it stops.
The rest of the usual causes are in the troubleshooting guide.
Would rather not run the encoder at all? Loopcast holds the RTMP connection for you from a datacenter: upload any video, paste the URL and token, and we encode to this spec, restart on drops and can run it on a schedule. Start a stream.