浮之静

FFmpeg:互联网世界的基石正在被人遗忘!

产品“过时”的定义往往来源于自己的无知,一个软件的价值更不是靠华丽外表来定义的!

背景

最近刷到一个帖子,大意是说:ffmpeg 过时,问有啥替代品。帖子被 ffmpeg 引用后给出“否定”。因太有故事感了,我就想深入聊聊这个话题。

Image

原帖相关讨论也很有意思:“网站用的 index.html,安装困难”,没想到这会成为评价一个软件过时与否的标准。但也有人认为网站看起来越古老,软件就越好。

Image

要我说:ffmpeg 那么多复杂命令,文档也巨长,对原帖主来说更是“天书”了。如果仅依靠网站过时、文档看不懂就轻易下结论,只会显得自己很无知!很多软件作者不在意宣传包装,切实解决用户痛点,才造就了那些“过时不合群”的伟大产品。虽然现在“长得好看”很必要,但明显有“过度包装”趋势,花里胡哨没啥“实用性”的产品可太多了...

FFmpeg

FFmpeg[1] 是一个自由开源的软件项目,已成为全球处理视频、音频及其他多媒体文件和流的核心框架。它不仅为开发者提供了一套强大的库,也为终端用户提供了功能丰富的命令行工具。作为数字媒体领域不可或缺的基石,FFmpeg 在现代多媒体处理和分发中扮演着至关重要的角色。FFmpeg 对普通人来说并不出名,因为它大多数时候都是在软件底层进行技术支持。尤其是包含音视频处理的软件,或多或少都有它的身影,属于真正的幕后英雄!

Image

仅 TheirStack 上统计到的公司就有 1396 个,如 Youtube、TikTok、Bilibili 等。

Image

是什么?

定义:领先的多媒体框架

  • 起源 & 目标:FFmpeg 被誉为“音视频处理的瑞士军刀”,其设计目标是能够解码(decode)、编码(encode)、转码(transcode)、复用(mux)、解复用(demux)、流式传输(stream)、滤镜处理(filter)和播放(play)几乎所有人类和机器创造的多媒体格式。它的核心目标是为应用程序开发者和最终用户提供“技术上可能的最佳解决方案”。其名称结合了“Fast Forward”(快进,FF)和流行的视频压缩标准 “MPEG”,象征着其对速度和多媒体标准的关注。
  • 核心理念: FFmpeg 倾向于结合可用的最佳自由软件选项,并优先使用自己的代码以减少对其他库的依赖,最大化代码复用。在无法确定“最佳”方案时,它会同时支持多种选项,让用户自行选择。这种理念造就了其强大的健壮性和灵活性。

基础:开发者的关键库

FFmpeg 提供了一套核心库,这些库是其强大功能的基础,并使得其他应用程序能够集成和利用这些功能。正是这些库使得 FFmpeg 被广泛集成到众多工具中。

  • libavcodec[2]: 作为 FFmpeg 的心脏,该库为海量的音频和视频编解码器提供编码器和解码器。许多其他软件(如 VLC、OBS)都依赖这个关键组件。
  • libavformat[3]: 负责处理各种多媒体容器格式的复用(将多个流合并到一个文件)和解复用(从一个文件中分离出多个流)。这对于读取和写入不同的文件类型(如 MP4、MKV)至关重要。
  • libavfilter[4]: 包含大量媒体滤镜,可用于对音频和视频流应用各种效果和变换(如调整大小、裁剪、色彩校正)及进行复杂处理。这使得 FFmpeg 能执行超越简单格式转换的复杂操作。
  • libavutil[5]: 一个实用工具库,包含简化编程任务的函数,例如随机数生成器、数据结构、数学例程和核心多媒体实用程序。它提供了基础的构建模块。
  • libswscale[6]: 执行高度优化的图像缩放以及色彩空间/像素格式转换操作(如从 YUV 转换到 RGB)。这对于确保不同显示类型之间的兼容性以及在 AI 分析等处理阶段至关重要。
  • libswresample[7]: 处理高度优化的音频重采样、声道矩阵变换和采样格式转换。确保处理过程中的音频兼容性和质量。
  • libavdevice[8]: 通过 Video4Linux2、ALSA 等框架与多媒体输入/输出设备(如网络摄像头、麦克风、屏幕捕捉)进行交互。允许 FFmpeg 直接捕获和输出媒体。

交互:终端用户的工具

  • ffmpeg[9]: 核心命令行工具,用于转换、编辑、滤镜处理和流式传输多媒体文件。这是用户通过命令直接进行操作的主要接口。
  • ffprobe[10]: 一个命令行工具,用于分析多媒体流和文件,收集诸如编解码器、格式、比特率(bitrate)等元数据信息。常用于检查和信息获取。
  • ffplay[11]: 一个基于 SDL 和 FFmpeg 库的简单媒体播放器,对于快速播放和测试/调试目的非常有用。

常用命令

在本地安装 ffmpeg 命令后,可以做很多事,这里简单列举几个指令。如格式转换、截取片段、截取封面等。

格式转换

MOV ➞ MP4

ffmpeg -i test.mov test.mp4

MP4 ➞ GIF

ffmpeg -i test.mp4 test.gif

截取片段

ffmpeg -i test.mp4 -ss 00:01:00 -to 00:01:30 -c copy test.mp4

截取封面

ffmpeg -i test.mp4 -ss 00:00:10 -vframes 1 cover.jpg

Warp:终端推荐

以上命令只是 ffmpeg 命令的最简单演示,它还可以搭配各种参数进行更细颗粒度控制。但命令记忆是繁琐的,也很容易遗忘,这里推荐使用 Warp[12] AI 命令行工具,可以让你快速掌握各种复杂指令。比如可以这样提问:

  • ffmpeg 有哪些常用命令
  • ffmpeg 将 mp4 转为 gif 可设置哪些参数
  • ffmpeg 如何截取视频封面
  • ...
Image
Image

小结

这种将核心库(如 libavcodec、libavformat 等)与面向用户的工具(如 ffmpeg、ffprobe)分离的架构设计,是 FFmpeg 无处不在的关键原因。开发者可以将稳定、强大的库集成到他们的应用程序中(正如 VLC 和各种编程语言封装库所做的那样),而终端用户则可以利用功能多样的命令行工具进行直接操作。这种双轨并行的采用策略,使得 FFmpeg 能够同时满足不同层面的需求,极大地扩展了其覆盖范围和影响力。

能做什么?

  • 格式转换:这是 FFmpeg 最主要的用途之一,得益于其庞大的编解码器支持。
  • 编辑: 支持基本的编辑功能,如剪切、合并、修剪视频和音频文件,添加或删除音轨,调整音量、帧率和分辨率。
  • 滤镜/效果:应用各种效果,如调整大小、裁剪、旋转、色彩校正、降噪、添加水印、嵌入字幕等。
  • 流媒体:能够使用 HLS、DASH、RTMP 等多种协议在网络(互联网或局域网)上传输实时内容,可作为服务器或客户端。这对直播行业至关重要。
  • 屏幕录制/捕获:能够录制计算机屏幕活动、捕捉网络摄像头视频和麦克风音频。
  • 元数据操作:读取、写入和修改与多媒体文件相关的元数据(如标题、描述、版权信息)。
  • AI/分析集成: 通过集成推理引擎(如 OpenVINO[13]),FFmpeg 可扩展用于 AI 工作负载,如对象检测和分类。尽管其核心库(如 AVFilter/Filter graph)在处理高负载分析任务时可能存在线程瓶颈,需要额外的工作来克服,但这也显示了 FFmpeg 对新兴领域的适应能力(论文参考:Extend the FFmpeg Framework to Analyze Media Content[14])。
  • 缩略图生成:从视频中提取帧以创建静态图像缩略图。
  • ...

FFmpeg 是一个持续发展的项目,不断适应新的技术需求,如集成 AI 能力和支持 VP8[15]/VP9[16]/WebM[17] 等较新的编解码器。分离式架构设计、及强大的功能让其成为互联网的重要组成部分,但在 AI 领域中,性能优化或许会成为新的任务要求。

顶峰的孤独,只会是自我超越!

相关案例

上面说了那么多抽象概念,接下来举几个例子,来更直观地感受 FFmpeg 影响力。

Chromium

Chromium[18] 是一个免费的开源网络浏览器项目,主要由 Google 开发和维护。是 Google Chrome、Microsoft Edge 等浏览器的内核。

Image

相关代码引用:chromium/third_party/ffmpeg[19]、chromium/src/media/ffmpeg[20]

Image
Image

OBS Studio

OBS Studio[21] 是一款免费开源的跨平台屏幕录制和直播应用程序。

Image

如果 OBS 这个名字让你感到陌生,那该工具的赞助者肯定有你所熟悉的。

Image

相关代码引用:obs-studio/plugins/obs-ffmpeg[22]

Image

VLC

VLC[23] 是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD、音频 CD、VCD 及各类流媒体协议。

Image

相关代码引用:vlc/contrib/src/ffmpeg[24]

Image

Gifski

Gifski[25] 是 macOS 上一款视频转高质量 GIF 神器,支持视频截取、分辨率、播放速度、图片质量、帧数设定、是否循环等。

Image

相关代码引用:gifski-api/snapcraft.yaml[26]

Image

“过时”推荐

鉴于原帖中提到的“网站用的 index.html,安装困难”观点,我想用几个类似项目来反驳一下:网站美丑和软件强弱几乎没有任何联系。

注:类似的工具或网站有太多了,我这里仅抛砖引玉一下。它们的网站看起来都有点过时,但并不影响其强大功能,还有些跨平台且体积小。

LICEcap

LICEcap[27] 是一款轻巧易用的屏幕录制工具,可将桌面指定区域的动态画面直接保存为 GIF 或其专有无损 LCF 格式。该格式拥有比 GIF 更高的压缩率、更丰富的色彩(每帧超过 256 色)以及更精确时间戳。 安装包小于 1M:Windows(250kb)、macOS(876kb)。

Image
Image

7-Zip

7-Zip[28]:Windows 平台下的开源压缩软件,安装包 1.5 MB 左右。7z 格式以 LZMA/LZMA2 算法实现极高压缩比及 AES-256 加密。可压缩解压 7z、ZIP、GZIP、TAR,解压 RAR、ISO、DMG 等多种文件。软件集成资源管理器,支持命令行及多语言,兼容 Windows XP 至最新系统。

Image

IrfanView

IrfanView[29] 专为 Windows 设计的图形查看器,简洁易用,专业级功能强大。作为行业先驱,率先支持多帧 GIF、多页 TIF 及多 ICO 格式。单个 EXE 仅 6 MB。非商用免费,功能全面,支持海量格式、批量处理、图像编辑、特效、截屏、Unicode、多媒体播放等。兼容 Windows XP 至 11。

Image

Titanium Software

Titanium Software[30] 是为 macOS 用户提供的一系列免费实用的操作系统工具。核心应用 OnyX 是多功能维护利器,能验证磁盘、清理系统、配置隐藏参数,并已整合 Maintenance(系统维护)、Deeper(个性化设置)及 CalHash(文件校验)的功能。

Image
Image

结语

今天的内容聚焦于 FFmpeg,但实际上,构成我们数字世界的,是无数底层、看不见却至关重要的技术组件。正是这些系统性、复杂性和广度兼具的技术成果,才让互联网如此丰富多彩。因此,当我们进入一个未知领域时,更应保持敬畏之心。鲁莽的言行只会暴露无知,而非体现质疑精神。

过去几十年,信息技术以前所未有的速度和深度重塑了人类社会。在这场变革中,一批技术创新卓越、应用广泛、影响深远的产品、工具和开源项目,成为推动时代前行的重要力量。它们不仅是特定历史背景下的产物,更奠定了今日数字文明的基础。

衡量技术成果影响力的标准涉及多个维度。首先是技术创新性,即是否突破原有瓶颈,引入革命性的理念或架构。其次是市场应用广度,广泛使用意味着更大的普惠效应。生态系统构建能力也至关重要,成功的技术往往孕育出庞大的开发者社区、商业应用与衍生服务。其设计理念是否成为行业标准,以及是否催化了后续技术发展、促进知识共享、降低创新门槛、创造新经济模式等,亦是关键考量因素。

20 世纪末至 21 世纪初是信息技术飞跃发展的黄金时期。互联网迅猛扩张,个人计算机普及,社会对开放、强大、易用软件工具的需求日益增强。在这一背景下,Linux 内核挑战了专有系统的垄断,GCC 为自由软件运动提供编译支持,Apache HTTP 服务器点燃了万维网的传播之火,MySQL 推动数据库技术大众化,Python 以简洁优雅赋能快速开发,Git 彻底革新了软件协作方式,而 FFmpeg 则成为数字多媒体处理的瑞士军刀。它们分别解决了操作系统、软件开发、网络服务、数据管理、编程范式和多媒体处理等关键领域的技术瓶颈,其深远意义在于共同奠定了现代数字文明的技术底座。

这些项目虽来自不同技术领域,实则彼此关联、协同演化,共同构建了我们所依赖的数字基础设施。操作系统(如 Linux)为上层软件提供运行环境;编译器(如 GCC)将源代码转为可执行指令;版本控制系统(如 Git)使全球开发者高效协作;Web 服务器(如 Apache)支撑互联网信息传输;数据库系统(如 MySQL)处理海量数据存储与查询;高级语言(如 Python)降低编程门槛,催生了从网站到人工智能的各类应用;而多媒体处理工具(如 FFmpeg)让数字内容的创作与传播无处不在。这些技术如经纬交织,构成从底层硬件到顶层用户体验的完整栈,支撑着经济、科研、教育、娱乐等各方面的数字运行。

值得注意的是,许多改变世界的项目并非出自宏大的战略规划,而源于个人兴趣或为解决具体问题的尝试。例如,Linux 内核最初是 Linus Torvalds 为其个人电脑打造的一个爱好项目,Git 的诞生则是 Linus 为了解决 Linux 内核版本控制在 BitKeeper 停止免费使用后的燃眉之急,而 Python 也是 Guido van Rossum 的一个“圣诞假期”的个人项目。这些案例说明:深刻的创新往往源自对实际需求的敏锐洞察和个人主动性,一个精心设计以解决真实(即便初期看似小范围)问题的方案,如果其基础足够坚实且具有扩展性,便可能产生始料未及的广泛影响。

在开源世界中,“站在巨人肩膀上”的理念尤为突出。许多成功项目直接借鉴或构建于前人工作之上。例如,Apache HTTP Server 继承了 NCSA HTTPd,尤其在后者停止开发后迅速接棒;Linux 的设计深受 Unix 和 Minix 启发;Python 延续了 ABC 语言的简洁设计理念;GCC 早期规划曾考虑重写现有编译器;FFmpeg 的部分开发者也曾参与 MPlayer 项目。开源代码和设计思想的开放性,使得这种继承与创新更加直接高效,不仅提升了开发效率,也加快了技术演进,避免了重复造轮子。

开源所倡导的共享、协作和以能力为本的文化(meritocracy),不仅推动了技术快速发展,也成为孕育创新、培养人才和构建健康技术生态的重要机制。它通过降低学习门槛、鼓励透明合作,使得更多开发者能投身其中,共同推动整个生态系统的持续演进。

「浮之静」社区

搞一个大家可以交流互动的技术社区,一直是我的理想,但苦于国内一直没有好的平台。微信群算是大家比较高频的一个交流方式,但它问题颇多,如:不支持查看历史对话、500 人数上限、无法进行子分组交流(信息埋没)等。这些问题我发现基本都可以被“腾讯频道”完美解决,它支持历史对话、开设子频道、设立内容板块(支持评论)、权限管理等,俨然有了一个社区的基本形态。所以如果大家对它感兴趣可以考虑扫码加入或搜索频道号:fzjing0369。

Image

目前开设的版块有:AI、编程、日常闲聊、Prompt 分享、应用 & 工具、开源推荐等。未来也会根据需要开设更多版块,因为它的人数上限可以突破 500 人,到达上万人,我之前貌似看到一些大频道已经接近百万人了,所以应该会产生很多有趣的碰撞。

Image

目前频道接近 800 人,使用体验最好的是在 QQ 内,支持功能最完善。小程序查看,交流啥的也十分方便,但功能有限。

References

[1]

FFmpeg:https://ffmpeg.org

[2]

libavcodec:https://www.ffmpeg.org/libavcodec.html

[3]

libavformat:https://www.ffmpeg.org/libavformat.html

[4]

libavfilter:https://www.ffmpeg.org/libavfilter.html

[5]

libavutil:https://www.ffmpeg.org/libavutil.html

[6]

libswscale:https://www.ffmpeg.org/libswscale.html

[7]

libswresample:https://www.ffmpeg.org/libswresample.html

[8]

libavdevice:https://www.ffmpeg.org/libavdevice.html

[9]

ffmpeg:https://www.ffmpeg.org/ffmpeg.html

[10]

ffprobe:https://www.ffmpeg.org/ffprobe.html

[11]

ffplay:https://www.ffmpeg.org/ffplay.html

[12]

Warp:https://www.warp.dev

[13]

OpenVINO:https://github.com/openvinotoolkit/openvino

[14]

Extend the FFmpeg Framework to Analyze Media Content:https://arxiv.org/abs/2103.03539

[15]

VP8:https://trac.ffmpeg.org/wiki/Encode/VP8

[16]

VP9:https://trac.ffmpeg.org/wiki/Encode/VP9

[17]

WebM:https://www.webmproject.org

[18]

Chromium:https://www.chromium.org

[19]

chromium/third_party/ffmpeg:https://chromium.googlesource.com/chromium/third_party/ffmpeg

[20]

chromium/src/media/ffmpeg:https://chromium.googlesource.com/chromium/src/media/+/refs/heads/main/ffmpeg

[21]

OBS Studio:https://github.com/obsproject/obs-studio

[22]

obs-studio/plugins/obs-ffmpeg:https://github.com/obsproject/obs-studio/tree/master/plugins/obs-ffmpeg

[23]

VLC:https://www.videolan.org/vlc

[24]

vlc/contrib/src/ffmpeg:https://github.com/videolan/vlc/tree/master/contrib/src/ffmpeg

[25]

Gifski:https://sindresorhus.com/gifski

[26]

gifski-api/snapcraft.yaml:https://github.com/sindresorhus/Gifski/blob/main/gifski-api/snapcraft.yaml

[27]

LICEcap:https://cockos.com/licecap

[28]

7-Zip:https://7-zip.org

[29]

IrfanView:https://irfanview.com

[30]

Titanium Software:https://titanium-software.fr/en/index.html