文章目录
- FFmpeg概述
-
- [🎬 FFmpeg 的核心组成](#🎬 FFmpeg 的核心组成)
- [🛠️ FFmpeg 能做什么?](#🛠️ FFmpeg 能做什么?)
- [💡 常用命令举例](#💡 常用命令举例)
- [⚙️ 如何获取与安装](#⚙️ 如何获取与安装)
- [安装ffmpeg 开发底层库](#安装ffmpeg 开发底层库)
-
- 一、每个安装项的作用
- [二、FFmpeg 核心库详细介绍(开发必知)](#二、FFmpeg 核心库详细介绍(开发必知))
-
- [1. libavutil - 工具库(基础依赖)](#1. libavutil - 工具库(基础依赖))
- [2. libavcodec - 编解码库(**最核心**)](#2. libavcodec - 编解码库(最核心))
- [3. libavformat - 封装/解封装库](#3. libavformat - 封装/解封装库)
- [4. libswscale - 图像转换与缩放库](#4. libswscale - 图像转换与缩放库)
- [5、补充常用 FFmpeg 库](#5、补充常用 FFmpeg 库)
- 总结
- 安装底层库后,系统文件发生了什么变化
-
- 一、最核心的变化:系统多了哪些文件?
-
- [1. 可执行命令(你能直接用的)](#1. 可执行命令(你能直接用的))
- [2. 开发库文件(.so 动态链接库)](#2. 开发库文件(.so 动态链接库))
- [3. 头文件(.h 开发用)](#3. 头文件(.h 开发用))
- [4. 配置文件、解码器信息、硬件支持文件](#4. 配置文件、解码器信息、硬件支持文件)
- 二、系统环境发生了什么变化?
-
- [1. **PATH 环境变量自动包含 ffmpeg 命令**](#1. PATH 环境变量自动包含 ffmpeg 命令)
- [2. **动态链接库缓存(ldconfig)自动更新**](#2. 动态链接库缓存(ldconfig)自动更新)
- [3. **APT 包数据库标记这些包已安装**](#3. APT 包数据库标记这些包已安装)
- 三、安装后,系统具备了哪些新能力?
- 四、最简单验证方式
- 接口如何调用
-
- [🧱 1. 底层接口:强大但繁琐的"C语言积木"](#🧱 1. 底层接口:强大但繁琐的“C语言积木”)
- [🚀 2. 现代封装:让调用变得像 OpenCV 一样简单](#🚀 2. 现代封装:让调用变得像 OpenCV 一样简单)
- [☁️ 3. 另一种思路:通过 REST API 远程调用](#☁️ 3. 另一种思路:通过 REST API 远程调用)
- 使用第三方库avcpp
-
- 一、windows
-
- [🛠️ 使用 vcpkg 一键安装与集成](#🛠️ 使用 vcpkg 一键安装与集成)
- [⚙️ Visual Studio 项目配置建议](#⚙️ Visual Studio 项目配置建议)
- 二、Linux
-
- [🐧 方案一:使用系统自带的包管理器(以 Ubuntu/Debian 为例)](#🐧 方案一:使用系统自带的包管理器(以 Ubuntu/Debian 为例))
- [🛠️ 方案二:使用 vcpkg 跨平台包管理器(强烈推荐)](#🛠️ 方案二:使用 vcpkg 跨平台包管理器(强烈推荐))
- 三、效果对比
-
- [FFmpeg 原生 C 语言接口](#FFmpeg 原生 C 语言接口)
- 使用avcpp第三方库接口
- FFmpeg是谁在开发和维护
-
- [👥 谁在开发和维护 FFmpeg?](#👥 谁在开发和维护 FFmpeg?)
- [❤️ 他们为什么做这些事情?](#❤️ 他们为什么做这些事情?)
- [💰 他们有收入吗?](#💰 他们有收入吗?)
FFmpeg概述
FFmpeg 是一套开源、免费且功能极其强大的跨平台音视频处理框架,在业界被广泛誉为**"音视频处理的瑞士军刀"**。只要有视频和音频的地方,背后大概率都有 FFmpeg 在运行(例如抖音、B站、YouTube 的后台转码系统,以及 VLC、OBS 等知名软件底层都大量依赖它)。
🎬 FFmpeg 的核心组成
当你安装好 FFmpeg 后,通常会包含以下三个最核心的命令行工具:
| 工具名称 | 主要用途 |
|---|---|
| ffmpeg | 核心主程序,用于音视频的转码、剪辑、合并、推流等处理操作。 |
| ffprobe | 媒体文件分析工具,用于查看视频/音频的详细参数(如时长、码率、编码格式)。 |
| ffplay | 简易播放器,基于 SDL 开发,主要用于快速预览音视频文件。 |
此外,它还包含一系列供开发者调用的底层库(如 libavcodec 编解码库、libavformat 封装库等),支撑着庞大的多媒体生态。
🛠️ FFmpeg 能做什么?
FFmpeg 几乎支持人类历史上出现过的所有音视频格式,其核心能力包括但不限于:
- 格式转换与编解码:轻松实现 MP4、AVI、MKV、MOV、WebM 等各种视频格式之间的相互转换,或提取音频转为 MP3、AAC 等。
- 视频剪辑与拼接:无需重新编码即可快速剪切视频片段,或将多个视频无缝合并成一个。
- 后期特效处理:为视频添加图片水印、烧录 SRT 字幕、调整分辨率(缩放)、修改帧率、视频降噪、色彩映射转换等。
- 截图与提取:截取视频中指定时间的缩略图,或者将视频拆解为连续的图片帧。
- 流媒体推拉流:支持 RTMP、HLS、RTSP 等协议,可以将视频推送到直播服务器,或者录制网络直播流。
- 设备录制:支持采集摄像头画面、麦克风声音,甚至进行电脑屏幕录制。
💡 常用命令举例
FFmpeg 主要通过命令行进行操作,以下是几个非常实用的基础命令示例:
- 基础格式转换 (将 input.mp4 转换为 output.avi):
ffmpeg -i input.mp4 output.avi - 无损剪切视频 (从第 10 秒开始,截取 30 秒的片段):
ffmpeg -i input.mp4 -ss 10 -t 30 -c copy output.mp4 - 提取视频中的音频 :
ffmpeg -i video.mp4 -vn -c:a copy audio.aac - 压缩视频体积 (使用 H.264 编码,CRF值越大体积越小画质越低,一般设为 23 左右):
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4 - 为视频添加图片水印 (放置在距离左上角 10px, 10px 的位置):
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4
⚙️ 如何获取与安装
- Windows :官方不提供一键安装包。你需要访问 FFmpeg 官网的下载页面,下载第三方编译好的预构建版本(推荐 Gyan.dev 或 BtbN 提供的
release essentials或full压缩包)。解压后,将其中的bin目录路径添加到系统的"环境变量"中,即可在命令行(CMD 或 PowerShell)里直接使用。 - macOS :推荐使用包管理器 Homebrew 一键安装,命令为
brew install ffmpeg。 - Linux :通常可以直接通过包管理器安装,例如 Ubuntu/Debian 系统使用
sudo apt install ffmpeg。
如果你是普通用户,觉得命令行操作过于复杂,也可以寻找一些带有图形界面(GUI)的视频处理软件(如 HandBrake、格式工厂等),它们的底层很多也是基于 FFmpeg 开发的。
安装ffmpeg 开发底层库
ffmpeg 安装之后,只是命令工具,只能用命令形式使用ffmpeg,在实际开发中要想调用接口还必须安装一系列供开发者调用的底层库(如 libavcodec 编解码库、libavformat 封装库等)。
Ubuntu/Debian 系 Linux 下完整安装命令:
bash
sudo apt install ffmpeg libavformat-dev libavcodec-dev libavutil-dev libswscale-dev -y
一、每个安装项的作用
| 包名 | 作用 |
|---|---|
| ffmpeg | FFmpeg 命令行工具本体 :提供 ffmpeg/ffplay/ffprobe 三个可执行命令,用于转码、剪辑、推流、播放、查看媒体信息等,是直接使用的工具。 |
| libavformat-dev | 封装/解封装开发库 :负责读取/写入 MP4、MKV、FLV、AVI 等文件格式和网络协议(RTSP、RTMP、HTTP 等)。 |
| libavcodec-dev | 编解码开发库 :FFmpeg 核心库,负责所有音视频编码/解码(H.264、H.265、AAC、MP3 等)。 |
| libavutil-dev | 工具函数库:提供基础公共功能(日志、内存管理、数学运算、时间戳、字符串处理等),所有其他 FFmpeg 库都依赖它。 |
| libswscale-dev | 图像缩放/格式转换库:负责画面分辨率缩放、像素格式转换(如 YUV → RGB、1080P → 720P)。 |
二、FFmpeg 核心库详细介绍(开发必知)
FFmpeg 是一套音视频处理的 C 语言库集合,所有音视频开发(播放器、转码器、推流工具、AI 视觉处理)都基于这些库。
1. libavutil - 工具库(基础依赖)
- 地位 :所有 FFmpeg 库的底层依赖,必须最先加载
- 核心功能
- 内存管理(避免泄漏)
- 日志系统(打印音视频错误信息)
- 数学计算、时间戳处理
- 字符串、哈希、加密工具
- 适用场景:任何 FFmpeg 程序都必须依赖它
2. libavcodec - 编解码库(最核心)
- 地位 :FFmpeg 的灵魂,音视频编解码全靠它
- 支持格式
- 视频:H.264、H.265(HEVC)、VP9、AV1、MPEG4、MJPEG 等
- 音频:AAC、MP3、OPUS、FLAC、AC3 等
- 核心功能
- 编码:原始音视频数据 → 压缩码流
- 解码:压缩码流 → 原始音视频数据
- 适用场景:播放器解码、直播编码、视频压缩、AI 推理前的视频解码
3. libavformat - 封装/解封装库
- 作用 :管理文件格式和网络流,不负责编解码,只负责"打包/解包"
- 核心功能
- 解封装:从 MP4/MKV/FLV 里分离出视频流、音频流、字幕流
- 封装:把视频+音频+字幕合成一个文件
- 网络协议:RTSP、RTMP、HTTP、HLS 拉流/推流
- 适用场景:视频文件读取、直播流拉取、音视频合成、文件导出
4. libswscale - 图像转换与缩放库
- 作用 :处理视频画面像素格式和尺寸
- 核心功能
- 分辨率缩放:4K → 1080P、1080P → 720P
- 像素格式转换:YUV420P ↔ RGB24、BGR ↔ RGB(AI 模型常用)
- 画面裁剪、颜色空间转换
- 适用场景:视频预览、AI 图像预处理、不同设备适配渲染
5、补充常用 FFmpeg 库
除了安装的 4 个开发库,还有 2 个高频库:
- libswresample:音频重采样(改变采样率、声道数、位深)
- libavfilter:音视频滤镜(加水印、裁剪、变速、降噪、字幕叠加)
这条命令执行完后,系统便具备了 FFmpeg 完整开发环境 ,可以直接用于:
✅ C/C++ 音视频开发
✅ Python/Go 调用 FFmpeg 库
✅ 直播、转码、视频处理、AI 视觉预处理
总结
ffmpeg是命令行工具 ,其余带-dev的都是C/C++ 开发库- libavcodec 是 FFmpeg 最核心的编解码库
- 这套组合是 Linux 下音视频开发的标准安装命令
- 四个库分别负责:工具、编解码、封装、画面转换
安装底层库后,系统文件发生了什么变化
执行完安装命令后:
bash
sudo apt install ffmpeg libavformat-dev libavcodec-dev libavutil-dev libswscale-dev -y
系统从文件、环境、配置、依赖四个层面都发生了真实、永久的变化。
一、最核心的变化:系统多了哪些文件?
APT 会把所有内容自动解压、安装到系统标准目录,你不需要手动移动。
下面是真实路径 + 真实文件类型(Ubuntu/Debian 通用):
1. 可执行命令(你能直接用的)
/usr/bin/ffmpeg ← 最核心命令
/usr/bin/ffprobe ← 查看媒体信息
/usr/bin/ffplay ← 简易播放器
安装后你在任何目录输入 ffmpeg -version 都能运行。
2. 开发库文件(.so 动态链接库)
这些是 C/C++ 程序调用 FFmpeg 功能需要的:
/usr/lib/x86_64-linux-gnu/
├── libavcodec.so
├── libavformat.so
├── libavutil.so
├── libswscale.so
3. 头文件(.h 开发用)
/usr/include/x86_64-linux-gnu/libavcodec/
/usr/include/x86_64-linux-gnu/libavformat/
/usr/include/x86_64-linux-gnu/libavutil/
/usr/include/x86_64-linux-gnu/libswscale/
写 C/C++ 音视频程序时 #include 就是从这里找。
4. 配置文件、解码器信息、硬件支持文件
/usr/share/ffmpeg/
/etc/ffmpeg/
二、系统环境发生了什么变化?
1. PATH 环境变量自动包含 ffmpeg 命令
你不需要配置环境变量,系统已经能找到 ffmpeg。
2. 动态链接库缓存(ldconfig)自动更新
系统把新安装的 .so 库加入缓存,让其他程序能找到 FFmpeg 库。
3. APT 包数据库标记这些包已安装
以后:
apt remove可以卸载apt upgrade会自动更新- 其他软件依赖 FFmpeg 时能检测到已安装
三、安装后,系统具备了哪些新能力?
一句话:
系统从"没有音视频处理能力"变成了"拥有全功能音视频引擎"。
具体能做:
- 音视频转码
- 剪辑、合并、截图
- 直播推流、拉流
- 摄像头采集
- 音频提取、降噪
- 视频解码、编码
- AI 视频预处理
- C/C++/Python 音视频开发
除非你手动卸载:
bash
sudo apt remove ffmpeg libavformat-dev libavcodec-dev libavutil-dev libswscale-dev
否则它们永久存在于系统中。
四、最简单验证方式
bash
ffmpeg -version
如果输出版本信息,说明:
✅ 命令安装成功
✅ 库安装成功
✅ 系统环境配置成功
✅ 可以直接开发或使用
接口如何调用
FFmpeg 确实像 OpenCV 一样,内部实现了庞大的音视频功能,并且提供了丰富的接口供开发者直接调用。
不过,相比于 OpenCV 相对友好的 C++/Python 接口,直接使用 FFmpeg 的底层接口(即 libav 系列库)门槛要高得多,开发体验也有很大不同。
🧱 1. 底层接口:强大但繁琐的"C语言积木"
FFmpeg 的核心是由一系列 C 语言编写的动态链接库组成的(例如 libavcodec 负责编解码、libavformat 负责封装格式、libswscale 负责图像缩放等)。
- 可以直接调用吗? 可以。在 C/C++ 项目中,你只需要引入对应的头文件(如
#include <libavformat/avformat.h>),并链接编译好的.dll(Windows) 或.so(Linux) 库文件即可调用。 - 像 OpenCV 那样简单吗? 不像。FFmpeg 的原生 API 极其复杂且严格。你需要手动管理极其繁琐的生命周期(比如创建和释放
AVFormatContext、AVPacket、AVFrame等结构体),稍有不慎就会导致内存泄漏或程序崩溃。此外,它的很多操作需要分步进行,例如解码一个视频帧,需要先调用avcodec_send_packet发送数据包,再调用avcodec_receive_frame接收解码后的数据,逻辑链条比较长。
🚀 2. 现代封装:让调用变得像 OpenCV 一样简单
正因为原生 C 接口太难用,社区涌现出了许多优秀的二次封装库。这些库把复杂的 FFmpeg 逻辑包装成了符合现代编程习惯的简洁接口,这就非常像你熟悉的 OpenCV 的使用体验了:
- C++ 封装 :有一些开源的 C++ 封装库(如
ffmpeg-cpp),利用面向对象和 RAII(资源获取即初始化)机制,自动处理内存释放和资源管理。原本需要几百行代码才能完成的转码任务,封装后可能只需要几行链式调用就能搞定。 - 其他语言的绑定 :如果你使用 Python、Go、Rust、Java 或 C# 等语言,都有成熟的第三方库(如 Python 的
PyAV、C# 的 P/Invoke 封装等)来桥接 FFmpeg。你可以直接用高级语言的语法去调用,完全不用操心底层的 C 指针和内存分配。
☁️ 3. 另一种思路:通过 REST API 远程调用
除了把 FFmpeg 集成到你的代码里,还有一种非常流行的开发方式:FFmpeg REST API 。
这种方式是将 FFmpeg 部署在一个独立的服务器或 Docker 容器里,对外暴露 HTTP 接口。你在自己的业务代码中,只需要发一个简单的 HTTP 请求(带上 JSON 参数),就能让后台完成视频的转码、截图或剪辑,最后返回处理结果。这彻底解耦了业务逻辑和繁重的音视频处理依赖。
总结来说:
FFmpeg 提供了最底层的"发动机",你可以直接调用它的 C 接口,但这需要极高的技术功底和对音视频原理的深刻理解;但在实际工程开发中,绝大多数开发者会选择使用现代语言的高级封装库 或者搭建独立的媒体处理服务,从而获得类似 OpenCV 那样高效、安全的开发体验。
使用第三方库avcpp
一、windows
avcpp 是一个独立的第三方 C++ 封装库,并不能直接引用(例如#include <avcpp/formatcontext.h> )。
想要成功引用并编译通过,你必须先在本地电脑上安装它的依赖(包括 avcpp 本身以及它底层依赖的 FFmpeg)。
在 Windows 环境下使用 Visual Studio 开发 C++ 项目时,强烈推荐使用微软官方出品的 vcpkg 包管理器来自动化完成这些繁琐的安装和配置工作。
🛠️ 使用 vcpkg 一键安装与集成
你可以按照以下步骤操作,让开发环境自动准备好所有依赖:
-
打开终端:启动 PowerShell 或 Visual Studio 自带的"开发人员命令提示符"。
-
安装 avcpp :输入以下命令,vcpkg 会自动下载、编译并安装
avcpp及其依赖的 FFmpeg 库。bashvcpkg install avcpp:x64-windows -
集成到 Visual Studio :安装完成后,执行全局集成命令。这样 VS 就能自动识别并链接你安装的库,无需再手动去项目属性里配置复杂的头文件路径和
.lib库目录。bashvcpkg integrate install执行成功后,终端会提示"All MSBuild C++ projects can now #include any installed libraries."(所有 MSBuild C++ 项目现在都可以直接包含已安装的库了)。
⚙️ Visual Studio 项目配置建议
当你把这段代码放入 Visual Studio 的 C++ 项目中时,为了确保万无一失,可以检查一下项目的 vcpkg 属性设置:
- 开启 vcpkg 支持 :右键点击你的项目 -> 属性 -> 找到 vcpkg 选项卡。确保
Use Vcpkg(使用 Vcpkg)这一项被设置为 "是"。 - 自动处理依赖 :在该页面下,通常保持默认的
Install Vcpkg Dependencies(安装 vcpkg 依赖)为"是",以及Use AutoLink(使用自动链接)为"是"即可。这样编译器会在后台自动帮你关联对应的库文件,完全解放双手。
完成以上步骤后,你的代码中就可以毫无障碍地直接使用 #include <avcpp/formatcontext.h>,并且顺利调用其中的现代化 C++ 接口了。
二、Linux
在 Linux 下,想要使用 #include <avcpp/formatcontext.h> 这样的第三方 C++ 封装库,同样不能直接引用,也需要先安装对应的依赖。
不过,Linux 下的包管理比 Windows 更加统一和方便。你可以通过系统的包管理器(如 Ubuntu/Debian 的 apt)或者跨平台的 C++ 包管理器(如微软官方的 vcpkg)来轻松完成安装和配置。
这里为你提供两种最主流的安装与集成方案:
🐧 方案一:使用系统自带的包管理器(以 Ubuntu/Debian 为例)
这是最简单、最符合 Linux 习惯的方式。由于 avcpp 在一些发行版的官方仓库中可能不叫这个名字(通常被打包为 ffmpeg-decoder 或类似的名称),你可以直接通过以下命令尝试安装它以及底层的 FFmpeg 开发库:
-
更新软件源并安装依赖:
bashsudo apt update # 安装 avcpp (如果仓库中有) 以及 FFmpeg 的核心开发库 sudo apt install ffmpeg-decoder libavformat-dev libavcodec-dev libavutil-dev(注:如果你的发行版找不到
ffmpeg-decoder,也可以去 GitHub 下载avcpp的源码,通过mkdir build && cd build && cmake .. && make && sudo make install进行手动编译安装) -
编译你的 C++ 代码 :
安装完成后,在使用
g++编译时,需要通过pkg-config工具自动获取 FFmpeg 库的头文件路径和链接参数:bashg++ -std=c++17 your_code.cpp -o your_app $(pkg-config --cflags --libs libavformat libavcodec libavutil)
🛠️ 方案二:使用 vcpkg 跨平台包管理器(强烈推荐)
如果你在 Windows 下已经习惯了 vcpkg,那么在 Linux 下继续使用它是体验最好、最不容易出错的选择。它能帮你完美解决库的版本冲突和依赖问题。
-
准备基础编译工具 :
首先确保你的 Linux 安装了基础的编译环境:
bashsudo apt update sudo apt install build-essential cmake git pkg-config -
安装并配置 vcpkg :
克隆 vcpkg 仓库并进行引导安装(如果你之前没装过):
bashgit clone https://github.com/Microsoft/vcpkg.git cd vcpkg ./bootstrap-vcpkg.sh -
一键安装 avcpp :
使用 vcpkg 安装
avcpp,它会自动拉取并编译好所有需要的 FFmpeg 底层依赖:bash./vcpkg install avcpp -
在项目中使用:
-
如果使用 CMake(推荐) :在你的
CMakeLists.txt中加入以下几行,CMake 就会自动找到并链接这些库,完全不需要手动写繁琐的编译指令:cmakefind_package(unofficial-avcpp CONFIG REQUIRED) target_link_libraries(your_app PRIVATE unofficial::avcpp::avcpp) -
如果直接使用 g++ 编译 :可以通过 vcpkg 提供的脚本来获取编译参数:
bashg++ -std=c++17 your_code.cpp -o your_app $(./vcpkg/vcpkg integrate bash)
-
总结建议:
如果你是个人学习或在 Ubuntu 等常见发行版上快速开发,方案二的 vcpkg 是首选 。它不仅能让你的 Linux 环境和 Windows 环境保持高度一致,还能避免 Linux 系统自带库版本过旧导致的各种兼容性问题。安装好后,你就可以毫无障碍地在代码中 #include <avcpp/formatcontext.h> 了!
三、效果对比
FFmpeg 原生 C 语言接口
cpp
bool getVideoResolution(const char* filename, int *width, int *height) {
AVFormatContext* fmt_ctx = nullptr;
// 1. 打开文件并读取基础信息
if (avformat_open_input(&fmt_ctx, filename, nullptr, nullptr) != 0) {
std::cerr << "无法打开文件: " << filename << std::endl;
return false;
}
// 2. 查找视频流信息
if (avformat_find_stream_info(fmt_ctx, nullptr) < 0) {
std::cerr << "无法找到流信息" << std::endl;
return false;
}
int video_stream_index = -1;
// 3. 遍历所有流,找到属于视频的那一路流
for (unsigned int i = 0; i < fmt_ctx->nb_streams; i++) {
if (fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
video_stream_index = i;
break;
}
}
if (video_stream_index == -1) {
std::cerr << "未找到视频流" << std::endl;
return false;
}
// 4. 直接从视频流的编解码参数中获取宽和高
*width = fmt_ctx->streams[video_stream_index]->codecpar->width;
*height = fmt_ctx->streams[video_stream_index]->codecpar->height;
std::cout << "视频分辨率: " << width << "x" << height << std::endl;
// 释放资源
avformat_close_input(&fmt_ctx);
return true;
// return std::make_tuple(width, height);
}
使用avcpp第三方库接口
cpp
#include <iostream>
#include <tuple>
#include <avcpp/formatcontext.h> // avcpp 的核心头文件
// 优化后的函数:返回 std::tuple<int, int>,如果失败则抛出异常
std::tuple<int, int> getVideoResolution(const char* filename) {
try {
// 1. 打开文件并读取基础信息
// av::format::openInput 内部自动调用了 avformat_open_input 和 avformat_find_stream_info
// 并且 fmt_ctx 是一个 C++ 对象,离开作用域后会自动释放底层资源,无需手动 close
av::FormatContext fmt_ctx = av::format::openInput(filename);
// 2. 遍历所有流,找到属于视频的那一路流
for (unsigned int i = 0; i < fmt_ctx.streams().size(); ++i) {
// 通过 streams() 方法获取流对象,检查是否为视频流
if (fmt_ctx.stream(i).codecParams().mediaType() == AVMEDIA_TYPE_VIDEO) {
// 3. 直接从视频流的编解码参数中获取宽和高
int width = fmt_ctx.stream(i).codecParams().width();
int height = fmt_ctx.stream(i).codecParams().height();
std::cout << "视频分辨率: " << width << "x" << height << std::endl;
// 直接返回宽高值
return std::make_tuple(width, height);
}
}
// 如果循环结束还没找到视频流,主动抛出一个标准异常
throw std::runtime_error("未找到视频流");
} catch (const std::exception& e) {
// 统一捕获并打印 avcpp 或标准库抛出的异常信息
std::cerr << "获取视频分辨率失败: " << e.what() << std::endl;
// 返回一个默认值(例如 -1, -1)表示获取失败
return std::make_tuple(-1, -1);
}
}
FFmpeg是谁在开发和维护
FFmpeg 的开发和维护是一个典型的全球开源协作模式,它的背后并不是某一家特定的公司,而是一个由核心维护者、全球开发者以及各大科技巨头共同构成的生态系统。
👥 谁在开发和维护 FFmpeg?
FFmpeg 的核心维护团队其实非常精简,大约只有 10 到 15 人。虽然历史上有过上千名贡献者参与过代码提交,但由于人生变动等原因,最终能长期留下来的比例极低(约 1%)。因此,这十几位核心成员肩负着维护庞大代码库的重任。
值得一提的是,中国开发者也在其中扮演着重要角色。例如,快手音视频首席架构师**刘歧(社区人称"悟空")**就是 FFmpeg 的官方代码维护者,并且是首位进入 FFmpeg 社区委员会的亚洲人。
此外,像腾讯、Google 等科技大厂也会向 FFmpeg 提交高质量的代码补丁和优化方案,共同参与项目的迭代。
❤️ 他们为什么做这些事情?
核心开发者和维护者们投身于此的动力,更多是源于精神层面的追求和对技术的热情:
- 热爱与成就感:许多开发者纯粹是因为对音视频技术的热爱,享受攻克技术难题、优化极致性能的过程。
- 行业影响力与认可:在 FFmpeg 这样的顶级开源项目中做出贡献,能获得极高的社区声望和技术话语权,被视为行业内的技术领袖。
- 公共价值:FFmpeg 被誉为数字世界的"隐形管道",支撑着 YouTube、Netflix、抖音等几乎所有主流视频平台。维护它,就是在维护整个互联网音视频基础设施的稳定。
💰 他们有收入吗?
关于收入,情况比较多元,可以概括为**"核心团队多为无偿奉献,但相关技能极具商业价值"**:
-
核心维护者的收入现状 :
绝大多数核心维护者其实是利用业余时间"为爱发电"的志愿者。他们的直接经济回报非常有限。例如,有维护者曾透露,自己在处理大量安全漏洞报告的几个月里,税前收入仅有几千欧元,这与 FFmpeg 为科技巨头创造的商业价值相比显得微不足道。目前,项目会获得一些外部资助(如德国主权技术基金曾提供过十几万欧元的资金支持),但这笔钱对于庞大的维护工作量来说依然是杯水车薪。
-
间接的职业与经济回报 :
虽然直接从 FFmpeg 项目拿到的钱不多,但拥有深厚的 FFmpeg 开发与维护经验,在就业市场上是极大的加分项:
- 高薪敲门砖:音视频开发工程师是目前的高薪紧缺岗位。掌握 FFmpeg 底层优化的资深工程师或架构师,月薪往往能达到数万甚至更高。
- 职业背书:像前文提到的刘歧,他既是 FFmpeg 的核心维护者,也是知名企业的首席架构师,并出版了《FFmpeg从入门到精通》等专业书籍,实现了技术与职业生涯的双赢。
总的来说,FFmpeg 的核心维护者们大多是在用热情和责任感支撑着这个庞大的开源帝国,而深入钻研这项技术,也确实能为开发者带来广阔的职业前景和丰厚的潜在回报。