杰瑞科技汇

FFmpeg Linux教程怎么学?

FFmpeg Linux 完整教程

目录

  1. 什么是 FFmpeg?
  2. 安装 FFmpeg
  3. 核心概念:你必须知道的三大组件
  4. 基本语法结构
  5. 常用操作与实战案例
  6. 进阶技巧与参数详解
  7. 实用技巧:使用 FFmpeg 脚本批处理
  8. 总结与资源

什么是 FFmpeg?

FFmpeg 是一个开源的、跨平台的命令行工具集,用于处理音视频文件,它功能极其强大,被誉为“音视频领域的瑞士军刀”。

FFmpeg Linux教程怎么学?-图1
(图片来源网络,侵删)

你可以用它来:

  • 转码:将视频或音频从一种格式转换为另一种格式(如 MP4, MKV, AVI, MOV, MP3, AAC 等)。
  • 转换:改变视频的分辨率、帧率、码率、编码方式等。
  • 切割/合并:从视频中截取片段,或将多个小的视频/音频文件合并成一个。
  • 流媒体:将音视频推送到流媒体服务器或从流媒体服务器拉取流。
  • 录制:录制你的屏幕、摄像头或音频输入。
  • 处理:添加水印、字幕、调整亮度/对比度、应用滤镜等。

它的核心优势在于自动化灵活性,非常适合在服务器、脚本或工作流中集成。


安装 FFmpeg

在大多数现代 Linux 发行版中,安装 FFmpeg 非常简单。

基于 Debian/Ubuntu 的系统 (使用 apt)

# 更新软件包列表
sudo apt update
# 安装 FFmpeg
sudo apt install ffmpeg
# (可选) 安装一些常用的编码器,如 libx265 (HEVC) 和 libvpx (VP9)
sudo apt install libavcodec-extra

基于 RHEL/CentOS/Fedora 的系统 (使用 dnf/yum)

# 对于 Fedora / CentOS 8+ / RHEL 8+
sudo dnf install ffmpeg
# 对于 CentOS 7 / RHEL 7
sudo yum install epel-release
sudo yum install ffmpeg

基于 Arch Linux 的系统 (使用 pacman)

sudo pacman -S ffmpeg

验证安装

安装完成后,打开终端,输入以下命令检查版本:

FFmpeg Linux教程怎么学?-图2
(图片来源网络,侵删)
ffmpeg -version

如果看到版本信息,说明安装成功。


核心概念:你必须知道的三大组件

理解 FFmpeg 的核心工作流程,你需要先认识它最常用的三个工具:

  1. ffmpeg: 核心命令行工具,它用于读取、转换、输出音视频数据,这是你日常使用最频繁的命令。
  2. ffprobe: 分析工具,用于探测音视频文件的详细信息,如格式、编码、时长、码率、帧率、分辨率等,而不会对文件进行任何修改,在处理未知文件时非常有用。
  3. ffplay: 简单的播放器,一个基于 FFmpeg 的命令行播放器,可以用来快速播放音视频文件,或者测试滤镜效果。

基本语法结构

FFmpeg 的命令遵循一个基本模式:

ffmpeg [输入选项] -i <输入文件> [输出选项] <输出文件>
  • ffmpeg: 调用主程序。
  • [输入选项]: 专门用于输入文件的参数,如 -ss(开始时间)、-t(持续时间)。
  • -i <输入文件>: -i 是 "input" 的缩写,后面跟着你要处理的文件路径,一个命令可以有多个 -i,表示多个输入源(视频和音频分开)。
  • [输出选项]: 专门用于输出文件的参数,如 -c:v(视频编码器)、-b:v(视频码率)。
  • <输出文件>: 最终生成的文件路径。

常用操作与实战案例

让我们通过一些最常见的例子来学习 FFmpeg 的使用。

FFmpeg Linux教程怎么学?-图3
(图片来源网络,侵删)

案例 1:视频格式转换 (如 MP4 转 MKV)

这是最简单的用法,FFmpeg 会自动选择合适的编码器。

# 将 input.mp4 转换为 output.mkv,视频和音频编码保持不变
ffmpeg -i input.mp4 output.mkv

案例 2:提取视频中的音频

你想从视频中保存音频部分吗?很简单。

# 提取 input.mp4 的音频,保存为 output.mp3 (自动转码为 MP3)
ffmpeg -i input.mp4 output.mp3
# 提取音频并保持原始格式 (如 AAC)
ffmpeg -i input.mp4 -vn -c:a copy output.aac
# -vn: 禁用视频
# -c:a copy: 直接复制音频流,不进行重新编码,速度最快,质量无损

案例 3:从视频中提取图片帧

想把视频中的某一帧保存为图片吗?

# 从视频中提取第 30 秒的帧,保存为高质量图片 output.jpg
ffmpeg -i input.mp4 -ss 00:00:30 -vframes 1 output.jpg
# -ss: 指定时间点 (HH:MM:SS.ms)
# -vframes 1: 只提取 1 帧

案例 4:压缩视频文件大小

压缩视频主要通过降低码率和分辨率来实现。

方法 A:通过码率压缩 (适用于在线视频)

# 将视频码率固定为 1M,文件大小会显著减小,但可能损失画质
ffmpeg -i input.mp4 -b:v 1M -b:a 128k output.mp4
# -b:v 1M: 视频码率为 1 Megabit/s
# -b:a 128k: 音频码率为 128 Kilobit/s

方法 B:通过 CRF (Constant Rate Factor) 压缩 (推荐)

CRF 是 H.264/H.265/VP9 等编码器的一种质量控制方法,值越高质量越好,文件越大。

  • H.264: 通常范围是 18-28,23 是默认值。
  • H.265: 通常范围是 28-30,28 是默认值。
# 使用 H.264 编码,CRF 设为 28 (比默认 23 压缩率更高,画质稍差)
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -c:a copy output.mp4
# 使用 H.265 (HEVC) 编码,CRF 设为 28,文件更小
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -c:a copy output.mp4

案例 5:合并多个视频文件

FFmpeg 本身不能直接按顺序合并视频(因为需要解码再编码,会损失画质且慢),但可以通过一个文本列表文件来实现无损合并。

假设你有 part1.mp4, part2.mp4, part3.mp4

  1. 创建一个名为 mylist.txt 的文件,内容如下:

    file 'part1.mp4'
    file 'part2.mp4'
    file 'part3.mp4'

    注意: 路径必须是相对于 mylist.txt 文件的相对路径,或者使用绝对路径。

  2. 使用 concat demuxer 进行合并:

    ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4
    # -f concat: 指定输入格式为 concat
    # -safe 0: 允许使用绝对路径或特殊字符
    # -c copy: 直接复制流,不重新编码,实现无损快速合并

案例 6:裁剪视频的某一部分

裁剪可以从时间空间两个维度进行。

A. 裁剪时间片段

# 从第 30 秒开始,截取 10 秒的视频,保存为 output.mp4
ffmpeg -i input.mp4 -ss 00:00:30 -t 10 -c copy output.mp4

B. 裁剪画面区域 (缩小画幅)

# 将画面缩小到中心的一个 800x600 的矩形区域
ffmpeg -i input.mp4 -filter:v "crop=800:600" output.mp4

案例 7:为视频添加字幕/水印

A. 添加硬字幕(将字幕“烧”进视频画面)

假设你有一个 subtitles.ass 字幕文件。

ffmpeg -i input_video.mp4 -vf "subtitles=subtitles.ass" output_video.mp4

B. 添加图片水印

假设你有一个 logo.png 水印图片,想放在右下角。

ffmpeg -i input_video.mp4 -i logo.png -filter_complex "overlay=main_w-overlay_w-10:main_h-overlay_h-10" output_video.mp4
# -filter_complex: 用于处理复杂的滤镜
# overlay: 水印滤镜
# main_w-overlay_w-10: 水平位置 (视频宽度 - 水印宽度 - 10像素右边距)
# main_h-overlay_h-10: 垂直位置 (视频高度 - 水印高度 - 10像素下边距)

案例 8:录制屏幕或摄像头

A. 录制整个屏幕

# -f x11grab: 指定使用 X11grab 来抓取屏幕
# -s: 分辨率 (1920x1080)
# -i : 指定抓取的屏幕区域 (:0.0 表示整个默认屏幕)
# -r: 帧率
ffmpeg -f x11grab -s 1920x1080 -i :0.0 -r 30 output.mp4

B. 录制摄像头

# /dev/video0 通常是第一个摄像头设备
# -f v42l2: 指定使用 Video4Linux2 驱动
# -s: 摄像头分辨率
# -i: 摄像头设备
ffmpeg -f v4l2 -s 640x480 -i /dev/video0 -r 30 output.mp4

进阶技巧与参数详解

视频编码器 (-c:v)

指定视频编码器,选择合适的编码器是控制质量和文件大小的关键。

  • libx264: 目前最流行的 H.264 编码器,兼容性好,压缩率高。
  • libx265: H.265 (HEVC) 编码器,压缩率比 x264 更高,但更消耗 CPU。
  • libvpx: Google 的 VP8/VP9 编码器,适合 Web 视频。
  • copy: 直接复制视频流,不进行转码,用于快速封装格式转换。
ffmpeg -i input.mp4 -c:v libx265 output.mp4

音频编码器 (-c:a)

指定音频编码器。

  • aac: 最常用的音频编码器。
  • mp3: 经典的音频编码器。
  • copy: 直接复制音频流。
ffmpeg -i input.mp4 -c:a aac output.mp4

码率控制 (-b:v, -crf)

  • 平均码率 -b:v: 设定一个目标平均码率。-b:v 1M 表示 1Mbps。
  • CRF (Constant Rate Factor) -crf: 设定一个恒定的质量因子。对于 H.264/H.265,推荐使用 CRF
    • H.264: 18 (无损) ~ 28 (较小文件)
    • H.265: 28 (无损) ~ 30 (较小文件)

视频分辨率 (-s)

改变视频的分辨率。-s 1280x720

帧率 (-r)

改变视频的帧率。-r 24 表示每秒 24 帧。

视频过滤器 (-vf)

-vf-filter:v 的简写,用于应用视频滤镜,FFmpeg 的滤镜功能非常强大,可以通过一个链或图来组合使用。

示例:调整视频亮度和对比度

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

示例:视频缩放

# 将视频缩放到 854x480 (16:9)
ffmpeg -i input.mp4 -vf "scale=854:480" output.mp4

实用技巧:使用 FFmpeg 脚本批处理

当你需要对一个文件夹里的所有文件进行相同操作时,脚本就派上用场了。

示例:批量转换当前目录下所有 .mp4 文件为 .mkv

创建一个名为 convert.sh 的文件:

#!/bin/bash
# 遍历当前目录下所有 .mp4 文件
for file in *.mp4; do
  # 获取不带扩展名的文件名
  filename="${file%.*}"
  # 执行转换
  echo "Converting $file to ${filename}.mkv..."
  ffmpeg -i "$file" "${filename}.mkv"
done
echo "All conversions complete!"

然后赋予执行权限并运行:

chmod +x convert.sh
./convert.sh

总结与资源

FFmpeg 是一个功能极其强大的工具,本教程只是触及了它的皮毛,掌握它的关键在于:

  1. 多练习:尝试修改参数,观察输出结果的变化。
  2. 善用帮助ffmpeg -h 可以查看所有选项,ffmpeg -encoders 可以查看所有可用的编码器。
  3. 学会分析:遇到问题时,先用 ffprobe 分析输入文件,用 ffmpeg-report 选项生成详细的日志。

推荐资源

  • 官方文档: FFmpeg Documentation (最权威,但比较晦涩)
  • FFmpeg Wiki: FFmpeg Wiki (社区维护,有很多实用的教程和技巧)
  • Command Line Fu: 一个收集了各种命令行技巧的网站,搜索 "ffmpeg" 可以发现很多巧妙的用法。
  • 视频教程: 在 YouTube 上搜索 "FFmpeg tutorial",有很多优秀的视频教程。

希望这份教程能帮助你顺利入门 FFmpeg,并在 Linux 的世界里玩转音视频!

分享:
扫描分享到社交APP
上一篇
下一篇