文章目录FFmpeg概述 FFmpeg 的核心组成️ FFmpeg 能做什么 常用命令举例⚙️ 如何获取与安装安装ffmpeg 开发底层库一、每个安装项的作用二、FFmpeg 核心库详细介绍开发必知1. libavutil - 工具库基础依赖2. libavcodec - 编解码库**最核心**3. libavformat - 封装/解封装库4. libswscale - 图像转换与缩放库5、补充常用 FFmpeg 库总结安装底层库后系统文件发生了什么变化一、最核心的变化系统多了哪些文件1. 可执行命令你能直接用的2. 开发库文件.so 动态链接库3. 头文件.h 开发用4. 配置文件、解码器信息、硬件支持文件二、系统环境发生了什么变化1. **PATH 环境变量自动包含 ffmpeg 命令**2. **动态链接库缓存ldconfig自动更新**3. **APT 包数据库标记这些包已安装**三、安装后系统具备了哪些新能力四、最简单验证方式接口如何调用 1. 底层接口强大但繁琐的“C语言积木” 2. 现代封装让调用变得像 OpenCV 一样简单☁️ 3. 另一种思路通过 REST API 远程调用使用第三方库avcpp一、windows️ 使用 vcpkg 一键安装与集成⚙️ Visual Studio 项目配置建议二、Linux 方案一使用系统自带的包管理器以 Ubuntu/Debian 为例️ 方案二使用 vcpkg 跨平台包管理器强烈推荐三、效果对比FFmpeg 原生 C 语言接口使用avcpp第三方库接口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.aviffmpeg -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 overlay10: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 下完整安装命令sudoaptinstallffmpeg libavformat-dev libavcodec-dev libavutil-dev libswscale-dev-y一、每个安装项的作用包名作用ffmpegFFmpeg 命令行工具本体提供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 ↔ RGBAI 模型常用画面裁剪、颜色空间转换适用场景视频预览、AI 图像预处理、不同设备适配渲染5、补充常用 FFmpeg 库除了安装的 4 个开发库还有 2 个高频库libswresample音频重采样改变采样率、声道数、位深libavfilter音视频滤镜加水印、裁剪、变速、降噪、字幕叠加这条命令执行完后系统便具备了FFmpeg 完整开发环境可以直接用于✅ C/C 音视频开发✅ Python/Go 调用 FFmpeg 库✅ 直播、转码、视频处理、AI 视觉预处理总结ffmpeg是命令行工具其余带-dev的都是C/C 开发库libavcodec是 FFmpeg 最核心的编解码库这套组合是 Linux 下音视频开发的标准安装命令四个库分别负责工具、编解码、封装、画面转换安装底层库后系统文件发生了什么变化执行完安装命令后sudoaptinstallffmpeg 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.so3. 头文件.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 音视频开发除非你手动卸载sudoaptremove ffmpeg libavformat-dev libavcodec-dev libavutil-dev libswscale-dev否则它们永久存在于系统中。四、最简单验证方式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一、windowsavcpp是一个独立的第三方 C 封装库并不能直接引用(例如#include avcpp/formatcontext.h)。想要成功引用并编译通过你必须先在本地电脑上安装它的依赖包括avcpp本身以及它底层依赖的 FFmpeg。在 Windows 环境下使用 Visual Studio 开发 C 项目时强烈推荐使用微软官方出品的vcpkg包管理器来自动化完成这些繁琐的安装和配置工作。️ 使用 vcpkg 一键安装与集成你可以按照以下步骤操作让开发环境自动准备好所有依赖打开终端启动 PowerShell 或 Visual Studio 自带的“开发人员命令提示符”。安装 avcpp输入以下命令vcpkg 会自动下载、编译并安装avcpp及其依赖的 FFmpeg 库。vcpkginstallavcpp:x64-windows集成到 Visual Studio安装完成后执行全局集成命令。这样 VS 就能自动识别并链接你安装的库无需再手动去项目属性里配置复杂的头文件路径和.lib库目录。vcpkgintegrateinstall执行成功后终端会提示“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 开发库更新软件源并安装依赖sudoaptupdate# 安装 avcpp (如果仓库中有) 以及 FFmpeg 的核心开发库sudoaptinstallffmpeg-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 库的头文件路径和链接参数g-stdc17 your_code.cpp-oyour_app$(pkg-config--cflags--libslibavformat libavcodec libavutil)️ 方案二使用 vcpkg 跨平台包管理器强烈推荐如果你在 Windows 下已经习惯了vcpkg那么在 Linux 下继续使用它是体验最好、最不容易出错的选择。它能帮你完美解决库的版本冲突和依赖问题。准备基础编译工具首先确保你的 Linux 安装了基础的编译环境sudoaptupdatesudoaptinstallbuild-essential cmakegitpkg-config安装并配置 vcpkg克隆 vcpkg 仓库并进行引导安装如果你之前没装过gitclone https://github.com/Microsoft/vcpkg.gitcdvcpkg./bootstrap-vcpkg.sh一键安装 avcpp使用 vcpkg 安装avcpp它会自动拉取并编译好所有需要的 FFmpeg 底层依赖./vcpkginstallavcpp在项目中使用如果使用 CMake推荐在你的CMakeLists.txt中加入以下几行CMake 就会自动找到并链接这些库完全不需要手动写繁琐的编译指令find_package(unofficial-avcpp CONFIG REQUIRED) target_link_libraries(your_app PRIVATE unofficial::avcpp::avcpp)如果直接使用 g 编译可以通过 vcpkg 提供的脚本来获取编译参数g-stdc17 your_code.cpp-oyour_app$(./vcpkg/vcpkg integratebash)总结建议如果你是个人学习或在 Ubuntu 等常见发行版上快速开发方案二的vcpkg是首选。它不仅能让你的 Linux 环境和 Windows 环境保持高度一致还能避免 Linux 系统自带库版本过旧导致的各种兼容性问题。安装好后你就可以毫无障碍地在代码中#include avcpp/formatcontext.h了三、效果对比FFmpeg 原生 C 语言接口boolgetVideoResolution(constchar*filename,int*width,int*height){AVFormatContext*fmt_ctxnullptr;// 1. 打开文件并读取基础信息if(avformat_open_input(fmt_ctx,filename,nullptr,nullptr)!0){std::cerr无法打开文件: filenamestd::endl;returnfalse;}// 2. 查找视频流信息if(avformat_find_stream_info(fmt_ctx,nullptr)0){std::cerr无法找到流信息std::endl;returnfalse;}intvideo_stream_index-1;// 3. 遍历所有流找到属于视频的那一路流for(unsignedinti0;ifmt_ctx-nb_streams;i){if(fmt_ctx-streams[i]-codecpar-codec_typeAVMEDIA_TYPE_VIDEO){video_stream_indexi;break;}}if(video_stream_index-1){std::cerr未找到视频流std::endl;returnfalse;}// 4. 直接从视频流的编解码参数中获取宽和高*widthfmt_ctx-streams[video_stream_index]-codecpar-width;*heightfmt_ctx-streams[video_stream_index]-codecpar-height;std::cout视频分辨率: widthxheightstd::endl;// 释放资源avformat_close_input(fmt_ctx);returntrue;// return std::make_tuple(width, height);}使用avcpp第三方库接口#includeiostream#includetuple#includeavcpp/formatcontext.h// avcpp 的核心头文件// 优化后的函数返回 std::tupleint, int如果失败则抛出异常std::tupleint,intgetVideoResolution(constchar*filename){try{// 1. 打开文件并读取基础信息// av::format::openInput 内部自动调用了 avformat_open_input 和 avformat_find_stream_info// 并且 fmt_ctx 是一个 C 对象离开作用域后会自动释放底层资源无需手动 closeav::FormatContext fmt_ctxav::format::openInput(filename);// 2. 遍历所有流找到属于视频的那一路流for(unsignedinti0;ifmt_ctx.streams().size();i){// 通过 streams() 方法获取流对象检查是否为视频流if(fmt_ctx.stream(i).codecParams().mediaType()AVMEDIA_TYPE_VIDEO){// 3. 直接从视频流的编解码参数中获取宽和高intwidthfmt_ctx.stream(i).codecParams().width();intheightfmt_ctx.stream(i).codecParams().height();std::cout视频分辨率: widthxheightstd::endl;// 直接返回宽高值returnstd::make_tuple(width,height);}}// 如果循环结束还没找到视频流主动抛出一个标准异常throwstd::runtime_error(未找到视频流);}catch(conststd::exceptione){// 统一捕获并打印 avcpp 或标准库抛出的异常信息std::cerr获取视频分辨率失败: e.what()std::endl;// 返回一个默认值例如 -1, -1表示获取失败returnstd::make_tuple(-1,-1);}}FFmpeg是谁在开发和维护FFmpeg 的开发和维护是一个典型的全球开源协作模式它的背后并不是某一家特定的公司而是一个由核心维护者、全球开发者以及各大科技巨头共同构成的生态系统。 谁在开发和维护 FFmpegFFmpeg 的核心维护团队其实非常精简大约只有10 到 15 人。虽然历史上有过上千名贡献者参与过代码提交但由于人生变动等原因最终能长期留下来的比例极低约 1%。因此这十几位核心成员肩负着维护庞大代码库的重任。值得一提的是中国开发者也在其中扮演着重要角色。例如快手音视频首席架构师**刘歧社区人称“悟空”**就是 FFmpeg 的官方代码维护者并且是首位进入 FFmpeg 社区委员会的亚洲人。此外像腾讯、Google 等科技大厂也会向 FFmpeg 提交高质量的代码补丁和优化方案共同参与项目的迭代。❤️ 他们为什么做这些事情核心开发者和维护者们投身于此的动力更多是源于精神层面的追求和对技术的热情热爱与成就感许多开发者纯粹是因为对音视频技术的热爱享受攻克技术难题、优化极致性能的过程。行业影响力与认可在 FFmpeg 这样的顶级开源项目中做出贡献能获得极高的社区声望和技术话语权被视为行业内的技术领袖。公共价值FFmpeg 被誉为数字世界的“隐形管道”支撑着 YouTube、Netflix、抖音等几乎所有主流视频平台。维护它就是在维护整个互联网音视频基础设施的稳定。 他们有收入吗关于收入情况比较多元可以概括为**“核心团队多为无偿奉献但相关技能极具商业价值”**核心维护者的收入现状绝大多数核心维护者其实是利用业余时间“为爱发电”的志愿者。他们的直接经济回报非常有限。例如有维护者曾透露自己在处理大量安全漏洞报告的几个月里税前收入仅有几千欧元这与 FFmpeg 为科技巨头创造的商业价值相比显得微不足道。目前项目会获得一些外部资助如德国主权技术基金曾提供过十几万欧元的资金支持但这笔钱对于庞大的维护工作量来说依然是杯水车薪。间接的职业与经济回报虽然直接从 FFmpeg 项目拿到的钱不多但拥有深厚的 FFmpeg 开发与维护经验在就业市场上是极大的加分项高薪敲门砖音视频开发工程师是目前的高薪紧缺岗位。掌握 FFmpeg 底层优化的资深工程师或架构师月薪往往能达到数万甚至更高。职业背书像前文提到的刘歧他既是 FFmpeg 的核心维护者也是知名企业的首席架构师并出版了《FFmpeg从入门到精通》等专业书籍实现了技术与职业生涯的双赢。总的来说FFmpeg 的核心维护者们大多是在用热情和责任感支撑着这个庞大的开源帝国而深入钻研这项技术也确实能为开发者带来广阔的职业前景和丰厚的潜在回报。