乐闻世界logo
搜索文章和话题

How to use FFmpeg for RTMP streaming and HLS/DASH streaming media generation?

2月18日 11:05

FFmpeg is an important tool for streaming media processing, supporting various streaming protocols such as RTMP, HLS, and DASH.

Push to RTMP Server

Basic Push Command

bash
# Push local file to RTMP server ffmpeg -re -i input.mp4 -c copy -f flv rtmp://server/live/stream_key # Real-time encoding push ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 1500k -c:a aac -b:a 128k -f flv rtmp://server/live/stream_key

Camera/Microphone Real-time Push

bash
# macOS camera push ffmpeg -f avfoundation -i "0" -c:v libx264 -preset veryfast -b:v 1500k -f flv rtmp://server/live/stream_key # Camera + microphone push ffmpeg -f avfoundation -i "0:0" -c:v libx264 -preset veryfast -b:v 1500k -c:a aac -b:a 128k -f flv rtmp://server/live/stream_key

HLS Streaming Generation

Generate HLS Stream

bash
# Generate HLS playlist ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f hls -hls_time 10 -hls_list_size 0 output.m3u8 # Generate multi-bitrate HLS ffmpeg -i input.mp4 \ -vf scale=1920:1080 -c:v libx264 -b:v 5000k -f hls -hls_time 10 hls_1080p.m3u8 \ -vf scale=1280:720 -c:v libx264 -b:v 2500k -f hls -hls_time 10 hls_720p.m3u8 \ -vf scale=854:480 -c:v libx264 -b:v 1000k -f hls -hls_time 10 hls_480p.m3u8

HLS Parameters

  • -hls_time: Duration of each segment (seconds)
  • -hls_list_size: Number of segments to keep in playlist (0 means keep all)
  • -hls_segment_filename: Segment file naming template
  • -hls_flags: HLS special flags (e.g., delete_segments, append_list)

DASH Streaming Generation

Generate DASH Stream

bash
# Generate DASH manifest ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f dash -seg_duration 10 output.mpd # Generate multi-bitrate DASH ffmpeg -i input.mp4 \ -vf scale=1920:1080 -c:v libx264 -b:v 5000k -f dash -seg_duration 10 dash_1080p.mpd \ -vf scale=1280:720 -c:v libx264 -b:v 2500k -f dash -seg_duration 10 dash_720p.mpd

Pull Stream Processing

Pull from RTMP

bash
# Pull RTMP stream and save ffmpeg -i rtmp://server/live/stream -c copy output.mp4 # Pull RTMP stream and transcode ffmpeg -i rtmp://server/live/stream -c:v libx264 -preset fast -b:v 1500k -c:a aac -b:a 128k output.mp4

Pull from HLS

bash
# Download HLS stream ffmpeg -i http://server/live/stream.m3u8 -c copy output.mp4 # Play HLS stream in real-time ffmpeg -i http://server/live/stream.m3u8 -f null -

Streaming Optimization

Latency Optimization

bash
# Low latency push ffmpeg -re -i input.mp4 -c:v libx264 -preset ultrafast -tune zerolatency -b:v 1500k -c:a aac -b:a 128k -f flv rtmp://server/live/stream_key # Use GOP cache ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -g 25 -keyint_min 25 -b:v 1500k -c:a aac -b:a 128k -f flv rtmp://server/live/stream_key

Bitrate Control

bash
# CBR (Constant Bitrate) ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 1500k -maxrate 1500k -minrate 1500k -bufsize 3000k -f flv rtmp://server/live/stream_key # VBR (Variable Bitrate) ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -crf 23 -maxrate 3000k -bufsize 6000k -f flv rtmp://server/live/stream_key

Common Streaming Protocols

ProtocolUseFeatures
RTMPReal-time pushLow latency, widely used for live streaming
HLSHTTP Live StreamingGood compatibility, supports adaptive bitrate
DASHHTTP Live StreamingOpen standard, cross-platform support
RTSPReal-time Streaming ProtocolUsed for surveillance and IPC
UDP/RTPReal-time TransportLow latency, suitable for LAN

When processing streaming media, you need to select appropriate protocols and encoding parameters based on network conditions, latency requirements, and target platforms.

标签:FFmpeg