Tutorials
FFmpeg Streaming

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 ffmpeg

Ubuntu/Debian:

sudo apt update && sudo apt install ffmpeg

Windows: 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/aAXevUYwfj9K

Step 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

ParameterDescription
-reRead input at native frame rate (real-time)
-i example.mp4Input video file
-c:v libx264Video codec: H.264
-preset veryfastEncoding speed preset
-b:v 2000kVideo bitrate: 2000 kbps
-c:a aacAudio codec: AAC
-b:a 128kAudio bitrate: 128 kbps
-f flvOutput 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 medium or slow)
  • 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"