本文档提供了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×480 | 16:9 | 标清 |
| 720P (HD) | 1280×720 | 16:9 | 高清 |
| 1080P (FHD) | 1920×1080 | 16:9 | 全高清 |
| 1440P (2K) | 2560×1440 | 16:9 | 2K |
| 2160P (4K) | 3840×2160 | 16:9 | 4K |
| 4320P (8K) | 7680×4320 | 16:9 | 8K |
编解码器格式:
- 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: 用于输入原始数据的尺寸说明(播放和处理原始数据时)
参数选择原则:
- 播放原始数据:使用
-pixel_format+-video_size - 格式转换:使用
-pix_fmt+-s - 处理原始数据:使用
-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 tcp | RTSP使用TCP传输 | 避免UDP丢包 |
-rtsp_transport udp | RTSP使用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 有用资源
- FFmpeg官方文档: ffmpeg.org/documentati…
- 编解码器wiki: trac.ffmpeg.org/wiki
- 测试视频: sample-videos.com/
- 在线转换器: 用于测试和对比
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