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

TaskCommand
Stream file to RTMPffmpeg -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 HLSffmpeg -re -i input.mp4 -c:v libx264 -c:a aac -f hls -hls_time 4 output.m3u8
UDP streamffmpeg -re -i input.mp4 -c:v libx264 -b:v 2000k -f mpegts udp://192.168.1.100:1234
Loop videoffmpeg -re -stream_loop -1 -i input.mp4 -c:v libx264 -f flv rtmp://server/app/key

Tips

  • Use -re for real-time streaming (matches input frame rate)
  • Use -preset veryfast or -preset ultrafast for live encoding
  • Use -tune zerolatency for minimal latency
  • Set -g (GOP size) to 2x frame rate for 2-second keyframe interval
  • Use -maxrate and -bufsize for stable bitrate
  • Test locally before streaming to production
  • Monitor CPU usage - hardware encoding helps for high resolutions

Related Snippets