1.前置条件
本文是写给有使用git进行开发基础的读者,即需要读者对git的安装和使用都了解并掌握的。如果没这方面的基础,建议学习下。
注意,最好不要用国内邮箱,注册一个gmail,outlook等国际邮箱。
- 邮件列表服务器在国外,国内 SMTP 常被反垃圾策略拦截,导致补丁迟迟收不到、甚至直接进 Spam。
- 163 邮箱默认会把正文里的
--签名分隔符吃掉或转 HTML,容易破坏补丁格式,FFmpeg 机器人会拒收。 - 国内邮箱不支持 internationalized SMTPUTF8,若补丁标题里出现非 ASCII 字符(如中文括号、全角符号)会 550 退信。
1.1 订阅ffmpeg-devel邮件列表
由于ffmpeg现在不支持从github进行pull requests,只能通过ffmpeg-devel提交patch,所以需要先订阅。
https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-devel
进入后需要先注册:

注意,注册的邮箱是跟到时使用git提交patch时使用的邮箱(sendemail.smtpuser)是一致的。
点击订阅按钮,订阅成功后,会显示:

1.2 配置git
下面以gmail邮箱为例:
-
配置user.name和user.email(必选)
如果不需要使用git send-email方法进行邮件发送patch,则只需要配置username和email就可以了,email也可以随便使用一个邮箱,这种对于github的pull requests方式就比较简单
shellgit config --global user.name "Your Name" git config --global user.email "yourname@gmail.com" -
配置sendemail(可选)
ffmpeg提交代码需要使用git send-email方式提交,所以需要配置sendmail参数,当然此步骤不是必须的,可以在git send-email时输入这些参数,但这样每次都添加就很麻烦了:
shell
git config --global sendemail.smtpencryption tls
git config --global sendemail.smtpserver smtp.gmail.com
git config --global sendemail.smtpserverport 587
git config --global sendemail.smtpuser yourname@gmail.com
git config --global sendemail.smtppass 这里填16位授权码
注意,使用gmail邮箱,不能用邮箱密码进行发送邮箱,google现在规定应用使用邮箱时,需要用授权码,而不是登录密码。
gmail的smtp专用授权码:
Google 账号 → 安全性 → 2-步验证 → 应用专用密码 → 选「邮件」生成 16 位空格分隔串。
如果没有,就通过搜索框进行搜索应用专用密码:


- 全局配置:
可以使用vim进行统一配置,而不用一条一条命令输入:
shell
git config --global --edit

这里多了一个
smtphello = smtp.gmail.com
原因是我在send patch时失败后添加的。
2.本地修改代码
2.1 下载ffmpeg仓库
ffmpeg源码下载方式有很多,最好下载git仓库的:
shell
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
shell
git clone https://github.com/FFmpeg/FFmpeg.git
其他如码云,其他镜像地址,但注意要确保是最新的,不然你期望修改的问题可能已经修复了。
2.2 修改代码
基于最新的code,master分支进行调试代码。开发规范:
- 许可证:新增文件须用 LGPL-2.1+(首选)或 MIT/ISC/GPL-2+,并带上标准文件头;勿从随机位置复制粘贴。
- 代码必须能通过 FATE 回归测试 (
make fate),且不能破坏编译。 - 功能修改与纯格式/缩进修改必须拆成独立提交;一次邮件只发一个逻辑补丁。
2.3 添加commit信息
shell
git add .
git commit -s
## -s 会生成签名
输入修改的内容信息,注意内容清晰明了,格式如:
area/component: 简短一句话(≤ 60 字符)
详细说明"做了什么"以及"为什么这样做",可引用 CVE、Bug ID 或邮件列表线程。
如果补丁修复了外部研究人员报告的问题,在末尾致谢。
例如:
avcodec/h264dec: fix out-of-bounds access on invalid slice header
When the slice header contains a reference index greater than
the number of actually allocated frames, an array overrun
could happen. Add an explicit bounds check.
Fixes Ticket #1234.
2.4 FATE回归测试
正规操作,都要进行这步骤
3. 发送patch
第2步中已经在本地仓库commit好了patch,下面是提交patch:
3.1 生成patch文件
shell
git format-patch -s --subject-prefix=PATCH -o patches/ origin/master
在ffmpeg仓库中生成patches目录以及patch文件
3.2 发送patch
shell
git send-email --to=ffmpeg-devel@ffmpeg.org patches/0001-xxx.patch
推送过程中,可能会遇到fail的情况,可以自行查询原因解决。
推送成功,会返回OK,且自己的邮箱会有邮件收到,另外订阅的网页上会有自己的提交list:
https://lists.ffmpeg.org/archives/list/ffmpeg-devel@ffmpeg.org/

4.评审与迭代
- 小补丁默认等待 ≥3 天,大补丁 ≥1 周;维护者可要求更多时间
- 收到 Review 意见后,在原主题上发送
PATCH v2、v3...,并用git format-patch -v2 ...生成带版本号的系列。 - 若一周内无人反对且评审通过,任何有提交权限的开发者都可把补丁推送到官方仓库;未订阅推送通知的邮件列表会看到自动回执
如果反馈需要修改,则需要重新提交:
4.1 重新修改patch
根据评审意见,重新修改patch,修改后,重新commit
4.2 生成v2版本patch
shell
git format-patch -v2 -s -o patches/v2/ origin/master
4.3 找到评审邮件的 Message-ID
两种方法查找:
- 打开网页找到自己提交的list:
https://lists.ffmpeg.org/lore/ffmpeg-devel/

- 打开邮箱找到第一次提交时的邮件,使用查看邮件源的方式找到
4.4 重新提交
shell
git send-email \
--in-reply-to='20250128120018.12345@example.com' \
--to=ffmpeg-devel@ffmpeg.org \
patches/v2/****.patch
提交后,在https://lists.ffmpeg.org/archives/list/ffmpeg-devel@ffmpeg.org/可以看到自己的提交,邮箱也会收到邮件。
等待审核。