FFmpeg多媒体处理技能Skill ffmpeg

FFmpeg是一个开源的跨平台多媒体框架,用于视频和音频的编码、解码、转换、流媒体处理和过滤。关键词:FFmpeg,视频编码,音频处理,流媒体,多媒体转换,视频编辑,音频提取,硬件加速。

Premiere剪辑 0 次安装 0 次浏览 更新于 3/18/2026

name: ffmpeg description: FFmpeg使用指南 - 一个全面的多媒体框架,用于视频/音频编码、转换、流媒体和过滤。在处理媒体文件、转换格式、提取音频、创建流、应用过滤器或优化视频/音频质量时使用。 license: LGPL/GPL version: 1.0.0

FFmpeg 技能

FFmpeg 是一个全面的开源多媒体框架,用于处理视频、音频和其他多媒体文件和流。它提供了命令行工具和库,用于录制、转换和流式传输音频和视频。

何时使用此技能

在以下情况使用此技能:

  • 在格式之间转换媒体文件(MP4、MKV、WebM、AVI 等)
  • 使用不同编解码器编码/解码视频(H.264、H.265、VP9、AV1)
  • 处理音频文件(AAC、MP3、FLAC、Opus)
  • 直播到平台(Twitch、YouTube、RTMP 服务器)
  • 创建 HLS/DASH 自适应流
  • 从视频文件提取音频
  • 应用视频/音频过滤器(缩放、裁剪、降噪、音量)
  • 屏幕录制和捕获
  • 优化视频质量和文件大小
  • 批量处理媒体文件
  • 分析媒体文件属性

核心组件

命令行工具

ffmpeg:用于转码、转换和流式传输的主要工具 ffprobe:媒体分析和检查工具 ffplay:用于测试的简约多媒体播放器

  • libavcodec:编解码器编码/解码
  • libavformat:容器格式和 I/O
  • libavfilter:音频/视频过滤框架
  • libavutil:实用函数
  • libswscale:视频缩放和颜色转换
  • libswresample:音频重采样和混合

常见视频编解码器

现代编解码器

H.264 (libx264):最广泛支持,优秀的压缩/质量平衡

  • 最佳用于:通用兼容性、流媒体、网络视频
  • 质量范围:CRF 17-28(越低 = 质量越好)

H.265/HEVC (libx265):比 H.264 压缩率高 25-50%

  • 最佳用于:4K 视频、减小文件大小
  • 编码较慢,浏览器支持有限

VP9:免版税,WebM 格式

  • 最佳用于:YouTube、开源项目
  • 良好的质量/压缩率,Chrome/Firefox 支持

AV1 (libaom-av1, libsvtav1):下一代编解码器,最佳压缩率

  • 最佳用于:未来证明、终极质量/大小比
  • 编码非常慢(随着 SVT-AV1 改进)

传统编解码器

  • MPEG-4 (Xvid/DivX)
  • MPEG-2
  • VP8

常见音频编解码器

AAC:行业标准,优秀质量 MP3:通用兼容性,良好质量 Opus:低比特率下最佳质量,适合语音/流媒体 FLAC:无损压缩,归档质量 Vorbis:开源,良好质量 AC-3/DTS:环绕声格式

容器格式

MP4:通用兼容性,流媒体友好 MKV (Matroska):功能丰富,支持多轨道/字幕 WebM:网络优化(VP8/VP9 + Vorbis/Opus) AVI:传统格式,广泛兼容性 MOV:Apple QuickTime 格式 TS:广播传输流 FLV:Flash 视频(传统流媒体)

基本操作

格式转换

简单格式转换,无需重新编码:

ffmpeg -i input.mkv -c copy output.mp4

使用特定编解码器转换:

ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4

基于质量的编码(CRF)

恒定速率因子 - 最适合质量导向的编码:

# H.264 编码(CRF 23 = 默认,推荐范围 17-28)
ffmpeg -i input.mkv -c:v libx264 -preset slow -crf 22 -c:a copy output.mp4

# H.265 编码(更高压缩率)
ffmpeg -i input.mkv -c:v libx265 -preset medium -crf 24 -c:a copy output.mp4

# VP9 编码(WebM)
ffmpeg -i input.mkv -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus output.webm

CRF 标度:

  • 0 = 无损(文件大小巨大)
  • 17-18 = 视觉无损
  • 20-23 = 高质量(推荐)
  • 24-28 = 中等质量
  • 30+ = 低质量
  • 51 = 最差质量

预设(速度 vs 压缩率):

  • ultrafast、superfast、veryfast、faster、fast
  • medium(默认)
  • slow、slower、veryslow(更好压缩率)
  • placebo(不推荐 - 增益最小)

基于比特率的编码(两次通过)

针对特定文件大小:

# 第 1 次通过(分析)
ffmpeg -y -i input.mkv -c:v libx264 -b:v 2600k -pass 1 -an -f null /dev/null

# 第 2 次通过(编码)
ffmpeg -i input.mkv -c:v libx264 -b:v 2600k -pass 2 -c:a aac -b:a 128k output.mp4

音频提取

提取音频,无需重新编码:

ffmpeg -i video.mp4 -vn -c:a copy audio.m4a

提取并转换为 MP3:

ffmpeg -i video.mp4 -vn -q:a 0 audio.mp3

以特定比特率提取:

ffmpeg -i video.mp4 -vn -c:a libmp3lame -b:a 192k audio.mp3

视频缩放/调整大小

缩放到特定尺寸:

ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4

缩放保持宽高比:

# 宽度 1280,高度自动计算
ffmpeg -i input.mp4 -vf scale=1280:-1 output.mp4

# 高度 720,宽度自动计算
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 -ss 00:01:30 -to 00:03:00 -c copy output.mp4

剪切并重新编码(精确):

ffmpeg -i input.mp4 -ss 00:01:30 -t 00:01:30 -c:v libx264 -c:a aac output.mp4

参数:

  • -ss:开始时间(HH:MM:SS 或秒)
  • -to:结束时间
  • -t:持续时间(代替结束时间)

拼接

方法 1:拼接解复用器(相同编解码器/格式)

创建 concat.txt

file 'input1.mp4'
file 'input2.mp4'
file 'input3.mp4'

运行:

ffmpeg -f concat -safe 0 -i concat.txt -c copy output.mp4

方法 2:拼接过滤器(不同格式)

ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 \
  -filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]" \
  -map "[v]" -map "[a]" output.mp4

高级过滤

视频过滤器

多个过滤器(用逗号链接):

ffmpeg -i input.mp4 -vf "scale=1280:720,hqdn3d" output.mp4

降噪:

ffmpeg -i input.mp4 -vf hqdn3d output.mp4

去隔行:

ffmpeg -i input.mp4 -vf yadif output.mp4

裁剪:

# 从左上角 (0,0) 裁剪到 1280x720
ffmpeg -i input.mp4 -vf "crop=1280:720:0:0" output.mp4

# 自动检测并移除黑边
ffmpeg -i input.mp4 -vf "cropdetect" output.mp4

旋转:

# 顺时针旋转 90 度
ffmpeg -i input.mp4 -vf "transpose=1" output.mp4

# 旋转 180 度
ffmpeg -i input.mp4 -vf "transpose=1,transpose=1" output.mp4

水印/徽标:

ffmpeg -i video.mp4 -i logo.png \
  -filter_complex "overlay=10:10" output.mp4

速度调整:

# 2 倍速度
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" output.mp4

# 0.5 倍速度(慢动作)
ffmpeg -i input.mp4 -vf "setpts=2.0*PTS" -af "atempo=0.5" output.mp4

音频过滤器

音量调整:

# 增加音量 10dB
ffmpeg -i input.mp4 -af "volume=10dB" output.mp4

# 设置为 50% 音量
ffmpeg -i input.mp4 -af "volume=0.5" output.mp4

音频标准化:

ffmpeg -i input.mp4 -af loudnorm output.mp4

音频交叉淡化:

ffmpeg -i audio1.mp3 -i audio2.mp3 \
  -filter_complex "[0][1]acrossfade=d=5" output.mp3

混合多个音频轨道:

ffmpeg -i input1.mp3 -i input2.mp3 \
  -filter_complex "[0:a][1:a]amix=inputs=2:duration=longest" output.mp3

流媒体

RTMP 流媒体(Twitch/YouTube)

基本流:

ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast \
  -maxrate 3000k -bufsize 6000k -pix_fmt yuv420p -g 50 \
  -c:a aac -b:a 128k -ar 44100 \
  -f flv rtmp://live.twitch.tv/app/YOUR_STREAM_KEY

屏幕捕获 + 流(Linux):

ffmpeg -f x11grab -s 1920x1080 -framerate 30 -i :0.0 \
  -f pulse -ac 2 -i default \
  -c:v libx264 -preset veryfast -tune zerolatency \
  -maxrate 2500k -bufsize 5000k -pix_fmt yuv420p \
  -c:a aac -b:a 128k -ar 44100 \
  -f flv rtmp://live.twitch.tv/app/YOUR_STREAM_KEY

屏幕捕获(Windows DirectShow):

ffmpeg -f dshow -i video="screen-capture-recorder":audio="Stereo Mix" \
  -c:v libx264 -preset ultrafast -tune zerolatency \
  -maxrate 750k -bufsize 3000k \
  -f flv rtmp://live.twitch.tv/app/YOUR_STREAM_KEY

重要流媒体参数:

  • -re:以原生帧率读取输入(实时)
  • -tune zerolatency:优化低延迟
  • -g 50:每 50 帧一个关键帧(25fps 时 2 秒)
  • -maxrate:最大比特率
  • -bufsize:速率控制缓冲区(通常为 2 倍 maxrate)

HLS 流媒体

生成自适应 HLS 流:

ffmpeg -i input.mp4 \
  -c:v libx264 -preset fast -crf 22 -g 48 -sc_threshold 0 \
  -c:a aac -b:a 128k \
  -f hls -hls_time 6 -hls_playlist_type vod \
  -hls_segment_filename "segment_%03d.ts" \
  playlist.m3u8

多比特率 HLS:

ffmpeg -i input.mp4 \
  -map 0:v -map 0:a -map 0:v -map 0:a \
  -c:v libx264 -crf 22 -c:a aac -b:a 128k \
  -b:v:0 2000k -s:v:0 1280x720 -b:v:1 5000k -s:v:1 1920x1080 \
  -var_stream_map "v:0,a:0 v:1,a:1" \
  -master_pl_name master.m3u8 \
  -f hls -hls_time 6 -hls_list_size 0 \
  stream_%v/index.m3u8

UDP/RTP 流媒体

UDP 流:

ffmpeg -re -i input.mp4 -c copy -f mpegts udp://192.168.1.100:1234

RTP 音频流:

ffmpeg -re -i audio.mp3 -c:a libopus -f rtp rtp://192.168.1.100:5004

硬件加速

NVIDIA NVENC

# 使用 NVENC 的 H.264
ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc -preset fast -crf 22 output.mp4

# 使用 NVENC 的 H.265
ffmpeg -hwaccel cuda -i input.mp4 -c:v hevc_nvenc -preset fast -crf 24 output.mp4

Intel QuickSync (QSV)

ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 \
  -c:v h264_qsv -preset fast -global_quality 22 output.mp4

AMD VCE

ffmpeg -hwaccel auto -i input.mp4 \
  -c:v h264_amf -quality balanced -rc cqp -qp 22 output.mp4

媒体分析

检查媒体文件

# 详细信息
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4

# 人类可读格式
ffprobe input.mp4

# 获取时长
ffprobe -v error -show_entries format=duration \
  -of default=noprint_wrappers=1:nokey=1 input.mp4

# 获取分辨率
ffprobe -v error -select_streams v:0 \
  -show_entries stream=width,height \
  -of csv=s=x:p=0 input.mp4

# 获取比特率
ffprobe -v error -show_entries format=bit_rate \
  -of default=noprint_wrappers=1:nokey=1 input.mp4

批量处理

批量转换的 Bash 循环

# 将所有 MKV 文件转换为 MP4
for file in *.mkv; do
  ffmpeg -i "$file" -c:v libx264 -crf 22 -c:a aac "${file%.mkv}.mp4"
done

# 将所有视频调整为 720p
for file in *.mp4; do
  ffmpeg -i "$file" -vf scale=-1:720 "720p_${file}"
done

使用 GNU Parallel 并行处理

# 安装:sudo apt-get install parallel

# 并行处理多个文件
ls *.mkv | parallel ffmpeg -i {} -c:v libx264 -crf 22 -c:a aac {.}.mp4

常见模式

从视频创建 GIF

# 高质量 GIF
ffmpeg -i input.mp4 -vf "fps=15,scale=640:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" output.gif

# 简单 GIF
ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1" output.gif

提取帧为图像

# 提取所有帧
ffmpeg -i input.mp4 frame_%04d.png

# 每秒提取 1 帧
ffmpeg -i input.mp4 -vf fps=1 frame_%04d.png

# 在 5 秒时提取单帧
ffmpeg -ss 00:00:05 -i input.mp4 -frames:v 1 frame.png

从图像创建视频

# 从编号图像
ffmpeg -framerate 30 -i frame_%04d.png -c:v libx264 -crf 22 -pix_fmt yuv420p output.mp4

# 从模式
ffmpeg -framerate 24 -pattern_type glob -i '*.png' -c:v libx264 output.mp4

添加字幕

# 将字幕烧入视频
ffmpeg -i video.mp4 -vf subtitles=subtitles.srt output.mp4

# 嵌入字幕轨道(软字幕)
ffmpeg -i video.mp4 -i subtitles.srt -c copy -c:s mov_text output.mp4

移除音频

ffmpeg -i input.mp4 -an -c:v copy output.mp4

替换音频

ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 output.mp4

创建缩略图

# 在 5 秒时创建单个缩略图
ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 -vf scale=320:-1 thumb.jpg

# 多个缩略图(每分钟一个)
ffmpeg -i input.mp4 -vf fps=1/60,scale=320:-1 thumb_%03d.jpg

性能优化

速度 vs 质量权衡

快速编码(实时处理):

ffmpeg -i input.mp4 -c:v libx264 -preset ultrafast -crf 23 output.mp4

平衡(默认):

ffmpeg -i input.mp4 -c:v libx264 -preset medium -crf 22 output.mp4

高质量(归档):

ffmpeg -i input.mp4 -c:v libx264 -preset veryslow -crf 18 output.mp4

多线程

FFmpeg 自动使用多个 CPU 核心。覆盖:

ffmpeg -threads 8 -i input.mp4 -c:v libx264 output.mp4

最佳实践

  1. 使用 CRF 进行质量导向的编码 - 对于大多数用例,比比特率更好
  2. 针对大小目标使用两次通过 - 当文件大小至关重要时
  3. 尽可能复制流 - 使用 -c copy 避免重新编码
  4. 选择合适的预设 - 平衡速度 vs 压缩率
  5. 匹配输出到源 - 不要放大或使用比源更高的质量
  6. 首先测试短片段 - 在批量处理前验证设置
  7. 硬件加速 - 使用 GPU 编码进行更快处理
  8. 音频重要 - 不要忽视音频编解码器/比特率选择
  9. 高效使用过滤器 - 用逗号链接多个过滤器
  10. 验证输出 - 编码后总是检查质量

常见参数参考

视频参数

  • -c:v-vcodec:视频编解码器
  • -b:v:视频比特率(如 2M2500k
  • -crf:恒定速率因子(0-51)
  • -preset:编码速度/质量(ultrafast 到 veryslow)
  • -tune:编码优化(film、animation、zerolatency)
  • -pix_fmt:像素格式(yuv420p 以兼容)
  • -r:帧率(如 3060
  • -g:GOP 大小(关键帧间隔)

音频参数

  • -c:a-acodec:音频编解码器
  • -b:a:音频比特率(如 128k192k
  • -ar:音频采样率(如 4410048000
  • -ac:音频通道(1=单声道,2=立体声)
  • -q:a:音频 VBR 质量(0=MP3 最佳)

通用参数

  • -i:输入文件
  • -y:覆盖输出而不询问
  • -n:从不覆盖输出
  • -t:编码持续时间
  • -ss:开始时间偏移
  • -to:结束时间
  • -vf:视频过滤器
  • -af:音频过滤器
  • -map:流选择
  • -metadata:设置元数据
  • -f:强制格式

故障排除

“未知编码器” 错误

安装编解码器库:

# Ubuntu/Debian
sudo apt-get install ffmpeg libx264-dev libx265-dev libvpx-dev

# 检查可用编码器
ffmpeg -encoders

输出兼容性问题

使用安全默认值以最大化兼容性:

ffmpeg -i input.mkv -c:v libx264 -profile:v high -level 4.0 \
  -pix_fmt yuv420p -c:a aac -b:a 128k output.mp4

性能问题

  • 使用硬件加速(-hwaccel
  • 选择更快预设(-preset fast
  • 使用缩放过滤器降低分辨率
  • 显式使用多个线程

质量问题

  • 降低 CRF 值(18-22 为高质量)
  • 使用更慢预设(-preset slow
  • 使用两次通过编码以更好分布比特率
  • 匹配或超过源比特率

资源

实施清单

使用 FFmpeg 时:

  • [ ] 验证 FFmpeg 安装(ffmpeg -version
  • [ ] 检查可用编解码器以适应用例
  • [ ] 首先在短片段上测试编码设置
  • [ ] 为目标平台选择合适的编解码器
  • [ ] 设置质量级别(CRF 或比特率)
  • [ ] 配置音频编解码器和比特率
  • [ ] 应用必要过滤器(缩放、裁剪等)
  • [ ] 如有可用,考虑硬件加速
  • [ ] 验证输出质量和文件大小
  • [ ] 在目标设备上测试输出兼容性
  • [ ] 记录设置以可重现
  • [ ] 为重复任务创建批量脚本