三、FFmpeg学习笔记
FFmpeg是一个开源、跨平台的多媒体处理框架,能够实现音视频的录制、转换、剪辑、编码、解码、流媒体传输、过滤与后期处理等几乎所有常见的多媒体操作。其强大之处在于几乎支持所有的音视频格式、编解码器和封装格式,是业界公认的“瑞士军刀”。
FFmpeg 既提供了命令行工具,也封装了众多底层库供其他程序调用。
1、 FFmpeg 的组件体系与架构
FFmpeg 的架构主要可分为两大部分:命令行工具 、 底层核心库。
1.1、命令行工具
主要包括:
FFmpeg
核心转换工具,用于音视频格式转换、剪辑、拼接、压缩、添加滤镜、水印、推流等操作。
示例:将 MP4 转换为 AVIffmpeg -i input.mp4 output.avi
FFplay
基于SDL的简单播放器,支持实时播放大部分格式的音视频文件。
示例:播放视频ffplay input.mp4
FFprobe
用于检测和提取多媒体文件信息(如流信息、码率、帧率、分辨率、元数据等),类似MediaInfo。
示例:查看媒体文件详细信息ffprobe input.mp4
FFserver
早期提供的流媒体服务器,用于实时推流,目前已废弃或不推荐使用。
1.2、核心库
FFmpeg 内部实现了大量功能,主要通过以下库实现:
libavcodec
提供音视频的编码与解码功能,内含数百种编解码器(如H.264、H.265、VP9、AAC、MP3等)。
应用场景:- 将编码视频解码为原始帧供后续处理
- 将原始视频帧重新编码成目标格式
libavformat
负责多媒体封装与解封装,处理各种容器格式(如MP4、AVI、MKV、FLV、MOV等)的读写。
应用场景:- 从文件或网络流中读取数据包
- 将音视频数据写入指定格式的输出文件
参考资料:
ru.wikipedia.orglibavutil
提供常用工具函数与数据结构,包括内存管理、数学运算、日志记录、数据格式转换、颜色空间转换等。
应用场景:- 为各个组件提供基础支持
- 数据结构(如
AVFrame、AVPacket)的管理
参考资料:
ru.wikipedia.orglibswscale
专注于图像缩放、像素格式转换(例如YUV转RGB)、颜色空间转换。
应用场景:- 改变视频分辨率
- 将视频帧从一种像素格式转换到另一种格式
参考资料:
ru.wikipedia.orglibswresample
用于音频重采样、通道转换及格式转换。
应用场景:- 将音频采样率从 44.1
kHz转换到 48kHz - 单声道转立体声等
参考资料:
ru.wikipedia.org- 将音频采样率从 44.1
libavfilter
提供视频和音频滤镜,构建过滤器图(filtergraph),可以在解码和编码之间对媒体流进行各种处理,如裁剪、缩放、去噪、旋转、颜色校正、叠加水印等。
应用场景:- 复杂的滤镜效果(例如
overlay、crop、rotate等) - 构建多级处理流水线
参考资料:
ru.wikipedia.org- 复杂的滤镜效果(例如
libpostproc
用于视频后处理,比如去噪、锐化,尽管在新版本中使用频率逐渐下降。参考资料:
ru.wikipedia.orglibavdevice
用于与硬件或操作系统提供的设备(摄像头、音频输入设备、屏幕捕获设备等)进行交互。
应用场景:- 屏幕录制、采集摄像头输入
参考资料:
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 已安装
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:只输出错误warning、info、verbose、debug:逐级详细
同时,可使用-report生成详细的运行报告文件,便于调试和性能分析
FFmpeg -report -i input.mp4 output.avi
三、FFmpeg学习笔记的更多相关文章
- 《Linux内核分析》第三周学习笔记
<Linux内核分析>第三周学习笔记 构造一个简单的Linux系统MenuOS 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.stud ...
- Linux内核分析第三周学习笔记
linux内核分析第三周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...
- 20155303狄惟佳预备作业三Linux学习笔记
20155303狄惟佳预备作业三Linux学习笔记 初次接触Ubuntu系统以及Linux内核,了解了其产生的历史,从感性来讲,深深吸引我的是其中蕴含的珍贵的开源精神,以及Stallman等人对&qu ...
- 《Linux命令、编辑器与shell编程》第三版 学习笔记---002
<Linux命令.编辑器与shell编程>第三版 学习笔记---001 Linux命令.编辑器与shell编程 Shell准备 1.识别Shell类型 echo $0 echo $BAS ...
- python cookbook第三版学习笔记十:类和对象(一)
类和对象: 我们经常会对打印一个对象来得到对象的某些信息. class pair: def __init__(self,x,y): self.x=x self. ...
- 计算机科学导论-第三版-学习笔记-chapter1-绪论
小测验的网站找不到,小程序也找不到,这两个部分的习题就不做了. Cengage Learning - Foundations of Computer Science这上面有部分答案.这里用斜体标出.我 ...
- 20165326 java第三周学习笔记
纸质学习笔记 代码托管
- ffmpeg学习笔记
对于每一个刚開始学习的人,刚開始接触ffmpeg时,想必会有三个问题最为关心,即ffmpeg是什么?能干什么?怎么開始学习?本人前段时间開始接触ffmpeg,在刚開始学习过程中.这三个问 ...
- JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈
null.NaN.undefined三者的区别是什么? 在初次接触到JavaScript的时候,傻傻的分不清null.NaN.undefined三者到底区别何在,在实际的项目开发中也因为这个问题而困惑 ...
- Linux第三次学习笔记
#信息的表示和处理 三种重要的数字表示 1. 无符号数编码: 基于传统的二进制表示法,表示大于或者等于零的数字. 2. 补码编码: 表示有符号数整数的最常见的方式,有符号数就是只可 以为正或者为负的数 ...
随机推荐
- 收藏破10w的教程!用DeepSeek做可视化:5个案例搞定工作汇报/论文/自媒体,一键生成(保姆级喂饭,附全套模板)
大家好,我是狂师. DeepSeek作为今年爆火的AI工具,已经被广泛用于各种办公或自媒体写作创作场景,比如可以用DeepSeek辅助帮我们生成各种代码,如Python.Java.SQL.JavaSc ...
- Greenplum数据库索引解析
以下是对greenplum数据库使用总结. 创建索引 CREATE INDEX i_test_tb_state_az ON test_tb(name_en) WHERE name_en = 'AZ'; ...
- 使用Python和SymPy推导斯特林公式
引言 斯特林公式(Stirling's Approximation)是一种用来近似计算阶乘的数学公式.它是数学分析中非常重要的近似公式之一,尤其在概率论.统计学.物理学等领域中广泛应用.本文将使用 P ...
- 一条 SQL 语句在 MySQL 中的执行过程
一条 SQL 语句在 MySQL 中的执行过程 当一条 SQL 语句被提交到 MySQL 时,它会经历多个步骤,包括解析.优化.执行等.以下以 SELECT 语句为例,详细描述整个执行流程. 1. 客 ...
- php版10大设计模式,软件工程必须掌握的姿势
作为一个半路出家的php萌新,在看公司老大们的代码时无时无刻不在感叹,老大就是老大,写的代码低耦合.易扩展,我怎么就想不出这写完美的实现方式,最近看了韩大佬的视频后才明白,原来这些都是业界前辈们总结提 ...
- 痞子衡嵌入式:在含多个i.MXRT的主从系统中共享一颗Flash启动的方法与实践(上篇)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是多个i.MXRT共享一颗Flash启动的方法. 有些特殊的客户应用会采用多颗 i.MXRT 芯片设计一主多从的硬件架构(目的不一,或仿多 ...
- HttpServletResponse相关
目录 返回给客户端数据:字节流和字符流 解决返回字节流和字符流乱码问题 万能解决乱码 文件下载 tomcat提供的默认下载方式 手动编写的DownloadServlet 返回给客户端数据:字节流和字符 ...
- windows 配置jdk8环境变量
JAVA_HOME: E:\Android\Java\jdk1.8.0_131 PATH: %JAVA_HOME\%bin 也可以只配置PATH就可以,如 E:\Android\Java\jdk1.8 ...
- 从零到一:利用金仓社区数据,LoRa微调与Spring AI 构建私有化千问模型
上次我们在Coze平台上成功搭建了一个针对金仓问题的解决助手.这个智能体的核心工作流程相对简单:每次它通过HTTP接口调用插件,在金仓平台内部进行搜索,随后利用大模型的推理能力对查询结果进行分析,从而 ...
- 牛客小白月赛111 E 构造矩形
E 构造矩形 原题链接:https://ac.nowcoder.com/acm/contest/102742/E 思路: 这种询问方案数或者"价值"的题,通常解法要么是维护前缀信息 ...