GitHub 超 20000 Star,最火开源视频库 FFmpeg 这 20 年!

 ̄綄美尐妖づ 提交于 2020-12-28 01:23:16

【编者按】不知不觉,FFmpeg 已有 20 个年头了。这 20 年总体看来,FFmpeg 如今已非常成功,但期间也有一些波折。

项目发起人 Fabrice Bellard 曾带领部分开发团队脱离 FFmpeg ,创建新项目 libav ,直到后来 FFmpeg 项目负责人 Michael Niedermayer 将 libav 的代码合并到了 FFmpeg。除此之外,FFmpeg 的“耻辱柱”更是为人熟知,国内的暴风影音和 QQ 影音都曾上榜。

如今,尽管 FFmpeg 正在被基于他的应用慢慢取代,但他对于音视频等领域的影响依旧可见。技术升级换代促使社会进步,同样,FFmpeg 也在用自己的方式改善人们的生活……

作者 | 陈超  责编 | 张文

头图 | CSDN 下载自视觉中国

出品 | CSDN(ID:CSDNnews)

FFmpeg 20 年绝对是个历史厚重的话题,而且它涉及了很多人的利益,我们不作过多阐述。本文,我仅仅从一个从事音视频行业十多年的开发者,从一个 FFmepg 使用者的角度,结合自身经历,谈一谈自己的观点和看法,希望能给大家一些参考。

为什么让我来聊这个话题?一方面是因为我从业时间长,第二方面,我也是 FFmpeg 开源项目的受益者。所以无论从纯技术角度,还是从商业产品的角度,我都有小小的经验可以分享。

FFmpeg 由法国天才程序员 Fabrice Bellard 发起,2004 年至 2015 年间由 Michael Niedermayer 主要负责维护,它是音视频领域最受欢迎的开源开发框架之一。Fabrice Bellard 也是 QEMU、TinyCC 等著名应用程序的作者,QEMU 是一个虚拟机项目,目前大量运用于各种安卓模拟器。比如像在 iOS 上运行了 XP 、在 ipad 上用上了 windows,或多或少都用到了 QEMU。

首先向开源大神致敬。用 FFmpeg 这样的开源项目,我们无法规避的就是各种开源的协议,GPL/GPLV3/LGPL/LGPLV3。过去二十年发生过各种争议,很多产品还被钉在耻辱柱上。简单来说,就是 GPL 不可商用

LGPL 可以开发闭源商用的软件,但只能用动态库,并标明你使用了 FFmpeg 动态库。除非你开源软件项目,否则静态链接的方式是不允许的。

我可以大致将 FFmpeg 或者说音视频领域的发展,划分为 3 个时间阶段。

  1. 2007 年之前

  2. 2008 年~2017 年

  3. 2017 年以后 

2007 年之前的阶段

这个阶段我们听到的都是各种恩怨纠葛,商业与开源的争论。

计算机刚开始用来处理音频、视频的时候,各种以编解码为核心技术的公司像雨后春笋一般冒了出来。做的好的公司也很多,比如 rmvb。每个公司都想抢占市场,因为不论是谁抢占了音视频编解码的制高点,那便意味着他掌握了下一个时代。

当然,最后由行业统一的协会结束了这种纷争。直到 2007 年苹果发布iPhone,力挺 H.264 mp4 后,行业统一为 H.264 mp4。

FFmpeg 诞生之初,就是为了解决各种音视频编码协议被商业公司垄断、协议之间不兼容的问题。所以,你可以把 FFmpeg 看成一个音视频编解码、格式解析、转换的大集合。

由于欧美数字音响版权保护严格,各种格式互不兼容。类似于一个人想把电脑里面的视频和歌曲转移到手机或者车载系统里去,流程非常麻烦。于是,就存在了一个潜在的法律擦边球市场——格式转换

国内最早一批软件出海开发者抓住了这个商机。当时最出名的播放器,如 KMPlayer、MPlayer SMplayer 以及各种格式转换软件,绝大部分都基于 FFmpeg。

OpenGL/ES 时代

2008~2017 是移动编解码芯片大发展的时代。

虽然视频编码格式、视频容器得到了统一,但这是一个漫长的过程。要知道,2014 年之前,苹果是不开放硬件解码接口给第三方应用的。

这无疑给了 FFmpeg 在 iOS 上应用的一个巨大机会。

所以 2014 年之前,绝大多数视频类应用都会使用 FFmpeg+OpenGL ES。FFmpeg 负责解码,OpenGL ES 负责渲染视频,shader 硬件加速转换 rgb(YUV 转 RGB 传统算法耗 CPU),当时跑 1080P,2M 码流勉强够用。

偶尔冒出一个团队宣布他们做了 iOS 上的硬件解码,讲解是怎么 hacking 进去获得 iOS 硬件解码未开放的头文件的,这些都令我们羡慕不已。

伴随着移动时代的到来,OpenGL/ES 成为了行业标准。

OpenGL/ES 除了运用在跨平台游戏引擎和 3D 建模仿真领域之外,还在视频图像处理领域有很大发挥。2010 年,PC 集成显卡开始逐渐支持 OpenGL 。

开源 GUI 框架 Qt 在发布 Qt5 的时候,直接跟 OpenGL/ES 进行了深度绑定,Qt 也因此成为行业最受欢迎的跨平台 GUI 开发框架。图像处理能力十分强悍的生产力软件行业巨头 maya 和 Substance Painter 非常受欢迎的视频剪辑软件 Davinci(达芬奇)都基于 Qt+OpenGL 开发的。

OpenGL/ES 作为行业的统一标准,广泛应用于跨平台游戏引擎和音视频数字图像处理,程序员们也因此迎来了黄金的十年。

这个 10 年,API 统一,同一套代码不需要大幅度改动就能应用在别的地方,属实令人泪目。时至今日,我们依然能看到字节等各大互联网公司还在招聘 FFmpeg、OpenGL/ES 资深从业者。日常刷短视频时见到的各种变脸、抖音特效、各种 filters、贴纸等等都出自 FFmpeg ,或是硬解码后再结合 OpenGL/ES shader 做出来的。

在芯片领域,从当年晦涩难用、高门槛高价格的 TI DM365 嵌入式芯片,到  SDK 集成度非常高、价格低廉、对开发者非常友好的 3518 系列海思芯片,中低端芯片在安防、智能家电、行车记录仪等领域大规模应用。

在这个 10 年,嵌入式智能硬件开发也是如火如荼。硬件之都深圳集中了几千家做外贸的安防公司。每年数亿级别的摄像头相关设备出口到欧美市场,海思也成为这个领域的老大。

智能硬件与移动设备结合,首先需要硬件跟手机建立通讯。程序员要做这个领域的开发,必须要对 TCP/IP UDP 网络通讯有深入的研究,同时需要掌握 FFmpeg H.264 音视频基础 OpenGL/ES 等知识。

在 PC端、手机视频剪辑生产力软件领域,Adobe Premire、Finalcut pro、达芬奇巨头垄断之下,国内厂商也逐渐占有一席之地,这得益于 OpenGL/ES 的大规模普及。支持 OpenGL3.3 或者更高的版本的 PC 集成显卡让视频剪辑中各种动画和特效处理成为了可能。

移动黄金十年,也是中国社会变化最快的十年。各大公司百花齐放,只要涉及音视频处理,背后都有 FFmpeg 的身影。这十年,大家一路狂奔,似乎也没什么人去关心 LGPL GPL,你是动态链接呢,还是 static,各个开发人员,大小公司,都在里面做出了非常不错的产品,服务全球的消费者。

2017 年后

IT 行业的发展的基石,依然是芯片

iOS 2017 年后已经全面支持 H.265 硬件编解码。

Intel 2017年的 kaby cpu 开始支持 H.265 硬件编码。

2019 年后的 coffee 全面支持 H.265 硬件编码。

所以目前,H.265 是主流。

通过下图,看看你的 CPU 是否支持 H.265 硬件编解码。

FLASH 没落,RTMP 也很久不更新了,传统 TCP 在音视频传输过程中会有延迟,中心化服务器会带来流量、资费问题。

一套技术上高效可靠、经济实惠的音视频传输框架迫在眉睫,其中 P2P 结合 relay 的方式是最为理想。

对于中小型公司来说,做音视频直播、视频会议相关的产品,自研 UDP,P2P 是不可能的。因为运营这样一个研发团队,每年的开销投入是千万级别的。所以 WebRTC,甚至第三方基于 WebRTC 开发的 sdk,已然成为了中小型公司能最快进入音视频领域做产品的方案。

未来 WebRTC 在国内的应用,也会越来越广泛,同时也需要更多开发者投入这个行业。

Metal/Vulkan/D3D 各大巨头早已推出了下一个 20 年的全新的标准。MediaCodec/AVFoundation 成为移动平台硬件编解码的标配。

如果没有特殊需求,在 iOS 上,你可以直接使用硬件编解码,不要使用FFmpeg 了;在安卓上,很多年前我们说的是硬编软解,目前,也应该可以直接上硬件编解码了。

可这样的话,那 FFmpeg 还有用吗?OpenGL/ES 还要学吗?

答案是肯定的,需要学习。

初学者用 FFmpeg 作为入门,进入音视频领域,不仅能学到非常多的音视频领域的基础知识,还能体验 FFmpeg 优雅的 C 语言封装的 API、AVFormatContext、AVCodecContex……

商业产品可能用到的 FFmpeg API 非常少,但作为音视频领域曾经非常重要的技术框架,它值得你去了解去探索。对于深入从事编解码算法的程序员或者做芯片开发的程序员来说,FFmpeg 解码器、X264 编码器开源的代码都可以成为非常好的参考资料。

那么,可以直接学习 Vulkan/Metal,而不用看 OpenGL/ES 吗?

肯定是不能的。原因在于计算机图形学的基础知识、向量、坐标系、矩阵算法等等都是基于 OpenGL ,甚者是 D3D 的。很多时候,我们依然能从 2000 年左右,一些老程序员的文章资料中学习到东西。事实上,当我们用 Metal/Vulkan API 去写项目的时候,比如写一个渲染引擎或者交互式 3D 的建模工具,遇到的问题,跟用 OpenGL 去写遇到的问题一模一样。

 

未来?

新技术的革命,会创造一大批公司。比如 08 年,拿 OpenGL ES 的游戏引擎来写游戏可能就会创造价值几十亿的公司。

2017 年后移动互联网红利已经结束。

下一个 10 年,技术还是那些技术,主角或许将从移动 App 变成 AI、边缘计算。

如果不是xx战,今年海思 4T 算力的 AI 芯片可能会下探到 10 个美金以下。芯片的大规模量产,价格下降,会带动行业新一轮变革。

与之对应,软件开发者也会有全新的机会。个人认为,从事音视频、网络通讯相关开发,OpenGL/ES 都是必须要掌握的,OpenCV, Tensorflow-lite是深度学习的基础。

所以单纯聊 FFmpeg 已经没有什么意义,聊点音视频、数字图像处理、网络通讯这些跟 FFmpeg 相关的,或许更有参考价值。

FFmpeg 的未来在哪里?一项技术只能在一个合适的时间段解决一个特定的问题。

或许在未来的某个产品里面,我们会用到 FFmpeg 的一些功能,OpenGL/ES 也是这样。比如想在 iOS 上做并行计算和 AI 图像处理,那就不得不用 Metal。 

开源与商业,个人的态度是尊重开源,严格按照开源协议来做商业产品。开源打破了垄断,消除了行业壁垒,推动了社会的进步。希望未来国内能做出更多更好的产品,占据行业制高点并且带动行业完成产业升级。商业产品的成功一方面可以带动就业,另一方面,众多消费者也能从中获益。

写 FFmpeg 相关的文章,单纯写 FFmpeg 20 年的发展历史是不完善的,所以引出了 OpenGL 网络通讯等相关框架相互补充说明。期望本文能带给你一些启示!

作者简介:陈超,CTO 10年+ C/C++ 开发者。先后就职于德国 BOSCH,iBabyLabs 等企业担任主程, 精通嵌入式 Linux、iOS、Android 底层开发,音视频、网络通讯协议/流媒体开发,精通 Qt、FFmpeg、Metal、OpenGL 等开发库。

更多精彩推荐
☞曾被“劝退”的 C++ 20 正式发布!
☞苹果官网出现价格Bug:千元产品变百元;阿里云开源量子模拟平台“太章2.0”|极客头条
☞跨平台将终结

☞25 岁的 JavaScript 都经历了什么?
☞最令人讨厌的编程语言:C++ Java 上榜

☞Rust 2020 调查报告出炉,95%的开发者吐槽Rust难学

☞从“卡脖子”到“主导”,国产数据库 40 年的演变!
点分享点点赞点在看
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!