FFmpeg Streaming Tutorial
Learn how to stream video to your ingress endpoint using FFmpeg.
Prerequisites
- FFmpeg installed on your system
- An API key for the Ingress API
- A video file (MP4, MKV, etc.) or camera
Install FFmpeg
macOS:
brew install ffmpegUbuntu/Debian:
sudo apt update && sudo apt install ffmpegWindows: Download from ffmpeg.org (opens in a new tab)
Step 1: Create an Ingress
First, generate an ingress endpoint:
curl -X POST https://live-api.block8910.com/api/ingress/generate \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"roomName": "my-stream",
"participantName": "FFmpeg Stream"
}'Save the rtmpUrl from the response. It will look like:
rtmp://rtmp.block8910.com:1935/x/aAXevUYwfj9KStep 2: Stream a Video File
Basic Streaming
Stream a video file with re-encoding:
ffmpeg -re -i example.mp4 \
-c:v libx264 -preset veryfast -b:v 2000k \
-c:a aac -b:a 128k \
-f flv "rtmp://rtmp.block8910.com:1935/x/aAXevUYwfj9K"Explanation of Parameters
| Parameter | Description |
|---|---|
-re | Read input at native frame rate (real-time) |
-i example.mp4 | Input video file |
-c:v libx264 | Video codec: H.264 |
-preset veryfast | Encoding speed preset |
-b:v 2000k | Video bitrate: 2000 kbps |
-c:a aac | Audio codec: AAC |
-b:a 128k | Audio bitrate: 128 kbps |
-f flv | Output format: FLV (required for RTMP) |
Step 3: Advanced Options
High Quality 1080p
ffmpeg -re -i example.mp4 \
-c:v libx264 -preset medium -b:v 4500k \
-maxrate 4500k -bufsize 9000k \
-vf "scale=1920:1080" \
-c:a aac -b:a 192k \
-f flv "rtmp://rtmp.block8910.com:1935/x/YOUR_STREAM_KEY"720p for Lower Bandwidth
ffmpeg -re -i example.mp4 \
-c:v libx264 -preset veryfast -b:v 2500k \
-maxrate 2500k -bufsize 5000k \
-vf "scale=1280:720" \
-c:a aac -b:a 128k \
-f flv "rtmp://rtmp.block8910.com:1935/x/YOUR_STREAM_KEY"Loop a Video
Stream a video in a loop:
ffmpeg -stream_loop -1 -re -i example.mp4 \
-c:v libx264 -preset veryfast -b:v 2000k \
-c:a aac -b:a 128k \
-f flv "rtmp://rtmp.block8910.com:1935/x/YOUR_STREAM_KEY"Step 4: Stream from Camera
macOS (FaceTime Camera)
ffmpeg -f avfoundation -framerate 30 -i "0:0" \
-c:v libx264 -preset veryfast -b:v 2000k \
-c:a aac -b:a 128k \
-f flv "rtmp://rtmp.block8910.com:1935/x/YOUR_STREAM_KEY"List available devices:
ffmpeg -f avfoundation -list_devices true -i ""Linux (Webcam)
ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video0 \
-f alsa -i default \
-c:v libx264 -preset veryfast -b:v 2000k \
-c:a aac -b:a 128k \
-f flv "rtmp://rtmp.block8910.com:1935/x/YOUR_STREAM_KEY"Windows (DirectShow)
ffmpeg -f dshow -i video="Your Webcam Name":audio="Your Microphone" \
-c:v libx264 -preset veryfast -b:v 2000k \
-c:a aac -b:a 128k \
-f flv "rtmp://rtmp.block8910.com:1935/x/YOUR_STREAM_KEY"Step 5: Verify Your Stream
Check if the ingress is active:
curl -X GET https://live-api.block8910.com/api/ingress \
-H "x-api-key: YOUR_API_KEY"Look for "status": "ENDPOINT_PUBLISHING" to confirm the stream is live.
Troubleshooting
Stream Disconnects Immediately
- Check if the stream key is correct
- Ensure the ingress hasn't been deleted
- Verify network connectivity to
rtmp://rtmp.block8910.com:1935
Poor Video Quality
- Increase the video bitrate (
-b:v) - Use a slower preset (
-preset mediumorslow) - Check your upload bandwidth
Audio Out of Sync
Add audio sync correction:
ffmpeg -re -i example.mp4 \
-c:v libx264 -preset veryfast -b:v 2000k \
-c:a aac -b:a 128k \
-async 1 -vsync cfr \
-f flv "rtmp://rtmp.block8910.com:1935/x/YOUR_STREAM_KEY"Complete Example
Here's a full example workflow:
# 1. Generate ingress
RESPONSE=$(curl -s -X POST https://live-api.block8910.com/api/ingress/generate \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{"roomName": "test-stream", "participantName": "FFmpeg Test"}')
# 2. Extract RTMP URL (requires jq)
RTMP_URL=$(echo $RESPONSE | jq -r '.data.rtmpUrl')
echo "Streaming to: $RTMP_URL"
# 3. Start streaming
ffmpeg -re -i example.mp4 \
-c:v libx264 -preset veryfast -b:v 2000k \
-c:a aac -b:a 128k \
-f flv "$RTMP_URL"