FFmpeg Streaming
Streaming video and audio using FFmpeg to various protocols and platforms.
Stream to RTMP (YouTube, Twitch, etc.)
Stream Video File to RTMP
1# Basic RTMP stream
2ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -maxrate 3000k \
3 -bufsize 6000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 160k -ar 44100 \
4 -f flv rtmp://live.twitch.tv/app/YOUR_STREAM_KEY
5
6# YouTube Live
7ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 2500k \
8 -maxrate 2500k -bufsize 5000k -pix_fmt yuv420p -g 50 \
9 -c:a aac -b:a 128k -ar 44100 -f flv \
10 rtmp://a.rtmp.youtube.com/live2/YOUR_STREAM_KEY
11
12# Loop video continuously
13ffmpeg -re -stream_loop -1 -i input.mp4 -c:v libx264 -preset veryfast \
14 -b:v 2500k -maxrate 2500k -bufsize 5000k -pix_fmt yuv420p -g 50 \
15 -c:a aac -b:a 128k -f flv rtmp://server/app/key
Key Parameters:
-re: Read input at native frame rate (real-time)-stream_loop -1: Loop input indefinitely-g 50: GOP size (keyframe interval, 2 seconds at 25fps)-preset veryfast: Fast encoding for live streaming-maxrate&-bufsize: Rate control for stable streaming
Stream from Webcam/Camera
Linux (V4L2)
1# List available cameras
2ffmpeg -f v4l2 -list_formats all -i /dev/video0
3
4# Stream from webcam
5ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video0 \
6 -c:v libx264 -preset veryfast -b:v 2000k -maxrate 2000k -bufsize 4000k \
7 -pix_fmt yuv420p -g 60 -f flv rtmp://server/app/key
8
9# Webcam with audio (ALSA)
10ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video0 \
11 -f alsa -i hw:0 -c:v libx264 -preset veryfast -b:v 2000k \
12 -c:a aac -b:a 128k -f flv rtmp://server/app/key
13
14# Webcam with PulseAudio
15ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video0 \
16 -f pulse -i default -c:v libx264 -preset veryfast -b:v 2000k \
17 -c:a aac -b:a 128k -f flv rtmp://server/app/key
Windows (DirectShow)
1# List devices
2ffmpeg -list_devices true -f dshow -i dummy
3
4# Stream from webcam
5ffmpeg -f dshow -video_size 1280x720 -framerate 30 -i video="Integrated Camera" \
6 -c:v libx264 -preset veryfast -b:v 2000k -maxrate 2000k -bufsize 4000k \
7 -pix_fmt yuv420p -g 60 -f flv rtmp://server/app/key
8
9# Webcam with microphone
10ffmpeg -f dshow -video_size 1280x720 -framerate 30 \
11 -i video="Integrated Camera":audio="Microphone" \
12 -c:v libx264 -preset veryfast -b:v 2000k \
13 -c:a aac -b:a 128k -f flv rtmp://server/app/key
macOS (AVFoundation)
1# List devices
2ffmpeg -f avfoundation -list_devices true -i ""
3
4# Stream from webcam
5ffmpeg -f avfoundation -framerate 30 -video_size 1280x720 -i "0:0" \
6 -c:v libx264 -preset veryfast -b:v 2000k -maxrate 2000k -bufsize 4000k \
7 -pix_fmt yuv420p -g 60 -f flv rtmp://server/app/key
8
9# Webcam with audio (device 0 = video, device 0 = audio)
10ffmpeg -f avfoundation -framerate 30 -video_size 1280x720 -i "0:0" \
11 -c:v libx264 -preset veryfast -b:v 2000k \
12 -c:a aac -b:a 128k -f flv rtmp://server/app/key
Screen Capture & Stream
Linux (X11)
1# Capture entire screen
2ffmpeg -f x11grab -framerate 30 -video_size 1920x1080 -i :0.0 \
3 -c:v libx264 -preset veryfast -b:v 3000k -maxrate 3000k -bufsize 6000k \
4 -pix_fmt yuv420p -g 60 -f flv rtmp://server/app/key
5
6# Capture specific window (get window ID with xwininfo)
7ffmpeg -f x11grab -framerate 30 -video_size 1280x720 -i :0.0+100,200 \
8 -c:v libx264 -preset veryfast -b:v 2000k -f flv rtmp://server/app/key
9
10# Screen with audio
11ffmpeg -f x11grab -framerate 30 -video_size 1920x1080 -i :0.0 \
12 -f pulse -i default -c:v libx264 -preset veryfast -b:v 3000k \
13 -c:a aac -b:a 128k -f flv rtmp://server/app/key
Windows (GDI)
1# Capture desktop
2ffmpeg -f gdigrab -framerate 30 -i desktop \
3 -c:v libx264 -preset veryfast -b:v 3000k -maxrate 3000k -bufsize 6000k \
4 -pix_fmt yuv420p -g 60 -f flv rtmp://server/app/key
5
6# Capture specific window
7ffmpeg -f gdigrab -framerate 30 -i title="Window Title" \
8 -c:v libx264 -preset veryfast -b:v 2000k -f flv rtmp://server/app/key
macOS (AVFoundation)
1# Capture screen (device 1 is usually screen capture)
2ffmpeg -f avfoundation -framerate 30 -i "1" \
3 -c:v libx264 -preset veryfast -b:v 3000k -maxrate 3000k -bufsize 6000k \
4 -pix_fmt yuv420p -g 60 -f flv rtmp://server/app/key
HLS Streaming (HTTP Live Streaming)
Generate HLS Stream
1# Basic HLS
2ffmpeg -re -i input.mp4 -c:v libx264 -c:a aac -f hls \
3 -hls_time 4 -hls_list_size 5 -hls_flags delete_segments \
4 output.m3u8
5
6# HLS with multiple quality levels (adaptive bitrate)
7ffmpeg -re -i input.mp4 \
8 -map 0:v -map 0:a -map 0:v -map 0:a -map 0:v -map 0:a \
9 -c:v libx264 -c:a aac \
10 -b:v:0 1000k -s:v:0 640x360 \
11 -b:v:1 2500k -s:v:1 1280x720 \
12 -b:v:2 5000k -s:v:2 1920x1080 \
13 -b:a:0 96k -b:a:1 128k -b:a:2 192k \
14 -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" \
15 -master_pl_name master.m3u8 \
16 -f hls -hls_time 6 -hls_list_size 10 \
17 -hls_segment_filename "stream_%v/data%03d.ts" \
18 stream_%v/index.m3u8
19
20# HLS from webcam (Linux)
21ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video0 \
22 -c:v libx264 -preset veryfast -b:v 2000k -c:a aac -b:a 128k \
23 -f hls -hls_time 4 -hls_list_size 5 output.m3u8
HLS Parameters:
-hls_time: Segment duration in seconds-hls_list_size: Number of segments in playlist-hls_flags delete_segments: Delete old segments-hls_segment_filename: Pattern for segment files
DASH Streaming
1# Generate DASH stream
2ffmpeg -re -i input.mp4 -c:v libx264 -c:a aac \
3 -f dash -seg_duration 4 -use_template 1 -use_timeline 1 \
4 output.mpd
5
6# DASH with multiple bitrates
7ffmpeg -re -i input.mp4 \
8 -map 0:v -map 0:a -map 0:v -map 0:a \
9 -c:v libx264 -c:a aac \
10 -b:v:0 1000k -s:v:0 640x360 \
11 -b:v:1 2500k -s:v:1 1280x720 \
12 -b:a:0 96k -b:a:1 128k \
13 -f dash -seg_duration 4 -use_template 1 -use_timeline 1 \
14 -adaptation_sets "id=0,streams=v id=1,streams=a" \
15 output.mpd
UDP/RTP Streaming
1# Stream to UDP
2ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 2000k \
3 -c:a aac -b:a 128k -f mpegts udp://192.168.1.100:1234
4
5# Stream with SDP file (for VLC playback)
6ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 2000k \
7 -c:a aac -b:a 128k -f rtp rtp://192.168.1.100:1234 \
8 -sdp_file stream.sdp
9
10# Multicast streaming
11ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 2000k \
12 -c:a aac -b:a 128k -f mpegts udp://239.255.0.1:1234?ttl=1
RTSP Server
1# Stream to RTSP (requires RTSP server like MediaMTX/rtsp-simple-server)
2ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 2000k \
3 -c:a aac -b:a 128k -f rtsp rtsp://localhost:8554/mystream
4
5# From webcam to RTSP
6ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video0 \
7 -c:v libx264 -preset veryfast -b:v 2000k -c:a aac -b:a 128k \
8 -f rtsp rtsp://localhost:8554/webcam
IP Camera Streaming
Receive from IP Camera (RTSP)
1# View RTSP stream
2ffplay rtsp://username:password@192.168.1.100:554/stream
3
4# Re-stream IP camera to RTMP
5ffmpeg -rtsp_transport tcp -i rtsp://username:password@192.168.1.100:554/stream \
6 -c:v copy -c:a copy -f flv rtmp://server/app/key
7
8# Re-stream with transcoding
9ffmpeg -rtsp_transport tcp -i rtsp://username:password@192.168.1.100:554/stream \
10 -c:v libx264 -preset veryfast -b:v 2000k -c:a aac -b:a 128k \
11 -f flv rtmp://server/app/key
Low-Latency Streaming
SRT (Secure Reliable Transport)
1# SRT server (listener)
2ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -tune zerolatency \
3 -b:v 2000k -c:a aac -b:a 128k -f mpegts srt://0.0.0.0:9000?mode=listener
4
5# SRT client (caller)
6ffmpeg -i srt://192.168.1.100:9000?mode=caller -c copy output.mp4
7
8# Webcam to SRT
9ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video0 \
10 -c:v libx264 -preset veryfast -tune zerolatency -b:v 2000k \
11 -c:a aac -b:a 128k -f mpegts srt://0.0.0.0:9000?mode=listener
Platform-Specific Recommendations
Twitch
1ffmpeg -re -i input.mp4 \
2 -c:v libx264 -preset veryfast -b:v 3000k -maxrate 3000k -bufsize 6000k \
3 -pix_fmt yuv420p -g 50 -r 30 \
4 -c:a aac -b:a 160k -ar 44100 \
5 -f flv rtmp://live.twitch.tv/app/YOUR_STREAM_KEY
Twitch Recommendations:
- Bitrate: 3000-6000 kbps
- Resolution: 1920x1080 or 1280x720
- Frame rate: 30 or 60 fps
- Keyframe interval: 2 seconds
YouTube Live
1ffmpeg -re -i input.mp4 \
2 -c:v libx264 -preset veryfast -b:v 2500k -maxrate 2500k -bufsize 5000k \
3 -pix_fmt yuv420p -g 60 -r 30 \
4 -c:a aac -b:a 128k -ar 44100 \
5 -f flv rtmp://a.rtmp.youtube.com/live2/YOUR_STREAM_KEY
YouTube Recommendations:
- Bitrate: 2500-4500 kbps (1080p30)
- Resolution: 1920x1080
- Frame rate: 30 fps
- Keyframe interval: 2 seconds
Facebook Live
1ffmpeg -re -i input.mp4 \
2 -c:v libx264 -preset veryfast -b:v 4000k -maxrate 4000k -bufsize 8000k \
3 -pix_fmt yuv420p -g 60 -r 30 \
4 -c:a aac -b:a 128k -ar 44100 \
5 -f flv rtmps://live-api-s.facebook.com:443/rtmp/YOUR_STREAM_KEY
Monitoring & Testing
Test Stream Locally
1# Start local RTMP server (using nginx-rtmp or similar)
2# Then stream to it
3ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 2000k \
4 -c:a aac -b:a 128k -f flv rtmp://localhost/live/test
5
6# Play with ffplay
7ffplay rtmp://localhost/live/test
8
9# Play with VLC
10vlc rtmp://localhost/live/test
Stream Health Check
1# Show stream statistics
2ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 2000k \
3 -c:a aac -b:a 128k -f flv rtmp://server/app/key \
4 -progress pipe:1 -v verbose
Quick Reference
| Task | Command |
|---|---|
| Stream file to RTMP | ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 2500k -c:a aac -f flv rtmp://server/app/key |
| Webcam to RTMP (Linux) | ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 -preset veryfast -b:v 2000k -c:a aac -f flv rtmp://server/app/key |
| Screen capture (Linux) | ffmpeg -f x11grab -i :0.0 -c:v libx264 -preset veryfast -b:v 3000k -f flv rtmp://server/app/key |
| Generate HLS | ffmpeg -re -i input.mp4 -c:v libx264 -c:a aac -f hls -hls_time 4 output.m3u8 |
| UDP stream | ffmpeg -re -i input.mp4 -c:v libx264 -b:v 2000k -f mpegts udp://192.168.1.100:1234 |
| Loop video | ffmpeg -re -stream_loop -1 -i input.mp4 -c:v libx264 -f flv rtmp://server/app/key |
Tips
- Use
-refor real-time streaming (matches input frame rate) - Use
-preset veryfastor-preset ultrafastfor live encoding - Use
-tune zerolatencyfor minimal latency - Set
-g(GOP size) to 2x frame rate for 2-second keyframe interval - Use
-maxrateand-bufsizefor stable bitrate - Test locally before streaming to production
- Monitor CPU usage - hardware encoding helps for high resolutions
Related Snippets
- FFmpeg Stream Extraction & Merging
Extract and merge audio, video, and subtitle streams - FFmpeg Video Conversion
Format conversion, codecs, and quality settings - FFmpeg Video Editing
Cutting, trimming, concatenating, and basic editing