https://github.com/BabitMF/bmf
被誉为"稳定的火山",ByteDance旗下的全新多媒体处理框架BMF正在获得广泛关注。本文将为大家带来从入门到高阶的BMF知识体验之旅,让更多人了解和使用这套功能强大的跨平台框架。
什么是BMF?
BMF即Babit Multimedia Framework,中文称为"火山引擎多媒体框架"。它是一个通用的多媒体处理框架,通过提供简洁易用的跨语言接口、灵活的调度和扩展性,以模块化的方式动态扩展、管理和复用视频处理的原子能力。不仅如此,BMF还可以直接调用单个处理模块,方便集成到各种工程中使用,其与NIVIDA 合作开发提供了丰富的 GPU 即用模块,低门槛的扩展方式,多语言接口以及各类主流框架 SDK 的简单接入,方便用户快速打造高效的全 GPU 视频处理流水线,有效解决开发效率低,链路缺乏整体优化的问题,使得 GPU 能够充分发挥其强大的并行计算能力,应用于各类视频 AI 场景。
目前BMF主要应用于视频转码、视频抽帧、视频增强、视频分析、视频插帧、视频编辑、视频会议等众多领域,为用户提供高性能的多媒体处理解决方案。值得一提的是,BMF已经在字节跳动内部得到广泛应用,每天处理20亿视频,产品质量和稳定性获得认可。
入门体验
想了解BMF的实际功能,不妨从以下几个简单示例开始:
- 视频转码
使用BMF可以很简单地实现视频格式之间的转换。我们可以添加编码、解码和过滤模块,构建一个从MP4到MKV的转码Pipeline。了解配置接口后,即可按需设置参数,如改变视频大小或帧率等。
- 视频编辑
通过添加视频拼接和视频叠加模块,我们可以实现视频剪辑功能。比如将多段视频按顺序拼接成一个新视频,或者将Logo图片叠加到原视频上输出。这与常见视频编辑软件的功能一致。
- 视频直播
使用BMF可构建一个简易的视频直播服务。它能实现视频流的实时拉取、视频布局控制、音频混音,并将处理后的流输出到RTMP服务器进行直播。这 fully 展现了BMF在视频会议领域的应用前景。
- GPU加速
BMF完整支持GPU硬件,提供CPU到GPU的数据传输。我们可以实现视频解码和视频过滤等任务的GPU加速,显著提升处理效率。它还支持不同框架如CUDA和OpenCL之间的异构计算。
从这些建议简单实验开始, 开发者就可以感受到BMF模块化设计及其强大的处理能力。同时,它提供Python、C++和Go三种语言接口,语法简洁易用,无门槛上手。通过这些基础功能,我们已经看到BMF在视频管道工程中的广阔地平线。
深入原理
学习如何创建自己的视频处理模块,必然需要了解BMF内部工作机制:
多媒体处理框架 BMF 的整体架构分为应用层、框架层、模块层和异构层,共 4 个部分:
- 应用层: 即顶层,为用户提供多语言的 API,包括 Python、Go、C++,方便用户根据不同的项目需求进行开发集成。
- 框架层: 即中间层,包括框架对 graph(图) / pipeline 的调度、跨数据类型跨设备的数据流转 ackend、以及常用的跨设备 reformat、color space conversion(转换)、tensor 算子等 SDK。
- 模块层: 包含了具备各种原子能力的模块,提供多种语言的模块开发机制,用户可根据自身需要将算法/处理实现为 Python、Go、C++ 语言的任意一种。
- 异构层: 负责提供高效的视频处理算力,包括火山引擎自研的视频编解码芯片 ASIC 。
图 3. BMF 架构图
BMF采用Pipeline(管道)模式构建多媒体处理流程。用户通过添加和连接各种基础模块,比如解码、编码、滤镜等,形成一个个处理Task完成视频处理任务。这种模式极大增强了灵活性和可扩展性。在底层,BMF会根据Pipeline拓扑结构,自动为每一段Task分配资源,进行高效调度。它支持多种模式,如同步、异步计算模式等。所有任务都由统一的线程池负责执行,处理成本极低。而每个基础模块都是一个独立的功能单元。这些模块会封装处理逻辑,通过简洁的C/C++/Python/Go接口暴露能力。开发者可以直接复用或二次开发模块,轻松扩展框架功能。整体而言,BMF采用了十分松耦合的设计原则。各个模块与Pipeline彼此独立,能够通过热插拔的方式方便组合使用。这样一来,用户可以根据实际需求轻松修改流程, maximal 地发挥BMF强大又灵活的视频处理能力。
示例:编写一个 GPU 视频滤镜模块
基于先前的理解,我们来实际编码一个使用GPU滤镜的BMF视频处理模块:
- 以C++编写该模块源码,使用CUDA调用GPU加速;
- 定义四个接口分别处理输入参数、处理逻辑、输出结果和释放资源;
- 输入参数包括视频数据指针和信息;处理逻辑使用CUDA函数完成滤镜效果,如将视频颜色由RGB转灰度;
- 输出接口返回经滤镜处理后的视频流;释放接口结束CUDA任务和释放内存。
- 编写CMake配置,编译生成这个模块的可执行文件。
- 在Python中使用BMF API动态加载这个模块,测试转码转灰度效果是否正常。
通过这种示例,开发者可以理解BMF模块化开发模式,自行开发和集成各类视频处理功能及GPU优化能力。这无疑可以大大增强BMF在工业应用中的扩展性。
使用场景
至此,我们已经对BMF有了全面而深入的了解。那么它在哪些实际场景下可以得到应用呢?
视频监督:通过实时视频分析抽取关键信息,帮助视频审查和监控工作。
视频会议:通过实时音视频采集、处理集成进会议系统,提供流畅高清体验。
视频直播:支持低延迟实时视频采集编解码,实现多码流直播输出。
视频教育:实现视频增强滤镜等功能,提高教学互动质量。
视频编辑:提供多编辑能力拼接生成用户定制视频。
视频存储:解码多种格式视频至统一规格,便于存储管理。
以上场景仅举几例,实际上BMF的应用更为广泛。它通过简洁整洁的API,帮助开发者快速在现实生产中解决复杂视频处理需求。相信随着功能不断丰富,BMF必将为更多用户服务。
BMF是一个功能强大、设计理念先进的跨平台视频处理框架。作为开源项目,它不仅为开发者提供开发便利,也为用户带来高效解决方案。本文希望能给读者一个全面而深入的BMF认识,更多人能体会和利用其强大潜力。这将对推动多媒体行业产生积极影响。
infoq首发链接: https://xie.infoq.cn/article/cc8f2c0acce60e8e03c9b9ae1