强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

FFmpeg 多媒体处理教程 / 直播应用

直播应用

概述

直播(Live Streaming)是 FFmpeg 的重要应用场景之一。本章介绍如何使用 FFmpeg 构建直播系统,包括推流、多平台分发、实时转码、录制与回放等功能。

直播架构

基本直播架构

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│   采集端    │───►│   转码服务器  │───►│   CDN/平台   │
│ (OBS/FFmpeg)│    │   (FFmpeg)   │    │ (B站/抖音等) │
└─────────────┘    └─────────────┘    └─────────────┘
                          │
                          ▼
                   ┌─────────────┐
                   │   录制存储   │
                   │  (本地/云)   │
                   └─────────────┘

多平台分发架构

┌─────────────┐    ┌─────────────┐    ┌─────────┐
│   采集端    │───►│   转码服务器  │───►│  B站    │
└─────────────┘    │   (FFmpeg)   │    ├─────────┤
                   │              │───►│  抖音   │
                   │              │    ├─────────┤
                   │              │───►│  YouTube│
                   │              │    ├─────────┤
                   │              │───►│  Twitch │
                   └─────────────┘    └─────────┘

基本推流

使用 FFmpeg 推流

# 基本推流命令
ffmpeg -re -i input.mp4 \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -c:a aac -b:a 128k \
    -f flv rtmp://server/live/stream_key

推流参数详解

参数说明推荐值
-re按原始帧率读取必需
-preset编码预设fast/ultrafast
-tune调优参数zerolatency
-b:v视频码率2-6M
-maxrate最大码率与 b:v 相同
-bufsize缓冲区大小2× maxrate
-gGOP 大小30-60
-bfB 帧数量0-2

低延迟推流

# 超低延迟推流
ffmpeg -re -i input.mp4 \
    -c:v libx264 -preset ultrafast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -g 30 -bf 0 \
    -c:a aac -b:a 128k \
    -f flv rtmp://server/live/stream_key

硬件加速推流

# NVIDIA GPU 推流
ffmpeg -re -i input.mp4 \
    -c:v h264_nvenc -preset p1 -tune ll \
    -rc cbr -b:v 3M -bufsize 6M \
    -c:a aac -b:a 128k \
    -f flv rtmp://server/live/stream_key

# Intel QSV 推流
ffmpeg -re -i input.mp4 \
    -c:v h264_qsv -preset veryfast \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -c:a aac -b:a 128k \
    -f flv rtmp://server/live/stream_key

多平台推流

同时推流到多个平台

# 使用 tee 多路输出
ffmpeg -re -i input.mp4 \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -c:a aac -b:a 128k \
    -f tee \
    "[f=flv]rtmp://live.bilibili.com/stream1|[f=flv]rtmp://live.twitch.tv/app/key2|[f=flv]rtmp://a.rtmp.youtube.com/live2/key3"
#!/bin/bash
# multi_platform_push.sh

INPUT=$1
BILIBILI_KEY=$2
TWITCH_KEY=$3
YOUTUBE_KEY=$4

ffmpeg -re -i "$INPUT" \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -c:a aac -b:a 128k \
    -f tee \
    "[f=flv]rtmp://live-push.bilivideo.com/live-bvc/?streamname=$BILIBILI_KEY|\
[f=flv]rtmp://live-jfk.twitch.tv/app/$TWITCH_KEY|\
[f=flv]rtmp://a.rtmp.youtube.com/live2/$YOUTUBE_KEY"

不同码率推流

# 为不同平台推不同码率
ffmpeg -re -i input.mp4 \
    -map 0:v -map 0:a -map 0:v -map 0:a -map 0:v -map 0:a \
    -c:v libx264 -preset fast -tune zerolatency \
    -c:a aac \
    -b:v:0 6M -maxrate:v:0 6M -s:v:0 1920x1080 \
    -b:v:1 3M -maxrate:v:1 3M -s:v:1 1280x720 \
    -b:v:2 1M -maxrate:v:2 1M -s:v:2 640x360 \
    -f tee \
    "[f=flv:onfail=ignore]rtmp://server1/live/stream_1080p|\
[f=flv:onfail=ignore]rtmp://server2/live/stream_720p|\
[f=flv:onfail=ignore]rtmp://server3/live/stream_360p"

采集与推流

摄像头采集推流

# Linux V4L2 采集
ffmpeg -f v4l2 -video_size 1920x1080 -framerate 30 -i /dev/video0 \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -f flv rtmp://server/live/stream

# macOS AVFoundation 采集
ffmpeg -f avfoundation -video_size 1920x1080 -framerate 30 -i "0" \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -f flv rtmp://server/live/stream

# Windows DirectShow 采集
ffmpeg -f dshow -video_size 1920x1080 -framerate 30 -i video="摄像头名称" \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -f flv rtmp://server/live/stream

屏幕采集推流

# Linux X11 采集
ffmpeg -f x11grab -video_size 1920x1080 -framerate 30 -i :0.0 \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -f flv rtmp://server/live/stream

# macOS 屏幕采集
ffmpeg -f avfoundation -framerate 30 -i "1" \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -f flv rtmp://server/live/stream

# Windows 屏幕采集
ffmpeg -f gdigrab -framerate 30 -i desktop \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -f flv rtmp://server/live/stream

音频采集推流

# ALSA 音频采集(Linux)
ffmpeg -f alsa -i hw:0 \
    -c:a aac -b:a 128k \
    -f flv rtmp://server/live/stream

# PulseAudio 采集(Linux)
ffmpeg -f pulse -i default \
    -c:a aac -b:a 128k \
    -f flv rtmp://server/live/stream

# CoreAudio 采集(macOS)
ffmpeg -f avfoundation -i ":0" \
    -c:a aac -b:a 128k \
    -f flv rtmp://server/live/stream

摄像头 + 麦克风推流

# Linux
ffmpeg -f v4l2 -video_size 1920x1080 -framerate 30 -i /dev/video0 \
       -f alsa -i hw:0 \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -c:a aac -b:a 128k \
    -f flv rtmp://server/live/stream

# macOS
ffmpeg -f avfoundation -video_size 1920x1080 -framerate 30 -i "0" \
       -f avfoundation -i ":0" \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -c:a aac -b:a 128k \
    -f flv rtmp://server/live/stream

直播转码

实时转码推流

# 从 RTSP 源转码推流
ffmpeg -rtsp_transport tcp -i rtsp://camera_ip:554/stream \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 2M -maxrate 2M -bufsize 4M \
    -c:a aac -b:a 128k \
    -f flv rtmp://server/live/stream

# 从 RTMP 源转码推流
ffmpeg -i rtmp://source/live/stream \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 2M -maxrate 2M -bufsize 4M \
    -c:a aac -b:a 128k \
    -f flv rtmp://target/live/stream

多码率转码

# 单输入多码率输出
ffmpeg -re -i input.mp4 \
    -map 0:v -map 0:a -map 0:v -map 0:a -map 0:v -map 0:a \
    -c:v libx264 -preset fast -tune zerolatency \
    -c:a aac \
    -b:v:0 6M -maxrate:v:0 6M -s:v:0 1920x1080 \
    -b:v:1 3M -maxrate:v:1 3M -s:v:1 1280x720 \
    -b:v:2 1M -maxrate:v:2 1M -s:v:2 640x360 \
    -f tee \
    "[f=flv]rtmp://server/live/1080p|[f=flv]rtmp://server/live/720p|[f=flv]rtmp://server/live/360p"

直播录制

边直播边录制

# 推流同时录制
ffmpeg -re -i input.mp4 \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -c:a aac -b:a 128k \
    -f tee \
    "[f=flv]rtmp://server/live/stream|[f=mp4]recording.mp4"

分段录制

# 每小时分段录制
ffmpeg -re -i rtmp://server/live/stream \
    -c copy \
    -f segment \
    -segment_time 3600 \
    -segment_format mp4 \
    -strftime 1 \
    "recording_%Y%m%d_%H%M%S.mp4"

带时间戳的录制

# 添加时间戳水印
ffmpeg -re -i rtmp://server/live/stream \
    -vf "drawtext=text='%{localtime\:%Y-%m-%d %H\\\:%M\\\:%S}':x=10:y=10:fontsize=24:fontcolor=white:box=1:[email protected]" \
    -c:v libx264 -crf 23 \
    -c:a copy \
    recording.mp4

直播拉流

从各种源拉流

# 从 RTMP 拉流
ffmpeg -i rtmp://server/live/stream output.mp4

# 从 RTSP 拉流
ffmpeg -rtsp_transport tcp -i rtsp://camera_ip:554/stream output.mp4

# 从 HLS 拉流
ffmpeg -i https://example.com/live/playlist.m3u8 output.mp4

# 从 SRT 拉流
ffmpeg -i srt://server:9000?streamid=live/stream output.mp4

拉流并转码

# 拉流转码后推流
ffmpeg -i rtmp://source/live/stream \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 2M -maxrate 2M -bufsize 4M \
    -c:a aac -b:a 128k \
    -f flv rtmp://target/live/stream

# 拉流添加水印后推流
ffmpeg -i rtmp://source/live/stream -i watermark.png \
    -filter_complex "[0:v][1:v]overlay=W-w-10:H-h-10[v]" \
    -map "[v]" -map 0:a \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 2M -maxrate 2M -bufsize 4M \
    -c:a aac -b:a 128k \
    -f flv rtmp://target/live/stream

HLS 直播

生成 HLS 直播流

# 基本 HLS 直播
ffmpeg -re -i input.mp4 \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -c:a aac -b:a 128k \
    -f hls \
    -hls_time 4 \
    -hls_list_size 10 \
    -hls_flags delete_segments \
    -hls_segment_filename "segment_%03d.ts" \
    live/playlist.m3u8

HLS 参数详解

参数说明推荐值
-hls_time分片时长2-6 秒
-hls_list_size播放列表大小5-10
-hls_flagsHLS 选项delete_segments
-hls_segment_filename分片文件名模板segment_%03d.ts
-hls_wrap分片序号回绕不推荐

HLS 直播脚本

#!/bin/bash
# hls_live.sh

INPUT=$1
OUTPUT_DIR=${2:-live}
SEGMENT_TIME=${3:-4}
LIST_SIZE=${4:-10}

mkdir -p "$OUTPUT_DIR"

ffmpeg -re -i "$INPUT" \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -c:a aac -b:a 128k \
    -f hls \
    -hls_time "$SEGMENT_TIME" \
    -hls_list_size "$LIST_SIZE" \
    -hls_flags delete_segments \
    -hls_segment_filename "$OUTPUT_DIR/segment_%03d.ts" \
    "$OUTPUT_DIR/playlist.m3u8"

自适应码率 HLS

#!/bin/bash
# hls_adaptive_live.sh

INPUT=$1
OUTPUT_DIR=${2:-live}

mkdir -p "$OUTPUT_DIR"

ffmpeg -re -i "$INPUT" \
    -map 0:v -map 0:a -map 0:v -map 0:a -map 0:v -map 0:a \
    -c:v libx264 -preset fast -tune zerolatency \
    -c:a aac \
    -b:v:0 6M -maxrate:v:0 6M -s:v:0 1920x1080 \
    -b:v:1 3M -maxrate:v:1 3M -s:v:1 1280x720 \
    -b:v:2 1M -maxrate:v:2 1M -s:v:2 640x360 \
    -f hls \
    -hls_time 4 \
    -hls_list_size 10 \
    -hls_flags delete_segments \
    -var_stream_map "v:0,a:0,name:1080p v:1,a:1,name:720p v:2,a:2,name:360p" \
    -master_pl_name "$OUTPUT_DIR/master.m3u8" \
    -hls_segment_filename "$OUTPUT_DIR/stream_%v/segment_%03d.ts" \
    "$OUTPUT_DIR/stream_%v/playlist.m3u8"

DASH 直播

生成 DASH 直播流

# 基本 DASH 直播
ffmpeg -re -i input.mp4 \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -c:a aac -b:a 128k \
    -f dash \
    -seg_duration 4 \
    -window_size 10 \
    -extra_window_size 20 \
    -remove_at_exit 1 \
    live/manifest.mpd

DASH 直播脚本

#!/bin/bash
# dash_live.sh

INPUT=$1
OUTPUT_DIR=${2:-live}
SEGMENT_TIME=${3:-4}

mkdir -p "$OUTPUT_DIR"

ffmpeg -re -i "$INPUT" \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -c:a aac -b:a 128k \
    -f dash \
    -seg_duration "$SEGMENT_TIME" \
    -window_size 10 \
    -extra_window_size 20 \
    -remove_at_exit 1 \
    "$OUTPUT_DIR/manifest.mpd"

直播监控

流健康检查

#!/bin/bash
# stream_health_check.sh

STREAM_URL=$1
LOG_FILE=${2:-health.log}

while true; do
    # 检查流是否可访问
    if ffprobe -v quiet -show_entries format=duration "$STREAM_URL" > /dev/null 2>&1; then
        echo "$(date): 流正常" >> "$LOG_FILE"
    else
        echo "$(date): 流异常" >> "$LOG_FILE"
        # 可以在这里添加告警逻辑
    fi
    
    sleep 30
done

流信息监控

#!/bin/bash
# stream_monitor.sh

STREAM_URL=$1

# 获取流信息
while true; do
    clear
    echo "=== 流监控 - $(date) ==="
    echo ""
    
    # 获取流信息
    INFO=$(ffprobe -v quiet -print_format json -show_streams "$STREAM_URL" 2>/dev/null)
    
    if [ $? -eq 0 ]; then
        VIDEO_CODEC=$(echo "$INFO" | jq -r '.streams[] | select(.codec_type=="video") | .codec_name')
        VIDEO_WIDTH=$(echo "$INFO" | jq -r '.streams[] | select(.codec_type=="video") | .width')
        VIDEO_HEIGHT=$(echo "$INFO" | jq -r '.streams[] | select(.codec_type=="video") | .height')
        VIDEO_FPS=$(echo "$INFO" | jq -r '.streams[] | select(.codec_type=="video") | .r_frame_rate')
        AUDIO_CODEC=$(echo "$INFO" | jq -r '.streams[] | select(.codec_type=="audio") | .codec_name')
        
        echo "视频: $VIDEO_CODEC ${VIDEO_WIDTH}x${VIDEO_HEIGHT} @ ${VIDEO_FPS}fps"
        echo "音频: $AUDIO_CODEC"
        echo "状态: 正常"
    else
        echo "状态: 无法连接"
    fi
    
    sleep 5
done

直播回放

直播转点播

#!/bin/bash
# live_to_vod.sh

LIVE_URL=$1
OUTPUT=$2
DURATION=${3:-3600}  # 1 小时

# 录制直播流
timeout "$DURATION" ffmpeg -i "$LIVE_URL" \
    -c copy \
    "$OUTPUT" 2>/dev/null

# 添加快速启动
ffmpeg -i "$OUTPUT" -c copy -movflags +faststart "${OUTPUT%.mp4}_vod.mp4"

rm -f "$OUTPUT"
echo "点播文件生成: ${OUTPUT%.mp4}_vod.mp4"

直播切片

#!/bin/bash
# live_slicing.sh

LIVE_URL=$1
OUTPUT_DIR=${2:-slices}
SLICE_DURATION=${3:-300}  # 5 分钟

mkdir -p "$OUTPUT_DIR"

ffmpeg -i "$LIVE_URL" \
    -c copy \
    -f segment \
    -segment_time "$SLICE_DURATION" \
    -segment_format mp4 \
    -strftime 1 \
    "$OUTPUT_DIR/slice_%Y%m%d_%H%M%S.mp4"

直播特效

添加水印

# 直播添加水印
ffmpeg -re -i input.mp4 -i watermark.png \
    -filter_complex "[0:v][1:v]overlay=W-w-10:H-h-10[v]" \
    -map "[v]" -map 0:a \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -c:a aac -b:a 128k \
    -f flv rtmp://server/live/stream

添加文字

# 直播添加文字
ffmpeg -re -i input.mp4 \
    -vf "drawtext=text='LIVE':x=10:y=10:fontsize=48:fontcolor=red:box=1:[email protected]" \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -c:a aac -b:a 128k \
    -f flv rtmp://server/live/stream

添加时间戳

# 直播添加时间戳
ffmpeg -re -i input.mp4 \
    -vf "drawtext=text='%{localtime\:%Y-%m-%d %H\\\:%M\\\:%S}':x=10:y=10:fontsize=24:fontcolor=white:box=1:[email protected]" \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -c:a aac -b:a 128k \
    -f flv rtmp://server/live/stream

平台特定配置

Bilibili 推流

# Bilibili 推流配置
ffmpeg -re -i input.mp4 \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -g 60 \
    -c:a aac -b:a 128k \
    -f flv rtmp://live-push.bilivideo.com/live-bvc/?streamname=YOUR_STREAM_KEY

YouTube 推流

# YouTube 推流配置
ffmpeg -re -i input.mp4 \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 4M -maxrate 4M -bufsize 8M \
    -g 60 \
    -c:a aac -b:a 128k \
    -f flv rtmp://a.rtmp.youtube.com/live2/YOUR_STREAM_KEY

Twitch 推流

# Twitch 推流配置
ffmpeg -re -i input.mp4 \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -g 60 \
    -c:a aac -b:a 128k \
    -f flv rtmp://live-jfk.twitch.tv/app/YOUR_STREAM_KEY

抖音推流

# 抖音推流配置
ffmpeg -re -i input.mp4 \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -g 30 \
    -c:a aac -b:a 128k \
    -f flv rtmp://push.douyin.com/live/YOUR_STREAM_KEY

直播脚本模板

完整直播脚本

#!/bin/bash
# live_stream.sh

# 配置
INPUT=${1:-input.mp4}
RTMP_URL=${2:-rtmp://server/live/stream}
BITRATE=${3:-3M}
PRESET=${4:-fast}

# 计算缓冲区大小
BITRATE_NUM=${BITRATE%M}
BUF_SIZE=$((BITRATE_NUM * 2))M

echo "=== 直播推流 ==="
echo "输入: $INPUT"
echo "推流地址: $RTMP_URL"
echo "码率: $BITRATE"
echo "预设: $PRESET"
echo "================"

# 推流
ffmpeg -re -i "$INPUT" \
    -c:v libx264 -preset "$PRESET" -tune zerolatency \
    -b:v "$BITRATE" -maxrate "$BITRATE" -bufsize "$BUF_SIZE" \
    -g 60 -bf 0 \
    -c:a aac -b:a 128k \
    -f flv "$RTMP_URL"

多平台推流脚本

#!/bin/bash
# multi_platform_live.sh

INPUT=${1:-input.mp4}
BILIBILI_KEY=${2:-}
TWITCH_KEY=${3:-}
YOUTUBE_KEY=${4:-}

# 构建 tee 输出
TEE_OUTPUT=""

if [ -n "$BILIBILI_KEY" ]; then
    TEE_OUTPUT="${TEE_OUTPUT}[f=flv:onfail=ignore]rtmp://live-push.bilivideo.com/live-bvc/?streamname=${BILIBILI_KEY}|"
fi

if [ -n "$TWITCH_KEY" ]; then
    TEE_OUTPUT="${TEE_OUTPUT}[f=flv:onfail=ignore]rtmp://live-jfk.twitch.tv/app/${TWITCH_KEY}|"
fi

if [ -n "$YOUTUBE_KEY" ]; then
    TEE_OUTPUT="${TEE_OUTPUT}[f=flv:onfail=ignore]rtmp://a.rtmp.youtube.com/live2/${YOUTUBE_KEY}|"
fi

# 移除最后的 |
TEE_OUTPUT="${TEE_OUTPUT%|}"

echo "推流到多个平台..."
ffmpeg -re -i "$INPUT" \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 3M -maxrate 3M -bufsize 6M \
    -c:a aac -b:a 128k \
    -f tee "$TEE_OUTPUT"

直播录制回放脚本

#!/bin/bash
# live_record_replay.sh

RTMP_URL=$1
OUTPUT_DIR=${2:-recordings}
SEGMENT_TIME=${3:-3600}

mkdir -p "$OUTPUT_DIR"

echo "开始录制直播流..."
ffmpeg -i "$RTMP_URL" \
    -c copy \
    -f segment \
    -segment_time "$SEGMENT_TIME" \
    -segment_format mp4 \
    -strftime 1 \
    "$OUTPUT_DIR/live_%Y%m%d_%H%M%S.mp4"

注意事项

  1. 网络带宽:确保上行带宽足够,建议至少为目标码率的 1.5 倍
  2. 编码延迟:使用 -preset ultrafast -tune zerolatency 降低延迟
  3. 缓冲区设置-bufsize 通常设为 -maxrate 的 2 倍
  4. GOP 大小:直播建议 GOP 设为帧率的 2 倍
  5. 错误处理:添加重连机制处理网络中断

业务场景

场景 1:电商直播

# 电商直播配置
ffmpeg -re -i camera.mp4 -i product.png \
    -filter_complex \
    "[0:v][1:v]overlay=W-w-20:20[v]; \
     [v]drawtext=text='限时特惠':x=10:y=H-50:fontsize=36:fontcolor=red:box=1:[email protected][outv]" \
    -map "[outv]" -map 0:a \
    -c:v libx264 -preset fast -tune zerolatency \
    -b:v 4M -maxrate 4M -bufsize 8M \
    -c:a aac -b:a 128k \
    -f flv rtmp://server/live/shop

场景 2:游戏直播

# 游戏直播配置
ffmpeg -f x11grab -video_size 1920x1080 -framerate 60 -i :0.0 \
       -f pulse -i default \
    -c:v h264_nvenc -preset p1 -tune ll \
    -rc cbr -b:v 6M -bufsize 12M \
    -c:a aac -b:a 192k \
    -f flv rtmp://server/live/game

场景 3:会议直播

# 会议直播配置
ffmpeg -f v4l2 -video_size 1280x720 -framerate 30 -i /dev/video0 \
       -f alsa -i hw:0 \
    -c:v libx264 -preset veryfast -tune zerolatency \
    -b:v 2M -maxrate 2M -bufsize 4M \
    -c:a aac -b:a 128k \
    -f flv rtmp://server/live/meeting

扩展阅读

  1. RTMP 规范
  2. HLS 规范
  3. DASH 规范
  4. SRT 协议
  5. FFmpeg 流媒体文档

总结

本章介绍了 FFmpeg 的直播应用技术,包括:

  • 直播推流与拉流
  • 多平台分发
  • 实时转码
  • 直播录制与回放
  • HLS/DASH 直播

掌握直播技术可以帮助您构建完整的直播系统,满足各种直播需求。