三、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
相关推荐
小糖学代码4 小时前
LLM系列:1.python入门:3.布尔型对象
linux·开发语言·python
shizhan_cloud4 小时前
Shell 函数的知识与实践
linux·运维
Deng8723473484 小时前
代码语法检查工具
linux·服务器·windows
霍夫曼7 小时前
UTC时间与本地时间转换问题
java·linux·服务器·前端·javascript
月熊7 小时前
在root无法通过登录界面进去时,通过原本的普通用户qiujian如何把它修改为自己指定的用户名
linux·运维·服务器
大江东去浪淘尽千古风流人物8 小时前
【DSP】向量化操作的误差来源分析及其经典解决方案
linux·运维·人工智能·算法·vr·dsp开发·mr
赖small强9 小时前
【Linux驱动开发】NOR Flash 技术原理与 Linux 系统应用全解析
linux·驱动开发·nor flash·芯片内执行
IT运维爱好者10 小时前
【Linux】LVM理论介绍、实战操作
linux·磁盘扩容·lvm
LEEE@FPGA10 小时前
ZYNQ MPSOC linux hello world
linux·运维·服务器
郝学胜-神的一滴10 小时前
Linux定时器编程:深入理解setitimer函数
linux·服务器·开发语言·c++·程序人生