FFmpeg 核心概念
在开始之前,了解 FFmpeg 的三个核心组件至关重要:

- ffmpeg: 主命令行工具,用于处理音视频文件,它可以转换、编码、解码、转码、流式传输等。
- ffprobe: 分析工具,用于显示媒体文件的详细信息(如格式、编码、时长、比特率、帧率等)。
- ffplay: 简单的播放器,用于直接播放或测试音视频流。
基础命令
查看文件信息
使用 ffprobe 可以获取一个媒体文件的元数据。
# 查看视频文件的详细格式和流信息 ffprobe input.mp4 # 以人类可读的方式显示信息(推荐) ffprobe -v error -show_format -show_streams input.mp4 # 只查看视频流的详细信息 ffprobe -v error -select_streams v:0 -show_streams input.mp4 # 将信息输出为 JSON 格式,方便脚本处理 ffprobe -v error -show_format -show_streams -of json input.mp4
格式转换与基本操作
这是最常见的用法,将一种格式的视频转换为另一种格式。
# 将 MP4 转换为 MKV (容器转换,不重新编码,速度最快) ffmpeg -i input.mp4 -c copy output.mkv # 将 AVI 转换为 MP4 (同样不重新编码) ffmpeg -i input.avi -c copy output.mp4 # 将视频转换为 MP4 格式,并使用 H.264 编码和 AAC 音频 # 这是目前最通用的网络视频格式 ffmpeg -i input.mkv -c:v libx264 -c:a aac output.mp4
提取音频/视频
只从视频文件中提取音频或视频轨道。
# 提取音频为 MP3 格式 ffmpeg -i input.mp4 -vn -ab 192k output.mp3 # -vn: 禁用视频 # -ab 192k: 设置音频比特率为 192kbps # 提取音频为 WAV (无损) 格式 ffmpeg -i input.mp4 -vn -acodec pcm_s16le output.wav # 提取视频(无音频) ffmpeg -i input.mp4 -an -c:v copy output_video_only.mp4 # -an: 禁用音频
截取视频片段
从视频的某个时间点开始,截取指定时长的片段。

# 从第 30 秒开始,截取 10 秒的视频 ffmpeg -ss 00:00:30 -t 10 -i input.mp4 -c copy output.mp4 # -ss: 设置开始时间 # -t: 设置持续时间 # 截取从 1 分 10 秒到 1 分 30 秒的片段 ffmpeg -ss 00:01:10 -to 00:01:30 -i input.mp4 -c copy output.mp4 # -to: 设置结束时间
注意:
-c copy表示不重新编码,直接复制流,所以速度非常快,但如果你的截取点不是关键帧,可能会导致视频无法播放,如果遇到问题,可以去掉-c copy,让 FFmpeg 重新编码,但速度会慢很多。
视频处理
调整视频尺寸
改变视频的分辨率。
# 将视频宽度调整为 640px,高度按比例自动调整 ffmpeg -i input.mp4 -vf "scale=640:-1" output.mp4 # -vf: video filter (视频过滤器) 的简写 # -1 表示高度自动按比例计算,避免变形 # 强制将视频调整为 640x480,可能导致画面变形 ffmpeg -i input.mp4 -vf "scale=640:480" output.mp4 # 将视频缩小到原来的 50% ffmpeg -i input.mp4 -vf "scale=iw*0.5:ih*0.5" output.mp4 # iw: input width (输入宽度), ih: input height (输入高度)
修改帧率
改变视频的帧率。
# 将帧率从 30fps 降低到 15fps ffmpeg -i input.mp4 -r 15 output.mp4 # 只降低输出视频的帧率,不改变原始编码 ffmpeg -i input.mp4 -c:v libx264 -r 15 output.mp4
旋转视频
将视频旋转 90、180 或 270 度。

# 顺时针旋转 90 度 ffmpeg -i input.mp4 -vf "transpose=1" output.mp4 # 逆时针旋转 90 度 ffmpeg -i input.mp4 -vf "transpose=2" output.mp4 # 旋转 180 度 ffmpeg -i input.mp4 -vf "transpose=2,transpose=2" output.mp4 # 或者 ffmpeg -i input.mp4 -vf "hflip,vflip" output.mp4
视频裁剪
从视频中裁剪出一个矩形区域。
# 从 (100,100) 坐标开始,裁剪一个 500x300 大小的区域 ffmpeg -i input.mp4 -vf "crop=500:300:100:100" output.mp4 # 语法: crop=width:height:x:y
视频速度调整
加速或慢放视频。
# 将视频速度加快 2 倍 ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" output.mp4 # -vf setpts=PTS*0.5: 将视频时间戳减半,实现快放 # -af atempo=2.0: 将音频速度加快 2 倍,避免音调变高 # 将视频速度减半(慢放) ffmpeg -i input.mp4 -vf "setpts=2.0*PTS" -af "atempo=0.5" output.mp4
添加水印/图片叠加
在视频上添加图片或文字水印。
# 添加图片水印 (在右下角,距离边缘 10px) ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=main_w-overlay_w-10:main_h-overlay_h-10" output.mp4 # main_w: 主视频宽度, main_h: 主视频高度 # overlay_w: 水印宽度, overlay_h: 水印高度 # 添加文字水印 ffmpeg -i input.mp4 -vf "drawtext=text='FFmpeg Watermark':fontfile=/path/to/font.ttf:fontsize=24:fontcolor=white@0.8:x=10:y=10" output.mp4 # fontfile: 字体文件路径 (需要绝对路径) # fontcolor: 颜色,支持 RGBA (白色@0.8 表示带80%透明度的白色) # x, y: 文字位置
音频处理
调整音量
增大或减小音频音量。
# 音量增大一倍 (2.0) ffmpeg -i input.mp4 -af "volume=2.0" output.mp4 # 音量减小一半 (0.5) ffmpeg -i input.mp4 -af "volume=0.5" output.mp4 # 音量增加 3 分贝 ffmpeg -i input.mp4 -af "volume=1.413" output.mp4
转换音频格式
# 转换为 AAC 格式 ffmpeg -i input.wav -c:a aac output.aac # 转换为 MP3 格式 ffmpeg -i input.wav -c:a libmp3lame -q:a 2 output.mp3 # -q:a 2: 设置音频质量 (VBR),2 是较好的质量,0 是最好
录制系统音频/麦克风**
需要配合 pulseaudio (Linux) 或 CoreAudio (macOS) 使用。
# 在 Linux 上录制系统音频 ffmpeg -f pulse -i "alsa_output.pci-0000_00_1b.0.analog-stereo.monitor" output.wav # 在 Linux 上录制麦克风 ffmpeg -f pulse -i "default" output.wav # 在 macOS 上录制系统音频 (macOS 12+) ffmpeg -f avfoundation -i "none:0" output.wav # 在 macOS 上录制麦克风 ffmpeg -f avfoundation -i ":0" output.wav
高级与流媒体
码率控制
码率决定了视频文件大小和质量。
# 1. CBR (Constant Bitrate - 恒定码率) # 适用于直播,码率恒定,但质量不均。 ffmpeg -i input.mp4 -b:v 1M -bufsize 2M -maxrate 1.5M -c:v libx264 output_cbr.mp4 # -b: 目标码率 # -bufsize: 缓冲区大小 # -maxrate: 最大码率 # 2. VBR (Variable Bitrate - 可变码率) # 适用于点播,码率根据画面复杂度变化,质量更好。 # 使用 CRF (Constant Rate Factor) 是更推荐的方式。 # CRF 范围通常是 0-51,值越小质量越好,18-28 是常用范围。 ffmpeg -i input.mp4 -c:v libx264 -crf 23 output_vbr.mp4 # -crf 23: 默认值,在文件大小和质量之间取得了很好的平衡 # 3. ABR (Average Bitrate - 平均码率) # 设置一个平均目标码率,FFmpeg 会自动调整。 ffmpeg -i input.mp4 -b:v 1M -c:v libx264 output_abr.mp4
多码率自适应流
生成 DASH 或 HLS 格式,用于不同网络条件下的自适应播放。
# 生成 HLS (m3u8) 播放列表 # -hls_time 10: 每个切片 10 秒 # -hls_list_size 0: 列表包含所有切片 # -f hls: 输出 HLS 格式 ffmpeg -i input.mp4 -c:v libx264 -c:a aac -hls_time 10 -hls_list_size 0 -f hls output.m3u8 # 生成 DASH 播放列表 # -f dash: 输出 DASH 格式 ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f dash output.mpd
推送 RTMP 直播流
将本地视频文件或摄像头画面推送到 RTMP 服务器。
# 推送本地视频文件 ffmpeg -re -i input.mp4 -c copy -f flv rtmp://live-server/live/stream_key # 推送摄像头和麦克风 # -f v4l2: Linux 摄像头设备 # -f alsa: Linux 麦克风设备 ffmpeg -f v4l2 -i /dev/video0 -f alsa -i default -c:v libx264 -c:a aac -f flv rtmp://live-server/live/stream_key # -re: 以文件原始帧率读取,防止服务器过载
FFmpeg 命令结构解析
一个典型的 FFmpeg 命令通常遵循以下结构:
ffmpeg [全局选项] -i 输入文件 [输入选项] -f 输出格式 [输出选项] 输出文件
[全局选项]: 应用于整个命令,如-y(覆盖输出文件)、-loglevel(日志级别)。-i 输入文件: 指定输入源,可以是文件、摄像头、网络流等。[输入选项]: 只应用于紧跟其后的输入文件,如-ss 00:01:10(从输入文件的 1 分 10 秒处开始)。-f 输出格式: 指定输出格式,如mp4,mkv,flv,hls。[输出选项]: 只应用于紧跟其后的输出文件,如-c:v libx264(使用 H.264 编码视频)。输出文件: 指定输出的文件名或 URL。
实用技巧与资源
-
批量处理 使用
for循环来处理一个文件夹中的所有文件。# 将当前目录下所有 .mp4 文件转换为 .mkv for file in *.mp4; do ffmpeg -i "$file" -c copy "${file%.mp4}.mkv" done -
GPU 加速 如果你的电脑有 NVIDIA 或 AMD 显卡,可以使用硬件编码器来大幅提升转码速度。
# NVIDIA (NVENC) ffmpeg -i input.mp4 -c:v h264_nvenc output.mp4 # AMD (AMF/VCE) ffmpeg -i input.mp4 -c:v h264_amf output.mp4
-
查询支持的编解码器/格式
# 查询所有支持的编解码器 ffmpeg -codecs # 查询所有支持的格式 ffmpeg -formats
-
官方文档 FFmpeg 的文档是学习的最佳资源,虽然有些晦涩,但非常权威。
-
在线工具
- FFmpeg 命令行工具: 可以在线查询所有参数的详细说明。
- ffmpeg.io: 一个非常友好的 FFmpeg 命令生成器,可视化操作。
希望这份大全能帮助你更好地使用 FFmpeg!
