FFmpeg 7.1.1 | 调试 ffmpeg.c 环境 - Widows&Clion&WSL

1. 调试 ffmpeg.c 有什么意义

想要开启一段 音视频开发 的旅程,FFmpeg 将是你最具威力的武器。但是目前网上的教程都非常古老,而且很少有系统性的系列。2025 年 FFmpeg 已经来到 7.x , 但书籍、或网上的文章基本上止步于 4.x 。

一般文章能够做到 授之以鱼 就算非常不错了,但是在技术框架的大版本变动后,这些鱼也将逐渐变得腐烂、甚至毒害。我一直在思考,对于文章来说,用什么方式可以减小技术版本升级带来的负面压力。正所谓 授之以鱼,不如授之以渔

ffmpeg 命令行工具可以执行很多音视频操作,而且它就在 ffmpeg 的源码之中。只要有分析它的能力,那无论 FFmpeg 版本变到到少,你都有能力去得到最鲜活的鱼。

ffmpeg.c 是整个 FFmpeg 命令行工具的入口,也就是你每次在终端输入

ffmpeg -i input.mp4 output.mp4

这类命令时,真正开始运行的就是这个文件。调试的过程也可以顺便学会怎么在 WSL 里编译 C 项目、用 GDB 或 CLion 调试大型代码,这些都是编程开发必须掌握的技能。


2. 搭建调试环境准备

目前我是在 Windows 上基于 WSL , 通过 Clion 调试。至于 Clion、WSL 怎么安装,这里就不引申了。

操作系统 : Windows

开发IDE : CLion

工具链: WSL

  • 由于使用的是 WSL,也就是 Windows 的 Linux 子系统,所以 Macos 和 Ubuntu 等 Linux 系统的调试环境也是类似的。

[1]. 准备原材料 : 在当前目录下克隆 ffmpeg 仓库

bash 复制代码
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg

[2]. 工具链准备: 在 WSL 中安装工具链

arduino 复制代码
sudo apt update
sudo apt install git build-essential yasm pkg-config libx264-dev libx265-dev libvpx-dev libfdk-aac-dev libmp3lame-dev libopus-dev gdb

然后在 Clion 中的 Settings 中,添加工具链环境。选择 WSL :

到这里我们所需的环境就准备完毕了。接下来看看如何把 ffmpeg 的源码编译为可以调试的项目。


3. 调试 ffmpeg.c

首先,打开下载的 ffmpeg 项目源码,ffmpeg.c 的代码在 fftoools 中。在同调试之前,需要在控制台 configure 一下,然后 make 来自动编译项目:

dart 复制代码
./configure --disable-optimizations --disable-stripping --enable-debug
make -j$(nproc)

然后点击 all -> Edit Configurations 配置:

可执行文件选择刚才生成的 ffmpeg_g 文件。_g 后缀通常表示"debug 版本" ,带有调试符号,未进行优化,适合用 GDB 等调试器调试。

这样,打上断点,点击调试按钮就可以愉快地调试了~


尾声

调试 ffmpeg.c 能帮助我们深入理解 FFmpeg 命令的执行流程,包括参数解析、转码调用等关键环节。通过实际调试,不仅能快速定位问题、便于二次开发,还能提升我们对大型 C 项目的掌控能力。相比单纯阅读源码,调试是一种更高效、更直观的学习方式。无论是功能定制、Bug 修复,还是提升调试工具链的使用能力,搭建调试环境都是迈向深入掌握 FFmpeg 的关键一步。

后面有时间,我会基于对 ffmpeg.c 的调试研究,分享一些音视频相关的

相关推荐
前行的小黑炭1 小时前
Android Lifecycle代码分析:为什么使用;注解的方式为什么过期?源码分析;状态与事件
android
和煦的春风1 小时前
案例分析 | SurfaceFlinger 大片Runnable引起的卡顿
android·linux
浩宇软件开发2 小时前
Android开发,实现一个简约又好看的登录页
android·java·android studio·android开发
未扬帆的小船2 小时前
在gpt的帮助下安装chales的证书,用于https在root情况下抓包
android·charles
万户猴2 小时前
【 Android蓝牙-十】Android各版本蓝牙行为变化与兼容性指南
android·蓝牙
努力努力再努力wz4 小时前
【Linux实践系列】:进程间通信:万字详解命名管道实现通信
android·linux·运维·服务器·c++·c
百锦再4 小时前
Android Studio 中使用 SQLite 数据库开发完整指南(Kotlin版本)
android·xml·学习·sqlite·kotlin·android studio·数据库开发
Gerry_Liang5 小时前
Java基础361问第16问——枚举为什么导致空指针?
android·java·开发语言
RichardLai885 小时前
[Flutter 基础] - Flutter基础组件 - Image
android·flutter