当前位置: 首页 > article >正文

三、FFmpeg学习笔记

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

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

1、 FFmpeg 的组件体系与架构

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

1.1、命令行工具

主要包括:

  • FFmpeg
    核心转换工具,用于音视频格式转换、剪辑、拼接、压缩、添加滤镜、水印、推流等操作。
    示例:将 MP4 转换为 AVI

    ffmpeg -i input.mp4 output.avi
    
  • FFplay
    基于 SDL 的简单播放器,支持实时播放大部分格式的音视频文件。
    示例:播放视频

    ffplay input.mp4
    
  • FFprobe
    用于检测和提取多媒体文件信息(如流信息、码率、帧率、分辨率、元数据等),类似 MediaInfo
    示例:查看媒体文件详细信息

    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)进行安装:

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

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

    ./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 进行安装:

    brew install `FFmpeg`
    

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

3、FFmpeg 常用命令详解

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

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

    FFmpeg -version
    FFmpeg -formats
    FFmpeg -codecs
    FFmpeg -protocols
    FFmpeg -filters
    
3.2、格式转换
  • 视频格式转换
    MP4 转换为 AVI

    FFmpeg -i input.mp4 output.avi
    

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

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

    FFmpeg -i input.mp4 -vn -acodec copy output.aac
    

    参数说明:

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

    FFmpeg -i input.mp4 -an output.mp4
    

    参数说明:

    • -an:忽略音频流
3.3、视频剪辑与合并
  • 视频剪辑
    截取视频片段(从 00:01:00 开始,持续 10 秒):

    FFmpeg -i input.mp4 -ss 00:01:00 -t 10 -c copy output.mp4
    

    参数说明:

    • -ss:设置起始时间
    • -t:设置持续时间
    • -c copy:无重新编码,快速剪切
  • 视频合并
    创建一个文本文件(如 filelist.txt),内容如下:

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

    然后执行:

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

    参数说明:

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

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

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

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

    FFmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4
    

    参数说明:

    • -filter_complex:创建复杂滤镜图
    • overlay=10:10:设置水印位置
  • 添加字幕
    SRT 格式字幕嵌入视频:

    FFmpeg -i input.mp4 -vf subtitles=subtitles.srt output.mp4
    
  • 生成 GIF 动图
    从视频生成 GIF,调整帧率和宽度自适应:

    FFmpeg -i input.mp4 -vf "fps=10,scale=320:-1" output.gif
    

    参数说明:

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

    FFmpeg -f gdigrab -framerate 25 -i desktop -c:v libx264 -preset fast output.mp4
    
  • 直播推流
    推流至 RTMP 服务器(例如直播平台):

    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 参数控制质量(数值越低质量越高):

    FFmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium output.mp4
    

    参数说明:

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

    FFmpeg -i input.mp4 -c:v h264_nvenc -preset fast output.mp4
    

    Intel QuickSync 示例:

    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 选项。
例如,创建一个包含缩放和水印的滤镜图:

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 的功能。例如:

  • 配置参数

    使用

    ./configure --help
    

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

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

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

    示例(Android ARM):

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

    可通过

    --disable-<module>
    

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

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

    --disable-ffplay
    

    参考资料:
    blog.csdn.net

6、调试与日志

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

  • quiet:安静模式,不输出日志
  • error:只输出错误
  • warninginfoverbosedebug:逐级详细
    同时,可使用 -report 生成详细的运行报告文件,便于调试和性能分析
FFmpeg -report -i input.mp4 output.avi

相关文章:

三、FFmpeg学习笔记

​ FFmpeg是一个开源、跨平台的多媒体处理框架&#xff0c;能够实现音视频的录制、转换、剪辑、编码、解码、流媒体传输、过滤与后期处理等几乎所有常见的多媒体操作。其强大之处在于几乎支持所有的音视频格式、编解码器和封装格式&#xff0c;是业界公认的“瑞士军刀”。 FFmp…...

Linux常用基础命令应用

目录 一、文件与目录操作&#xff08;12个核心命令&#xff09;​​ ​​1. pwd - 显示当前路径​​ ​​2. ls - 查看目录内容​​ ​​3. cd - 切换目录​​ ​​4. mkdir - 创建目录​​ ​​5. touch - 创建文件​​ ​​6. cp - 复制文件/目录​​ ​​7. mv - 移动…...

【python中级】关于Cython 的源代码pyx的说明

【python中级】关于Cython 的源代码pyx的说明 1.背景2.编译3.语法1.背景 Cython 是一个编程语言和工具链,用于将 Python 代码(或类 Python 的代码)编译成 C 语言,再进一步生成高性能的 Python 扩展模块(.so 或 .pyd 文件)。 在 Python 中,.pyx 文件是 Cython 的源代码文…...

第十八节课:Python编程基础复习

课程复习 前三周核心内容回顾 第一周&#xff1a;Python基本语法元素 基础语法&#xff1a;缩进、注释、变量命名、保留字数据类型&#xff1a;字符串、整数、浮点数、列表程序结构&#xff1a;赋值语句、分支语句&#xff08;if&#xff09;、函数输入输出&#xff1a;inpu…...

MySQL vs MSSQL 对比

在企业数据库管理系统中&#xff0c;MySQL 和 Microsoft SQL Server&#xff08;MSSQL&#xff09;是最受欢迎的两大选择。MySQL 是一款开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由 MySQL AB 开发&#xff0c;现归属于 Oracle 公司。而 MSSQL 是微…...

解决LeetCode“使括号有效的最少添加”问题

目录 问题描述 解题思路 复杂度分析 示例分析 暴力替换“不讲码德” 总结 问题描述 给定一个仅由 ( 和 ) 组成的字符串 s&#xff0c;我们需要通过添加最少数量的括号&#xff08;( 或 )&#xff09;使得字符串有效。有效字符串需满足&#xff1a; 空字符串是有效的。 …...

python基础-10-组织文件

文章目录 【README】【10】组织文件&#xff08;复制移动删除重命名&#xff09;【10.1】shutil模块(shell工具)【10.1.1】复制文件和文件夹【10.1.1.1】复制文件夹及其下文件-shutil.copytree 【10.1.2】文件和文件夹的移动与重命名【10.1.3】永久删除文件和文件夹【10.1.4】用…...

ORA-09925 No space left on device 问题处理全过程记录

本篇文章关键字&#xff1a;linux、oracle、审计、ORA-09925 一、故障现像 朋友找到我说是他们备份软件上报错。 问题比较明显&#xff0c;ORA-09925&#xff0c;看起来就是空间不足导致的 二、问题分析过程 这里说一下逐步的分析思路&#xff0c;有个意外提前说一下就是我…...

多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测

多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测 目录 多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测&#…...

27信号和槽_自定义信号(2)

自定义信号和槽 绑定信号和槽 如何才能触发出自定义的信号呢?&#xff08;上诉代码只是将信号和槽绑定在一起&#xff0c;但并没有触发信号&#xff09; Qt 内置的信号,都不需要咱们手动通过代码来触发 用户在 GUI, 进行某些操作,就会自动触发对应信号.(发射信号的代码已经内置…...

人工智能在生物医药领域的应用地图:AIBC2025将于6月在上海召开!

人工智能在生物医药领域的应用地图&#xff1a;AIBC2025将于6月在上海召开&#xff01; 近年来&#xff0c;人工智能在生物医药行业中的应用受到广泛关注。 2024年10月&#xff0c;2024诺贝尔化学奖被授予“计算蛋白质设计和蛋白质结构预测”&#xff0c;这为行业从业人员带来…...

2025.3.19

1、用vim编辑/etc/hosts文件&#xff0c;将本机和第二个虚拟机的ip地址和主机名写入该文件&#xff0c;然后ping 两个主机的主机名能否ping通&#xff1b; &#xff08;1&#xff09;在第一个虚拟机编辑/etc/hosts: 首先使用hostname、hostnamectl、hostname -f指令查看主机名…...

深度学习 Deep Learning 第16章 结构化概率模型

深度学习 Deep Learning 第16章 结构化概率模型 内容概要 本章深入探讨了结构化概率模型&#xff08;Graphical Models&#xff0c;包含有向图和无向图模型&#xff09;的概念及其在深度学习中的应用。结构化概率模型通过图结构描述随机变量之间的直接交互&#xff0c;从而简…...

HTML5 vs HTML 和 CSS3 vs CSS:全面对比

HTML5 与 HTML HTML 概述 HTML (HyperText Markup Language) 是构建网页的标准标记语言。HTML 经历了多个版本的发展&#xff1a; HTML 2.0 (1995年)&#xff1a;最早的标准化版本 HTML 4.01 (1999年)&#xff1a;增加了样式表支持 XHTML (2000年)&#xff1a;基于XML的更严…...

鸿蒙 harmonyOS 网络请求

应用通过HTTP发起一个数据请求&#xff0c;支持常见的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。 接口说明 HTTP数据请求功能主要由http模块提供。 使用该功能需要申请ohos.permission.INTERNET权限。 第一步 &#xff1a; 在module.json5文件里面添加网络…...

进程概念(Linux)

目录 一. 冯诺依曼体系结构 二. 操作系统(OS(操作系统的英文缩写Operator System)) 2.1概念 2-2 设计OS的目的 2.3 核心功能 2.4 如何管理&#xff08;先描述再组织&#xff09; 2.5 系统调用和库函数概念 三.进程 3.1 基本概念与基本操作 3.2 描述进程-PCB 3.3 如何…...

程序化广告行业(59/89):广告验证与反作弊实战技巧

程序化广告行业&#xff08;59/89&#xff09;&#xff1a;广告验证与反作弊实战技巧 大家好&#xff01;在程序化广告领域&#xff0c;想要做好投放&#xff0c;除了了解基本的架构和原理&#xff0c;还得掌握一些关键的技能&#xff0c;比如广告验证和反作弊。今天就和大家一…...

链路聚合配置命令

技术信息 加入捆绑组&#xff0c;加大链路间带宽等 配置命令 华三 静态聚合 将接口加入聚合口后再进行配置 //创建静态链路聚合口1&#xff0c;不启用lacp[SWB]interface Bridge-Aggregation 1 [SWB-Bridge-Aggregation1]port link-type trunk [SWB-Bridge-Aggregation…...

免费在线MBTI性格测试工具 - 探索你的性格特质

免费在线MBTI性格测试工具 - 探索你的性格特质 简介 我很高兴为大家分享这个专业的MBTI性格测试工具。这是一个完全免费的在线测试系统&#xff0c;基于迈尔斯-布里格斯类型指标(MBTI)理论开发&#xff0c;旨在帮助您更好地了解自己的性格特征&#xff0c;发现职业发展方向。…...

zk基础—2.架构原理和使用场景二

大纲 1.zk的使用场景 2.zk主要会被用于那些系统 3.为什么在分布式系统架构中需要使用zk集群 4.zk分布式系统具有哪些特点 5.zk集群机器的三种角色 6.客户端与zk之间的长连接和会话 7.zk的数据模型znode和节点类型 8.zk最核心的Watcher监听回调机制 9.ZAB协议的主从同步…...

AI 数理逻辑基础之统计学基本原理(上)

目录 文章目录 目录统计学统计学基本概念描述性统计数据可视化图表工具 汇总统计统计数据的分布情况&#xff1a;中位数、众数、平均值统计数据的离散程度&#xff1a;极差、方差、标准差、离散系数 相关分析Pearson 线性关系相关系数Spearman 单调关系相关系数 回归分析回归模…...

积分赛——读取实时时间

设计要求 调用DS1302芯片驱动程序&#xff0c;读取DS1302中的实时时分秒数据&#xff0c;并显示在数码管上。 23时59分59秒 通过串口发送时间作为定时时间&#xff0c;定时时间到则蜂鸣器响2s后静音。 串口发送格式&#xff1a;“12&#xff1a;35&#xff1a;66”。 备注&…...

12.青龙面板自动化我的生活

安装 docker方式 docker run -dit \ -v /root/ql:/ql/data \ -p 5700:5700 \ -e ENABLE_HANGUPtrue \ -e ENABLE_WEB_PANELtrue \ --name qinglong \ --hostname qinglong \ --restart always \ whyour/qinglongk8s方式 https://truecharts.org/charts/stable/qinglong/ he…...

进程和线程的概念及Linux操作

文章目录 一、进程与线程1、进程2、线程3、查看进程与线程 二、Linux的“虚拟内存管理”&#xff0c;它与stm32中的 真实物理内存&#xff08;内存映射&#xff09;有什么区别&#xff1f;三、Linux系统调用函数 fork()、wait()、exec() 等1、fork&#xff08;&#xff09;函数…...

uniapp中uploadFile的用法

基本语法 uni.uploadFile(OBJECT)OBJECT 是一个包含上传相关配置的对象&#xff0c;常见参数如下&#xff1a; 参数类型必填说明urlString是开发者服务器地址。filePathString是要上传文件资源的本地路径。nameString是文件对应的 key&#xff0c;开发者在服务端可以通过这个 …...

VirtualBox 配置双网卡(NAT + 桥接)详细步骤

在 VirtualBox 中为 CentOS 虚拟机配置双网卡&#xff08;NAT 桥接&#xff09;&#xff0c;使其既能访问外网&#xff08;NAT&#xff09;&#xff0c;又能与宿主机&#xff08;Windows 10&#xff09;或局域网通信&#xff08;桥接&#xff09;。 步骤 1&#xff1a;关闭虚…...

APang网联科技项目报告【服务器篇】

APang网联科技&#xff1a;连接未来&#xff0c;智能领航 公司简介 APang网联科技成立于 [2005年]&#xff0c;总部位于 [广东深圳]&#xff0c;是一家集网络技术研发、系统集成、项目实施与运维服务为一体的高新技术企业。我们致力于为客户提供全方位、定制化的网络部署解决…...

[MySQL初阶]MySQL表的操作

MySQL表的操作 1. 创建表2. 查看表结构3. 修改表&#xff08;修改表的属性而非表的数据&#xff09;4. 删除表 1. 创建表 语法&#xff1a; CREATE TABLE table_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校验规则 engine 存储…...

AI助力高效PPT制作:从内容生成到设计优化

随着人工智能技术的不断发展&#xff0c;AI在各个领域的应用日益普及&#xff0c;尤其是在文档和演示文稿的创建过程中。PowerPoint&#xff08;PPT&#xff09;作为最常用的演示工具之一&#xff0c;借助AI的技术手段&#xff0c;可以极大地提高制作效率并提升最终呈现效果。在…...

《双影奇境》手机版上线?ToDesk用跨平台技术实现「全设备云电脑3A游戏」

《双影奇境》是由Hazelight Studios研发发行的一款双人合作冒险类游戏&#xff0c;玩家们在游戏中将扮演米欧和佐伊两位风格迥异的女作家&#xff0c;剧情讲述的是她们被骗进入一台意在窃取创意的机器后便陷入了自己创作的故事之中&#xff0c;并且必须相互依靠&#xff0c;努力…...