三、FFmpeg学习笔记

FFmpeg是一个开源、跨平台的多媒体处理框架,能够实现音视频的录制、转换、剪辑、编码、解码、流媒体传输、过滤与后期处理等几乎所有常见的多媒体操作。其强大之处在于几乎支持所有的音视频格式、编解码器和封装格式,是业界公认的"瑞士军刀"。
FFmpeg 既提供了命令行工具,也封装了众多底层库供其他程序调用。

参考资料:
zhuanlan.zhihu.com
zhuanlan.zhihu.com

1、 FFmpeg 的组件体系与架构

FFmpeg 的架构主要可分为两大部分:命令行工具 、 底层核心库。

1.1、命令行工具

主要包括:

  • FFmpeg

    核心转换工具,用于音视频格式转换、剪辑、拼接、压缩、添加滤镜、水印、推流等操作。

    示例:将 MP4 转换为 AVI

    bash 复制代码
    ffmpeg -i input.mp4 output.avi
  • FFplay

    基于 SDL 的简单播放器,支持实时播放大部分格式的音视频文件。

    示例:播放视频

    bash 复制代码
    ffplay input.mp4
  • FFprobe

    用于检测和提取多媒体文件信息(如流信息、码率、帧率、分辨率、元数据等),类似 MediaInfo

    示例:查看媒体文件详细信息

    bash 复制代码
    ffprobe input.mp4
  • FFserver

    早期提供的流媒体服务器,用于实时推流,目前已废弃或不推荐使用。

参考资料:
zhuanlan.zhihu.com
cnblogs.com

1.2、核心库

FFmpeg 内部实现了大量功能,主要通过以下库实现:

  • libavcodec

    提供音视频的编码与解码功能,内含数百种编解码器(如 H.264、H.265、VP9、AAC、MP3 等)。

    应用场景:

    • 将编码视频解码为原始帧供后续处理
    • 将原始视频帧重新编码成目标格式

    参考资料:
    zhuanlan.zhihu.com
    de.wikipedia.org

  • libavformat

    负责多媒体封装与解封装,处理各种容器格式(如 MP4、AVI、MKV、FLV、MOV 等)的读写。

    应用场景:

    • 从文件或网络流中读取数据包
    • 将音视频数据写入指定格式的输出文件

    参考资料:
    ru.wikipedia.org

  • libavutil

    提供常用工具函数与数据结构,包括内存管理、数学运算、日志记录、数据格式转换、颜色空间转换等。

    应用场景:

    • 为各个组件提供基础支持
    • 数据结构(如 AVFrame、AVPacket)的管理

    参考资料:
    ru.wikipedia.org

  • libswscale

    专注于图像缩放、像素格式转换(例如 YUVRGB)、颜色空间转换。

    应用场景:

    • 改变视频分辨率
    • 将视频帧从一种像素格式转换到另一种格式

    参考资料:
    ru.wikipedia.org

  • libswresample

    用于音频重采样、通道转换及格式转换。

    应用场景:

    • 将音频采样率从 44.1kHz 转换到 48kHz
    • 单声道转立体声等

    参考资料:
    ru.wikipedia.org

  • libavfilter

    提供视频和音频滤镜,构建过滤器图(filtergraph),可以在解码和编码之间对媒体流进行各种处理,如裁剪、缩放、去噪、旋转、颜色校正、叠加水印等。

    应用场景:

    • 复杂的滤镜效果(例如 overlay、crop、rotate 等)
    • 构建多级处理流水线

    参考资料:
    ru.wikipedia.org

  • libpostproc

    用于视频后处理,比如去噪、锐化,尽管在新版本中使用频率逐渐下降。

    参考资料:
    ru.wikipedia.org

  • libavdevice

    用于与硬件或操作系统提供的设备(摄像头、音频输入设备、屏幕捕获设备等)进行交互。

    应用场景:

    • 屏幕录制、采集摄像头输入

    参考资料:
    ru.wikipedia.org

2、FFmpeg 安装与编译

FFmpeg 可以在多种平台上安装和编译。以下是常见平台的安装方法:

2.1、Windows
  • 下载预编译版本(静态或动态链接库):
    FFmpeg 官网下载

  • 或通过 Windows 包管理工具(如 Chocolatey)进行安装:

    bash 复制代码
    choco install FFmpeg
2.2、Linux
  • Ubuntu/Debian 系统中,可以直接安装:

    bash 复制代码
    sudo apt update
    sudo apt install FFmpeg
  • 若需要自定义编译配置(例如裁剪不需要的组件、启用硬件加速),下载源码后执行:

    bash 复制代码
    ./configure --enable-gpl --enable-nonfree --enable-libx264 --enable-libx265 --enable-libfdk-aac
    make
    sudo make install

    ※ 注意:某些库(如 libfdk-aac)可能因专利问题需要启用 nonfree 选项

    参考资料:
    blog.csdn.net
    cloud.baidu.com

2.3 macOS
  • 使用 Homebrew 进行安装:

    bash 复制代码
    brew install `FFmpeg`

此外,还可根据需要启用其他扩展库,如 SDL、NVIDIA NVENC、Intel QSV 等。

3、FFmpeg 常用命令详解

下面给出一些常用命令及其详细解释:

3.1、查看版本及支持功能
  • 查看版本、编译参数、支持的格式、编码器等:

    bash 复制代码
    FFmpeg -version
    FFmpeg -formats
    FFmpeg -codecs
    FFmpeg -protocols
    FFmpeg -filters
3.2、格式转换
  • 视频格式转换

    MP4 转换为 AVI

    bash 复制代码
    FFmpeg -i input.mp4 output.avi

    FFmpeg 根据文件扩展名自动选择封装器,但也可以使用 -f 强制指定格式。

  • 只提取音频

    从视频中提取音频,且不重新编码音频流(复制原始数据):

    bash 复制代码
    FFmpeg -i input.mp4 -vn -acodec copy output.aac

    参数说明:

    • -vn:忽略视频流
    • -acodec copy:直接复制音频数据
  • 只提取视频(无音频)

    bash 复制代码
    FFmpeg -i input.mp4 -an output.mp4

    参数说明:

    • -an:忽略音频流
3.3、视频剪辑与合并
  • 视频剪辑

    截取视频片段(从 00:01:00 开始,持续 10 秒):

    bash 复制代码
    FFmpeg -i input.mp4 -ss 00:01:00 -t 10 -c copy output.mp4

    参数说明:

    • -ss:设置起始时间
    • -t:设置持续时间
    • -c copy:无重新编码,快速剪切
  • 视频合并

    创建一个文本文件(如 filelist.txt),内容如下:

    nginx 复制代码
    file 'part1.mp4'
    file 'part2.mp4'
    file 'part3.mp4'

    然后执行:

    bash 复制代码
    FFmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4

    参数说明:

    • -f concat:指定合并模式
    • -safe 0:允许使用绝对路径
3.4、添加滤镜和特效
  • 缩放视频分辨率

    将视频分辨率调整为 1280 x 720

    bash 复制代码
    FFmpeg -i input.mp4 -vf scale=1280:720 output.mp4

    或者使用 -s 1280x720,但 -vf scale 更灵活。

  • 添加水印

    叠加图片水印,位置距离左上角 10 像素:

    bash 复制代码
    FFmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4

    参数说明:

    • -filter_complex:创建复杂滤镜图
    • overlay=10:10:设置水印位置
  • 添加字幕

    SRT 格式字幕嵌入视频:

    bash 复制代码
    FFmpeg -i input.mp4 -vf subtitles=subtitles.srt output.mp4
  • 生成 GIF 动图

    从视频生成 GIF,调整帧率和宽度自适应:

    bash 复制代码
    FFmpeg -i input.mp4 -vf "fps=10,scale=320:-1" output.gif

    参数说明:

    • fps=10:每秒 10 帧
    • scale=320:-1:宽度为 320,高度自适应保持比例
3.5、录屏和流媒体推送
  • 屏幕录制(Windows 下可使用 gdigrab

    bash 复制代码
    FFmpeg -f gdigrab -framerate 25 -i desktop -c:v libx264 -preset fast output.mp4
  • 直播推流

    推流至 RTMP 服务器(例如直播平台):

    bash 复制代码
    FFmpeg -re -i input.mp4 -c:v libx264 -preset fast -f flv rtmp://live.example.com/app/stream_key

    参数说明:

    • -re:按真实速度读取输入(适用于直播推流)
    • -f flv:RTMP 通常要求 FLV 封装
3.6、调整编码设置与硬件加速
  • 指定编码器与质量控制

    使用 libx264 编码视频,并通过 CRF 参数控制质量(数值越低质量越高):

    bash 复制代码
    FFmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium output.mp4

    参数说明:

    • -crf:恒定质量控制参数(一般范围 18-28)
    • -preset:编码速度与压缩率平衡(ultrafast 到 veryslow)
  • 硬件加速编码
    NVIDIA GPU 下使用 NVENC 加速:

    bash 复制代码
    FFmpeg -i input.mp4 -c:v h264_nvenc -preset fast output.mp4

    Intel QuickSync 示例:

    bash 复制代码
    FFmpeg -i input.mp4 -c:v h264_qsv output.mp4

    参数说明:

    • 使用专门的硬件编码器可以大幅提高转码速度,但需保证对应驱动和 SDK 已安装

    参考资料:
    zhuanlan.zhihu.com
    blog.csdn.net

4、FFmpeg 滤镜系统详解

FFmpeg 的滤镜(Filter)系统非常灵活,可以构建一个或多个过滤器组成的滤镜图(Filtergraph)来处理音视频数据。

常见视频滤镜包括:

  • crop:裁剪视频画面
  • scale:缩放视频
  • rotate/transpose:旋转或转置视频
  • overlay:叠加图像(水印效果)
  • drawtext:添加文字
  • fade:淡入淡出效果

常见音频滤镜包括:

  • volume:调整音量
  • atempo:改变播放速度(音调保持不变)
  • afade:音频淡入淡出
  • aecho:添加回声效果

使用方法一般通过 -vf(视频滤镜)或 -af(音频滤镜)选项,复杂滤镜图使用 -filter_complex 选项。

例如,创建一个包含缩放和水印的滤镜图:

bash 复制代码
FFmpeg -i input.mp4 -i logo.png -filter_complex "[0:v]scale=1280:720[scaled]; [scaled][1:v]overlay=10:10" output.mp4

滤镜的参数、语法和功能请参阅 FFmpeg 官方文档与社区教程

参考资料:
ru.wikipedia.org
cnblogs.com

5、编译与定制 FFmpeg

对于开发者来说,有时需要根据实际需求裁剪或定制 FFmpeg 的功能。例如:

  • 配置参数

    使用

    bash 复制代码
    ./configure --help

    可以查看所有支持的编译选项。常用选项包括:

    • --enable-gpl--enable-nonfree:启用 GPL 或非自由模块(如 libfdk-aac)
    • --disable-static--enable-shared:控制生成静态库或动态库
    • --enable-libx264--enable-libx265 等:启用特定的第三方库支持
  • 交叉编译

    对于嵌入式系统或 Android、iOS 平台,需要配置交叉编译工具链和平台特定参数

    示例(Android ARM):

    bash 复制代码
    ./configure --prefix=./android --cross-prefix=<toolchain-prefix> --arch=arm --target-os=linux --enable-cross-compile --disable-static --enable-shared
    make -j4 && make install
  • 裁剪不需要的模块

    可通过

    bash 复制代码
    --disable-<module>

    来去除不需要的组件,从而减小二进制文件体积

    例如:如果不需要 ffplay,则使用

    bash 复制代码
    --disable-ffplay

    参考资料:
    blog.csdn.net

6、调试与日志

FFmpeg 内置了丰富的日志系统,可以通过 -loglevel 参数设置日志级别,例如:

  • quiet:安静模式,不输出日志
  • error:只输出错误
  • warninginfoverbosedebug:逐级详细
    同时,可使用 -report 生成详细的运行报告文件,便于调试和性能分析
bash 复制代码
FFmpeg -report -i input.mp4 output.avi
相关推荐
用户967151139167216 小时前
Rust 如何轻松实现 RTMP 流媒体推送?深入解析直播推流场景与解决方案
rust·ffmpeg
小小码农Come on16 小时前
ffmpeg命令整理
ffmpeg
cg501717 小时前
Spring Boot 的配置文件
java·linux·spring boot
rainFFrain17 小时前
单例模式与线程安全
linux·运维·服务器·vscode·单例模式
GalaxyPokemon17 小时前
Muduo网络库实现 [九] - EventLoopThread模块
linux·服务器·c++
mingqian_chu18 小时前
ubuntu中使用安卓模拟器
android·linux·ubuntu
GalaxyPokemon19 小时前
Muduo网络库实现 [十] - EventLoopThreadPool模块
linux·服务器·网络·c++
自由鬼19 小时前
开源虚拟化管理平台Proxmox VE部署超融合
linux·运维·服务器·开源·虚拟化·pve