FFmpeg 完整使用指南

149 阅读23分钟

本文档提供了FFmpeg的系统性学习路径,从基础概念到高级应用,适合不同水平的用户参考学习。

文档基于FFmpeg 7.1.1版本。

注意:本文档内容由作者收集并编写,并由AI进行归纳和整理,如有错误之处,望指正。


1. FFmpeg 概述

1.1 什么是 FFmpeg

FFmpeg 是一个开源的多媒体处理框架,能够处理音频、视频和其他多媒体文件及流。它包含了一系列共享库和实用程序,是目前最强大、最灵活的多媒体处理工具集。

FFmpeg 的主要用途:

  • 音视频格式转换
  • 音视频编解码
  • 流媒体处理
  • 音视频剪辑和编辑
  • 多媒体分析
  • 直播推流

1.2 核心概念

容器(Container)

容器是存储音视频数据的文件格式,如 MP4、AVI、MKV、FLV 等。一个容器可以包含:

  • 一个或多个视频流
  • 一个或多个音频流
  • 字幕流
  • 元数据信息

流(Stream)

流是容器内的独立数据通道:

  • 视频流:包含图像序列数据
  • 音频流:包含声音数据
  • 字幕流:包含文本信息
  • 数据流:包含其他类型数据

编解码器(Codec)

编解码器是压缩和解压缩音视频数据的算法:

视频编解码器:

  • H.264 (AVC):最广泛支持
  • H.265 (HEVC):新一代,压缩率更高
  • VP8/VP9:Google 开源
  • AV1:最新开源,压缩率极高

音频编解码器:

  • AAC:高质量,广泛支持
  • MP3:最通用
  • Opus:现代开源
  • FLAC:无损压缩

关键帧(Key Frame)

关键帧是视频编码中的重要概念:

帧类型:

  • I帧(关键帧):完整的图像信息,可独立解码
  • P帧(预测帧):参考前面的I帧或P帧进行预测编码
  • B帧(双向预测帧):参考前后帧进行双向预测编码

IDR帧: 在H.264中,IDR(Instantaneous Decoding Refresh)帧是特殊的I帧:

  • 所有IDR帧都是I帧,但不是所有I帧都是IDR帧
  • 每个GoP(Group of Pictures)的第1个I帧通常是IDR帧
  • IDR帧提供解码刷新点,确保解码器状态重置

复用/分离

  • 复用(Mux):将多个流合并到一个容器
  • 分离(Demux):从容器中提取独立的流

1.3 FFmpeg 组件库

库名称功能描述
libavformat容器格式处理,支持多种音视频格式的读写
libavcodec编解码器实现,支持大量音视频编解码器
libavfilter音视频滤镜处理,提供各种特效和变换
libavdevice设备访问,支持摄像头、麦克风等设备
libswscale图像缩放和格式转换
libswresample音频重采样和格式转换
libavutil通用工具库,提供各种辅助函数

1.4 处理流程

标准处理流程

输入文件 → 分离器 → 解码器 → 滤镜 → 编码器 → 复用器 → 输出文件
   ↓         ↓        ↓       ↓       ↓       ↓        ↓
 container  demux   decode  filter  encode   mux    container

流拷贝模式

当使用 -c copy 时,跳过编解码过程:

输入文件 → 分离器 → 复用器 → 输出文件
   ↓         ↓       ↓       ↓
 container  demux    mux   container

2. FFmpeg 工具套件

2.1 ffmpeg - 转换工具

主要功能:

  • 音视频格式转换
  • 编解码处理
  • 流处理和滤镜应用
  • 直播推拉流

基本语法:

ffmpeg [全局选项] {[输入选项] -i 输入文件}... {[输出选项] 输出文件}...

常用选项:

# 全局选项
-y                   # 覆盖输出文件
-n                   # 不覆盖输出文件
-hide_banner         # 隐藏版本信息
-loglevel level      # 设置日志级别
-stats               # 显示编码统计信息
-progress url        # 输出进度信息到文件或URL

# 输入/输出选项
-f format            # 指定格式
-c codec             # 指定编解码器
-t duration          # 处理时长
-ss position         # 开始位置
-to position         # 结束位置
-frames:v n          # 输出视频帧数
-frames:a n          # 输出音频帧数

# 网络选项
-rtsp_transport tcp  # RTSP使用TCP传输
-timeout n           # 网络超时时间(微秒)
-user_agent string   # 设置User-Agent
-headers string      # 设置HTTP头
-multiple_requests 1 # 允许多个HTTP请求
-reconnect 1         # 自动重连
-reconnect_delay_max n # 最大重连延迟

使用示例:

# 基本转换
ffmpeg -i input.avi output.mp4

# 指定编码器
ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4

# 流拷贝(快速转换容器)
ffmpeg -i input.avi -c copy output.mp4

2.2 ffplay - 播放工具

主要功能:

  • 音视频文件播放
  • 网络流播放
  • 原始数据播放
  • 实时预览

基本语法:

ffplay [选项] 输入文件/URL

播放控制:

空格键    - 暂停/播放
q        - 退出
f        - 全屏切换
m        - 静音切换
←/→      - 快退/快进10秒
↑/↓      - 快退/快进1分钟

使用示例:

# 播放本地文件
ffplay video.mp4

# 播放网络流
ffplay rtmp://server/live/stream
ffplay http://example.com/stream.m3u8

# 播放原始数据
ffplay -f rawvideo -pixel_format yuv420p -video_size 1920x1080 input.yuv
ffplay -f s16le -ar 44100 -ch_layout stereo input.pcm

# 设置窗口大小
ffplay -x 800 -y 600 video.mp4

2.3 ffprobe - 分析工具

主要功能:

  • 媒体文件信息分析
  • 流信息查看
  • 元数据提取
  • 格式检测

基本语法:

ffprobe [选项] 输入文件

常用选项:

-v quiet             # 安静模式
-print_format json   # JSON格式输出
-show_format        # 显示容器信息
-show_streams       # 显示流信息
-show_packets       # 显示包信息
-show_frames        # 显示帧信息

使用示例:

# 显示文件基本信息
ffprobe input.mp4

# 显示详细流信息
ffprobe -show_streams input.mp4

# JSON格式输出
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4

# 显示视频帧信息
ffprobe -select_streams v:0 -show_frames input.mp4

# 提取元数据
ffprobe -v quiet -show_format -show_entries format=duration,size,bit_rate input.mp4

3. 基础操作

3.1 信息查询

查看 FFmpeg 信息:

# 版本信息
ffmpeg -version

# 支持的格式
ffmpeg -formats

# 支持的编解码器
ffmpeg -codecs

# 支持的编码器
ffmpeg -encoders

# 支持的解码器
ffmpeg -decoders

# 支持的滤镜
ffmpeg -filters

# 支持的设备
ffmpeg -devices

查看文件信息:

# 基本信息
ffmpeg -i input.mp4

# 详细信息
ffprobe -show_format -show_streams input.mp4

# 仅显示时长
ffprobe -v quiet -show_entries format=duration -of csv="p=0" input.mp4

3.2 基本转换

容器转换:

# MP4 转 AVI
ffmpeg -i input.mp4 -c copy output.avi

# AVI 转 MKV
ffmpeg -i input.avi -c copy output.mkv

# 多种格式转换
ffmpeg -i input.mov -c copy output.mp4

编码转换:

# 重新编码
ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4

# 仅转换视频
ffmpeg -i input.avi -c:v libx264 -c:a copy output.mp4

# 仅转换音频
ffmpeg -i input.avi -c:v copy -c:a aac output.mp4

3.3 流操作

流选择:

# 选择特定流
ffmpeg -i input.mp4 -map 0:v:0 -map 0:a:1 output.mp4

# 排除流
ffmpeg -i input.mp4 -vn output.mp3    # 无视频
ffmpeg -i input.mp4 -an output.mp4    # 无音频
ffmpeg -i input.mp4 -sn output.mp4    # 无字幕

流提取:

# 提取视频流
ffmpeg -i input.mp4 -c:v copy -an video_only.mp4

# 提取音频流
ffmpeg -i input.mp4 -c:a copy -vn audio_only.aac

# 提取字幕
ffmpeg -i input.mkv -c:s copy -vn -an subtitles.srt

流合并:

# 合并音视频
ffmpeg -i video.mp4 -i audio.aac -c copy output.mp4

# 添加音轨
ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -map 0:v -map 1:a output.mp4

4. 输入源处理

4.1 文件输入

支持的格式:

  • 视频:MP4, AVI, MKV, MOV, FLV, WebM, MPEG, WMV
  • 音频:MP3, AAC, WAV, FLAC, OGG, WMA, M4A
  • 图片:JPEG, PNG, BMP, TIFF, GIF

文件操作:

# 基本文件输入
ffmpeg -i input.mp4 output.avi

# 多文件输入
ffmpeg -i video.mp4 -i audio.wav -c copy output.mp4

# 网络文件
ffmpeg -i http://example.com/video.mp4 output.mp4

4.2 设备捕获

Windows (DirectShow)

# 查看设备
ffmpeg -f dshow -list_devices true -i dummy

# 摄像头录制
ffmpeg -f dshow -i video="USB Camera" output.mp4

# 麦克风录制
ffmpeg -f dshow -i audio="Microphone" output.wav

# 同时录制音视频
ffmpeg -f dshow -i video="USB Camera" -f dshow -i audio="Microphone" output.mp4

# 屏幕录制
ffmpeg -f gdigrab -i desktop output.mp4

# 指定区域录制
ffmpeg -f gdigrab -offset_x 100 -offset_y 100 -video_size 800x600 -i desktop output.mp4

macOS (AVFoundation)

# 查看设备
ffmpeg -f avfoundation -list_devices true -i ""

# 摄像头录制
ffmpeg -f avfoundation -i 0 output.mp4

# 屏幕录制
ffmpeg -f avfoundation -i 1 output.mp4

# 音视频同录
ffmpeg -f avfoundation -i 0:0 output.mp4

Linux

# Video4Linux2
ffmpeg -f v4l2 -i /dev/video0 output.mp4

# ALSA音频
ffmpeg -f alsa -i hw:0 output.wav

# X11屏幕录制
ffmpeg -f x11grab -i :0.0 output.mp4

4.3 网络流

RTMP流:

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

# 推送RTMP流
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://server/live/stream

HLS流:

# 播放HLS
ffmpeg -i http://server/playlist.m3u8 output.mp4

# 生成HLS
ffmpeg -i input.mp4 -c copy -f hls output.m3u8

RTSP流:

# 基本RTSP拉流
ffmpeg -i rtsp://camera_ip/stream output.mp4

# RTSP TCP传输(避免丢包)
ffmpeg -rtsp_transport tcp -i rtsp://camera_ip/stream output.mp4

# RTSP UDP传输
ffmpeg -rtsp_transport udp -i rtsp://camera_ip/stream output.mp4

# 带认证的RTSP
ffmpeg -i rtsp://username:password@camera_ip/stream output.mp4

# RTSP推流
ffmpeg -re -i input.mp4 -c copy -f rtsp rtsp://server/stream

# RTSP推流带参数
ffmpeg -re -i input.mp4 -rtsp_transport tcp -c copy -f rtsp rtsp://server/stream

4.4 原始数据

YUV数据:

# 生成YUV
ffmpeg -i input.mp4 -pix_fmt yuv420p output.yuv

# 读取YUV
ffmpeg -f rawvideo -pix_fmt yuv420p -video_size 1920x1080 -r 25 -i input.yuv output.mp4

# 播放YUV
ffplay -f rawvideo -pixel_format yuv420p -video_size 1920x1080 input.yuv

PCM数据:

# 生成PCM
ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -f s16le output.pcm

# 读取PCM
ffmpeg -f s16le -ar 44100 -ac 2 -i input.pcm output.wav

# 播放PCM
ffplay -f s16le -ar 44100 -ch_layout stereo input.pcm

5. 编码控制

5.1 视频编码

H.264编码:

# 基本H.264编码
ffmpeg -i input.avi -c:v libx264 output.mp4

# 指定质量(CRF模式)
ffmpeg -i input.avi -c:v libx264 -crf 23 output.mp4

# 指定码率(CBR模式)
ffmpeg -i input.avi -c:v libx264 -b:v 2M output.mp4

# 两遍编码(VBR模式)
ffmpeg -i input.avi -c:v libx264 -b:v 2M -pass 1 -f null /dev/null
ffmpeg -i input.avi -c:v libx264 -b:v 2M -pass 2 output.mp4

H.264格式转换:

# 提取H.264码流(MP4格式转Annex-B格式)
ffmpeg -i input.mp4 -c:v copy -bsf:v h264_mp4toannexb -an output.h264

# Annex-B格式转MP4格式
ffmpeg -i input.h264 -c:v copy -bsf:v h264_annexbtomp4 output.mp4

# 提取H.264码流并封装成MP4
ffmpeg -i input.mp4 -c:v copy -bsf:v h264_mp4toannexb -f mp4 output.mp4

H.264格式说明:

  • VCL(Video Coding Layer):直接对原始视频帧进行编码
  • NAL(Network Abstraction Layer):在VCL基础上进行网络抽象
  • avc1格式:MP4容器中的H.264格式,一个文件只有一个头部
  • Annex-B格式:每个NALU都有一个头部,有固定的起始码0x0001

H.265编码:

# 基本H.265编码
ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4

# 高效编码
ffmpeg -i input.mp4 -c:v libx265 -preset slow -crf 24 output.mp4

分辨率控制:

# 指定分辨率
ffmpeg -i input.mp4 -s 1280x720 output.mp4

# 等比缩放
ffmpeg -i input.mp4 -vf scale=1280:-1 output.mp4
ffmpeg -i input.mp4 -vf scale=-1:720 output.mp4

# 按比例缩放
ffmpeg -i input.mp4 -vf scale=iw/2:ih/2 output.mp4

帧率控制:

# 指定帧率
ffmpeg -i input.mp4 -r 25 output.mp4

# 帧率转换
ffmpeg -i input.mp4 -vf fps=30 output.mp4

视频旋转:

# 使用元数据旋转(不重新编码)
ffmpeg -i input.mp4 -metadata:s:v rotate=90 -c copy output.mp4

# 使用滤镜旋转(重新编码)
ffmpeg -i input.mp4 -vf "transpose=1" output.mp4  # 顺时针90°
ffmpeg -i input.mp4 -vf "transpose=2" output.mp4  # 逆时针90°
ffmpeg -i input.mp4 -vf "transpose=3" output.mp4  # 逆时针90°+水平翻转
ffmpeg -i input.mp4 -vf "transpose=0" output.mp4  # 顺时针90°+水平翻转

# 水平/垂直翻转
ffmpeg -i input.mp4 -vf hflip output.mp4  # 水平翻转
ffmpeg -i input.mp4 -vf vflip output.mp4  # 垂直翻转

5.2 音频编码

AAC编码:

# 基本AAC编码
ffmpeg -i input.wav -c:a aac output.m4a

# 指定码率
ffmpeg -i input.wav -c:a aac -b:a 128k output.m4a

# 高质量AAC
ffmpeg -i input.wav -c:a aac -b:a 256k output.m4a

MP3编码:

# 基本MP3编码
ffmpeg -i input.wav -c:a libmp3lame output.mp3

# 指定码率
ffmpeg -i input.wav -c:a libmp3lame -b:a 192k output.mp3

# VBR模式
ffmpeg -i input.wav -c:a libmp3lame -q:a 2 output.mp3

采样率和声道:

# 修改采样率
ffmpeg -i input.wav -ar 44100 output.wav

# 修改声道数
ffmpeg -i input.wav -ac 2 output.wav    # 立体声
ffmpeg -i input.wav -ac 1 output.wav    # 单声道

# 声道转换
ffmpeg -i input.wav -af "pan=mono|c0=0.5*c0+0.5*c1" output.wav

5.3 质量控制

CRF质量控制:

# H.264 CRF (0-51, 18-28推荐)
ffmpeg -i input.avi -c:v libx264 -crf 18 output.mp4    # 高质量
ffmpeg -i input.avi -c:v libx264 -crf 23 output.mp4    # 平衡
ffmpeg -i input.avi -c:v libx264 -crf 28 output.mp4    # 较低质量

# H.265 CRF (0-51, 24-32推荐)
ffmpeg -i input.avi -c:v libx265 -crf 24 output.mp4

码率控制:

# 固定码率
ffmpeg -i input.avi -c:v libx264 -b:v 2M -maxrate 2M -bufsize 4M output.mp4

# 平均码率
ffmpeg -i input.avi -c:v libx264 -b:v 2M output.mp4

# 最大码率限制
ffmpeg -i input.avi -c:v libx264 -crf 23 -maxrate 4M -bufsize 8M output.mp4

5.4 性能优化

预设速度(Preset):

# x264/x265预设速度(从快到慢)
ffmpeg -i input.avi -c:v libx264 -preset ultrafast output.mp4    # 最快
ffmpeg -i input.avi -c:v libx264 -preset superfast output.mp4    # 超快
ffmpeg -i input.avi -c:v libx264 -preset veryfast output.mp4     # 很快
ffmpeg -i input.avi -c:v libx264 -preset faster output.mp4       # 较快
ffmpeg -i input.avi -c:v libx264 -preset fast output.mp4         # 快
ffmpeg -i input.avi -c:v libx264 -preset medium output.mp4       # 中等(默认)
ffmpeg -i input.avi -c:v libx264 -preset slow output.mp4         # 慢
ffmpeg -i input.avi -c:v libx264 -preset slower output.mp4       # 较慢
ffmpeg -i input.avi -c:v libx264 -preset veryslow output.mp4     # 最慢

预设特点:

  • ultrafast: 编码速度最快,文件最大,质量一般
  • fast: 速度和质量的良好平衡
  • medium: 默认预设,平衡速度和压缩率
  • slow/slower: 更好的压缩率,但编码时间长
  • veryslow: 最佳压缩率,编码时间最长

调优参数(Tune):

# 针对不同内容优化
ffmpeg -i input.avi -c:v libx264 -tune film output.mp4          # 电影内容
ffmpeg -i input.avi -c:v libx264 -tune animation output.mp4     # 动画内容
ffmpeg -i input.avi -c:v libx264 -tune grain output.mp4         # 高噪点内容
ffmpeg -i input.avi -c:v libx264 -tune stillimage output.mp4    # 静止图像
ffmpeg -i input.avi -c:v libx264 -tune psnr output.mp4          # PSNR优化
ffmpeg -i input.avi -c:v libx264 -tune ssim output.mp4          # SSIM优化
ffmpeg -i input.avi -c:v libx264 -tune fastdecode output.mp4    # 快速解码
ffmpeg -i input.avi -c:v libx264 -tune zerolatency output.mp4   # 零延迟(直播)

多线程:

# 指定线程数
ffmpeg -threads 4 -i input.avi -c:v libx264 output.mp4

# 自动线程数(推荐)
ffmpeg -threads 0 -i input.avi -c:v libx264 output.mp4

# 分片线程(x264)
ffmpeg -i input.avi -c:v libx264 -x264opts "threads=4:sliced-threads=1" output.mp4

内存和缓冲优化:

# 增大输出缓冲区
ffmpeg -i input.mp4 -max_muxing_queue_size 1024 output.mp4

# 设置分析时长
ffmpeg -analyzeduration 10000000 -probesize 10000000 -i input.mp4 output.mp4

# 减少内存使用
ffmpeg -i input.mp4 -avoid_negative_ts make_zero output.mp4

6. 滤镜处理

6.1 滤镜基础

滤镜类型:

  • 简单滤镜:一个输入,一个输出
  • 复杂滤镜:多个输入或输出

语法格式:

# 简单滤镜
-vf "滤镜名=参数1=值1:参数2=值2"
-af "滤镜名=参数1=值1:参数2=值2"

# 复杂滤镜
-filter_complex "[输入标签]滤镜名=参数[输出标签]"

6.2 视频滤镜

尺寸变换:

# 缩放
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
ffmpeg -i input.mp4 -vf scale=iw/2:ih/2 output.mp4

# 裁剪 (宽:高:x偏移:y偏移)
ffmpeg -i input.mp4 -vf crop=640:480:100:50 output.mp4
ffmpeg -i input.mp4 -vf crop=640:480 output.mp4  # 居中裁剪

# 填充 (宽:高:x偏移:y偏移:颜色)
ffmpeg -i input.mp4 -vf pad=1920:1080:100:100:black output.mp4

旋转翻转:

# 旋转
ffmpeg -i input.mp4 -vf transpose=1 output.mp4  # 顺时针90°
ffmpeg -i input.mp4 -vf transpose=2 output.mp4  # 逆时针90°
ffmpeg -i input.mp4 -vf rotate=PI/6 output.mp4  # 30度

# 翻转
ffmpeg -i input.mp4 -vf hflip output.mp4  # 水平翻转
ffmpeg -i input.mp4 -vf vflip output.mp4  # 垂直翻转

水印处理:

# 图片水印
ffmpeg -i input.mp4 -i logo.png -filter_complex "[0:v][1:v]overlay=10:10" output.mp4

# 文字水印
ffmpeg -i input.mp4 -vf "drawtext=text='Copyright':fontsize=24:fontcolor=white:x=10:y=10" output.mp4

# 时间水印
ffmpeg -i input.mp4 -vf "drawtext=text='%{localtime\:%Y-%m-%d %H\\\:%M\\\:%S}':fontsize=20:x=w-tw-10:y=10" output.mp4

# 去除水印
ffmpeg -i input.mp4 -vf delogo=x=10:y=10:w=100:h=50 output.mp4

色彩调整:

# 亮度对比度
ffmpeg -i input.mp4 -vf eq=brightness=0.1:contrast=1.2 output.mp4

# 饱和度色调
ffmpeg -i input.mp4 -vf hue=s=1.5:h=30 output.mp4

# 色彩平衡
ffmpeg -i input.mp4 -vf colorbalance=rs=0.3:gs=-0.3:bs=0.1 output.mp4

6.3 音频滤镜

音量控制:

# 音量调整
ffmpeg -i input.mp4 -af volume=0.5 output.mp4    # 音量减半
ffmpeg -i input.mp4 -af volume=2.0 output.mp4    # 音量翻倍
ffmpeg -i input.mp4 -af volume=10dB output.mp4   # 增加10dB

# 音量标准化
ffmpeg -i input.mp4 -af loudnorm output.mp4

音频效果:

# 淡入淡出
ffmpeg -i input.mp4 -af afade=t=in:ss=0:d=3 output.mp4      # 3秒淡入
ffmpeg -i input.mp4 -af afade=t=out:st=57:d=3 output.mp4    # 最后3秒淡出

# 回声
ffmpeg -i input.mp4 -af aecho=0.8:0.9:1000:0.3 output.mp4

# 降噪
ffmpeg -i input.mp4 -af "highpass=f=200,lowpass=f=8000" output.mp4

音频处理:

# 重采样
ffmpeg -i input.mp4 -af aresample=44100 output.mp4

# 声道混合
ffmpeg -i input.mp4 -af "pan=mono|c0=0.5*c0+0.5*c1" output.mp4

# 音频压缩
ffmpeg -i input.mp4 -af acompressor output.mp4

6.4 复杂滤镜

画中画:

ffmpeg -i main.mp4 -i small.mp4 \
       -filter_complex "[1:v]scale=320:240[pip];[0:v][pip]overlay=W-w-10:10" \
       output.mp4

分屏显示:

# 左右分屏
ffmpeg -i left.mp4 -i right.mp4 \
       -filter_complex "[0:v]scale=iw/2:ih[left];[1:v]scale=iw/2:ih[right];[left][right]hstack" \
       output.mp4

# 上下分屏
ffmpeg -i top.mp4 -i bottom.mp4 \
       -filter_complex "[0:v]scale=iw:ih/2[top];[1:v]scale=iw:ih/2[bottom];[top][bottom]vstack" \
       output.mp4

音频混音:

# 音频混合
ffmpeg -i audio1.mp3 -i audio2.mp3 \
       -filter_complex "[0:a][1:a]amix=inputs=2:duration=longest" \
       output.mp3

# 背景音乐
ffmpeg -i voice.mp4 -i music.mp3 \
       -filter_complex "[1:a]volume=0.3[bg];[0:a][bg]amix=inputs=2" \
       output.mp4

7. 实用功能

7.1 时间控制

切割视频:

# 从10秒开始,切割30秒
ffmpeg -i input.mp4 -ss 00:00:10 -t 00:00:30 -c copy output.mp4

# 从10秒到40秒
ffmpeg -i input.mp4 -ss 00:00:10 -to 00:00:40 -c copy output.mp4

# 精确切割(重新编码)
ffmpeg -i input.mp4 -ss 00:00:10 -t 00:00:30 output.mp4

速度控制:

# 视频加速(2倍速)
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=PTS/2[v];[0:a]atempo=2[a]" \
       -map "[v]" -map "[a]" output.mp4

# 视频减速(0.5倍速)
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=PTS*2[v];[0:a]atempo=0.5[a]" \
       -map "[v]" -map "[a]" output.mp4

# 视频倒放
ffmpeg -i input.mp4 -vf reverse -af areverse output.mp4

# 仅视频倒放(音频不变)
ffmpeg -i input.mp4 -vf reverse -c:a copy output.mp4

# 仅音频倒放(视频不变)
ffmpeg -i input.mp4 -c:v copy -af areverse output.mp4

# 视频加速,帧率变为2倍
ffmpeg -i input.mp4 -vf setpts=PTS/2 -af atempo=2 output.mp4

特殊效果:

# 镜面倒影特效
ffmpeg -i input.mp4 -vf "split[up][down];[up]pad=iw:ih*2[up];[down]vflip[down];[up][down]overlay=0:h" \
       -c:a copy output.mp4

# 视频宽度拉伸
ffmpeg -i input.mp4 -vf scale=iw*2:ih -c:a copy output.mp4

# 视频不拉伸,宽度填充
ffmpeg -i input.mp4 -vf pad=iw*2:ih -c:a copy output.mp4

# 添加图片水印
ffmpeg -i input.mp4 -vf "movie=icon.jpg[watermark];[in][watermark]overlay=100:150[out]" \
       -c:a copy output.mp4

# 添加动态时间水印
ffmpeg -i input.mp4 -vf drawtext="fontfile=jianti.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime\:%H\\\:%M\\\:%S}'" \
       output.mp4

7.2 文件合并

列表合并:

# 创建文件列表 filelist.txt
echo "file 'part1.mp4'" > filelist.txt
echo "file 'part2.mp4'" >> filelist.txt
echo "file 'part3.mp4'" >> filelist.txt

# 合并文件
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4

滤镜合并:

# 视频连接
ffmpeg -i part1.mp4 -i part2.mp4 -i part3.mp4 \
       -filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0]concat=n=3:v=1:a=1[outv][outa]" \
       -map "[outv]" -map "[outa]" output.mp4

# 音频连接
ffmpeg -i audio1.mp3 -i audio2.mp3 \
       -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1[outa]" \
       -map "[outa]" output.mp3

7.3 格式转换

图片序列:

# 视频转图片
ffmpeg -i input.mp4 -r 1 frame_%03d.png        # 每秒1帧
ffmpeg -i input.mp4 -vf fps=1/10 frame_%03d.png # 每10秒1帧

# 图片转视频
ffmpeg -r 25 -i frame_%03d.png -c:v libx264 -pix_fmt yuv420p output.mp4

# 制作GIF
ffmpeg -i input.mp4 -ss 00:00:10 -t 00:00:05 -vf "fps=10,scale=320:-1" output.gif

音频格式:

# WAV转MP3
ffmpeg -i input.wav -c:a libmp3lame -b:a 192k output.mp3

# MP3转AAC
ffmpeg -i input.mp3 -c:a aac -b:a 128k output.m4a

# 提取音频
ffmpeg -i input.mp4 -vn -c:a copy audio.aac

7.4 批量处理

批处理脚本:

# Windows批处理
for %%i in (*.avi) do ffmpeg -i "%%i" -c:v libx264 -crf 23 "%%~ni.mp4"

# Linux/macOS脚本
for file in *.avi; do
    ffmpeg -i "$file" -c:v libx264 -crf 23 "${file%.*}.mp4"
done

批量转换示例:

# 批量压缩
for %%i in (*.mp4) do ffmpeg -i "%%i" -c:v libx264 -crf 28 -c:a aac "compressed_%%i"

# 批量添加水印
for %%i in (*.mp4) do ffmpeg -i "%%i" -i logo.png -filter_complex "[0:v][1:v]overlay=10:10" "watermarked_%%i"

8. 直播应用

8.1 推拉流

RTMP推流:

# 文件推流
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://server/live/streamkey

# 循环推流
ffmpeg -re -stream_loop -1 -i input.mp4 -c copy -f flv rtmp://server/live/streamkey

# 摄像头推流
ffmpeg -f dshow -i video="Camera" -c:v libx264 -preset fast \
       -b:v 2000k -maxrate 2000k -bufsize 4000k \
       -c:a aac -b:a 128k -f flv rtmp://server/live/streamkey

# 屏幕推流
ffmpeg -f gdigrab -i desktop -c:v libx264 -preset ultrafast \
       -b:v 3000k -f flv rtmp://server/live/streamkey

# 摄像头+RTSP推流(高质量)
ffmpeg -f dshow -i video="USB webcam" -rtsp_transport tcp \
       -c:v libx264 -preset ultrafast -c:a libmp3lame \
       -ar 44100 -ac 1 -r 25 -f rtsp rtsp://127.0.0.1/live/camera

# 摄像头+RTMP推流(兼容性好)
ffmpeg -f dshow -i video="USB webcam" -c:v libx264 \
       -c:a aac -ar 44100 -ac 1 -r 25 -s 1920x1080 \
       -f flv rtmp://127.0.0.1/live/camera

# 推流参数优化
ffmpeg -re -i input.mp4 \
       -c:v libx264 -preset veryfast -tune zerolatency \
       -b:v 2500k -maxrate 2500k -bufsize 5000k \
       -c:a aac -b:a 128k -ar 44100 -ac 2 \
       -f flv rtmp://server/live/streamkey

拉流录制:

# RTMP拉流
ffmpeg -i rtmp://server/live/stream -c copy recording.flv

# HLS拉流
ffmpeg -i http://server/playlist.m3u8 -c copy recording.mp4

# RTSP拉流
ffmpeg -i rtsp://camera_ip/stream -c copy recording.mp4

8.2 HLS切片

基本HLS:

# 生成HLS
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f hls \
       -hls_time 6 -hls_list_size 10 playlist.m3u8

# 实时HLS
ffmpeg -f dshow -i video="Camera" -c:v libx264 -preset fast \
       -c:a aac -f hls -hls_time 2 -hls_flags delete_segments live.m3u8

高级HLS配置:

ffmpeg -i input.mp4 \
       -c:v libx264 -preset fast -crf 23 \
       -c:a aac -b:a 128k \
       -f hls \
       -hls_time 6 \
       -hls_list_size 10 \
       -hls_wrap 20 \
       -hls_allow_cache 1 \
       -hls_segment_filename "segment_%03d.ts" \
       playlist.m3u8

8.3 多协议支持

多平台推流:

# 同时推送多个平台
ffmpeg -re -i input.mp4 \
       -c copy -f flv rtmp://platform1.com/live/key1 \
       -c copy -f flv rtmp://platform2.com/live/key2 \
       -c copy -f flv rtmp://platform3.com/live/key3

# 使用tee复用
ffmpeg -re -i input.mp4 -c copy \
       -f tee "[f=flv]rtmp://platform1.com/live/key1|[f=flv]rtmp://platform2.com/live/key2"

协议转换:

# RTMP转HLS
ffmpeg -i rtmp://source/live/stream -c copy -f hls output.m3u8

# RTSP转RTMP
ffmpeg -i rtsp://camera/stream -c copy -f flv rtmp://server/live/stream

# HLS转RTMP
ffmpeg -i http://server/playlist.m3u8 -c copy -f flv rtmp://server/live/stream

9. 高级技巧

9.1 流映射

基本映射:

# 选择特定流
ffmpeg -i input.mp4 -map 0:v:0 -map 0:a:1 output.mp4

# 多文件映射
ffmpeg -i video.mp4 -i audio.wav -map 0:v -map 1:a output.mp4

# 排除流
ffmpeg -i input.mkv -map 0 -map -0:s:2 output.mp4  # 排除第3个字幕流

复杂映射:

# 复制多个音轨
ffmpeg -i input.mkv -map 0:v -map 0:a:0 -map 0:a:1 -c copy output.mp4

# 重新排序流
ffmpeg -i input.mp4 -map 0:a:1 -map 0:v:0 -map 0:a:0 output.mp4

9.2 元数据处理

查看和设置元数据:

# 查看元数据
ffprobe -show_format input.mp4

# 设置元数据
ffmpeg -i input.mp4 -metadata title="My Video" -metadata artist="Author" -c copy output.mp4

# 删除元数据
ffmpeg -i input.mp4 -map_metadata -1 -c copy output.mp4

# 从文件读取元数据
ffmpeg -i input.mp4 -i metadata.txt -map_metadata 1 -c copy output.mp4

9.3 硬件加速

NVIDIA GPU:

# 解码加速
ffmpeg -hwaccel nvdec -i input.mp4 -c:v libx264 output.mp4

# 编码加速
ffmpeg -i input.mp4 -c:v h264_nvenc -preset fast output.mp4

# 完整GPU加速
ffmpeg -hwaccel nvdec -i input.mp4 -c:v h264_nvenc -preset fast output.mp4

Intel Quick Sync:

# QSV加速
ffmpeg -hwaccel qsv -i input.mp4 -c:v h264_qsv -preset fast output.mp4

其他硬件加速:

# 自动选择
ffmpeg -hwaccel auto -i input.mp4 output.mp4

# VAAPI (Linux)
ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -i input.mp4 output.mp4

9.4 错误处理

日志控制:

# 静默模式
ffmpeg -loglevel quiet -i input.mp4 output.mp4

# 详细日志
ffmpeg -loglevel verbose -i input.mp4 output.mp4

# 调试模式
ffmpeg -loglevel debug -i input.mp4 output.mp4

进度监控:

# 显示进度
ffmpeg -progress progress.txt -i input.mp4 output.mp4

# 统计信息
ffmpeg -stats -i input.mp4 output.mp4

# 隐藏横幅
ffmpeg -hide_banner -i input.mp4 output.mp4

附录

A.1 编码器对比

视频编码器压缩率质量速度兼容性
libx264中等极好
libx265良好
libvpx-vp9良好
libaom-av1极高极慢一般

A.2 质量参数建议

H.264 CRF值:

  • 0-17: 无损到接近无损(文件极大)
  • 18-23: 高质量(推荐)
  • 24-28: 中等质量
  • 29-51: 低质量

音频码率建议:

  • 64kbps: 语音质量
  • 128kbps: 标准音乐质量
  • 192kbps: 高质量音乐
  • 320kbps: 接近无损

A.3 视频标准与格式

视频扫描方式:

  • 1080P:P表示逐行扫描(Progressive)
  • 1080I:I表示隔行扫描(Interlaced)

帧率标准:

  • 24fps:电影标准帧率
  • 25fps:PAL标准(欧洲)
  • 30fps:NTSC标准(北美)
  • 50fps:高帧率PAL
  • 60fps:高帧率NTSC
  • 120fps:超高帧率(用于慢动作)

常用分辨率:

名称分辨率宽高比说明
480P (SD)854×48016:9标清
720P (HD)1280×72016:9高清
1080P (FHD)1920×108016:9全高清
1440P (2K)2560×144016:92K
2160P (4K)3840×216016:94K
4320P (8K)7680×432016:98K

编解码器格式:

  • FLV: H.264 + AAC/MP3/AC3
  • MP4: MPEG-4系统(音频流+视频流)
  • MP3: MPEG-1 Audio Layer 3
  • H.264: 分为VCL(avc1)和NAL(annexb)两层

H.264格式转换:

# 提取264码流
ffmpeg -i input.mp4 -c:v copy -an -bsf:v h264_mp4toannexb -f h264 output.264

# 提取264码流,封装成mp4
ffmpeg -i input.mp4 -c:v copy -an -bsf:v h264_mp4toannexb -f mp4 output.mp4

# 转换为MPEG-TS
ffmpeg -i input.mp4 -c copy -f mpegts output.ts

A.4 参数使用指南

工具间参数差异:

工具像素格式参数分辨率参数使用场景
ffplay-pixel_format-video_size播放原始数据
ffmpeg-pix_fmt-s / -video_size格式转换/原始数据处理

参数使用规则:

像素格式参数:

  • ffplay: 使用 -pixel_format(完整参数名)
  • ffmpeg: 使用 -pix_fmt(简写参数名)

分辨率参数:

  • -s: 用于输出文件的分辨率设置
  • -video_size: 用于输入原始数据的尺寸说明

常见错误和修正:

# ❌ 错误:ffplay 使用 -pix_fmt
ffplay -f rawvideo -pix_fmt yuv420p -video_size 1920x1080 input.yuv

# ✅ 正确:ffplay 使用 -pixel_format
ffplay -f rawvideo -pixel_format yuv420p -video_size 1920x1080 input.yuv

# ❌ 错误:原始数据使用 -s
ffplay -f rawvideo -pixel_format yuv420p -s 1920x1080 input.yuv

# ✅ 正确:原始数据使用 -video_size
ffplay -f rawvideo -pixel_format yuv420p -video_size 1920x1080 input.yuv

详细使用说明:

像素格式参数差异:

  • ffplay: 使用 -pixel_format(完整参数名,更直观)
  • ffmpeg: 使用 -pix_fmt(简写参数名,更高效)

分辨率参数使用场景:

  • -s: 用于输出文件的分辨率设置(格式转换时)
  • -video_size: 用于输入原始数据的尺寸说明(播放和处理原始数据时)

参数选择原则:

  1. 播放原始数据:使用 -pixel_format + -video_size
  2. 格式转换:使用 -pix_fmt + -s
  3. 处理原始数据:使用 -pix_fmt + -video_size

实际应用示例:

# 播放 YUV 原始数据
ffplay -f rawvideo -pixel_format yuv420p -video_size 1920x1080 input.yuv

# 转换视频格式并改变分辨率
ffmpeg -i input.mp4 -pix_fmt yuv420p -s 1280x720 output.mp4

# 处理 YUV 原始数据
ffmpeg -f rawvideo -pix_fmt yuv420p -video_size 1920x1080 -i input.yuv output.mp4

A.5 常用参数速查表

网络参数:

参数说明示例
-rtsp_transport tcpRTSP使用TCP传输避免UDP丢包
-rtsp_transport udpRTSP使用UDP传输默认方式,延迟低
-timeout n网络超时(微秒)-timeout 5000000
-reconnect 1自动重连网络中断时重连
-user_agent string设置User-Agent伪装浏览器

编码预设:

预设速度文件大小适用场景
ultrafast最快最大实时编码、直播
fast较大快速转换
medium中等中等默认选择
slow较小高质量存档
veryslow最慢最小最终发布版本

调优参数:

Tune参数适用内容
film真人电影
animation动画内容
grain高噪点视频
stillimage静止图像
zerolatency实时直播

A.6 有用资源

A.7 常见问题解决

编码错误:

# 像素格式不兼容
ffmpeg -i input.mp4 -pix_fmt yuv420p output.mp4

# 音频采样率问题
ffmpeg -i input.mp4 -ar 44100 output.mp4

# 编码器不支持
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4

# 强制覆盖
ffmpeg -y -i input.mp4 output.mp4

性能问题:

# 使用硬件加速
ffmpeg -hwaccel auto -i input.mp4 output.mp4

# 调整线程数
ffmpeg -threads 4 -i input.mp4 output.mp4

# 使用快速预设
ffmpeg -i input.mp4 -preset ultrafast output.mp4

# 内存优化
ffmpeg -max_muxing_queue_size 1024 -i input.mp4 output.mp4

网络问题:

# RTSP连接问题
ffmpeg -rtsp_transport tcp -i rtsp://camera_ip/stream output.mp4

# 网络超时
ffmpeg -timeout 5000000 -i http://server/stream output.mp4

# 自动重连
ffmpeg -reconnect 1 -i rtmp://server/stream output.mp4