如何参与字节跳动多媒体处理框架BMF社区贡献

279 阅读5分钟

前言

BabitMF全称为Babit Multimedia Framework,其中的Babit其实是八比特的谐音,八比特一字节,暗示了项目来自于字节跳动。 项目的几大特点主要是:跨平台、支持多语言(C++、Python、Go)、继承了FFmpeg的功能、Nvidia定制GPU加速方案、灵活扩展能力(可接入torch等其他框架能力)。 最近社区举行了开源有奖活动 详情见mp.weixin.qq.com/s/xhjk48StX… 或者bytedance.larkoffice.com/docx/YJSVda… 现在参与BMF贡献是一个很不错的时机,如果是高校学生,也可以关注一下今年中科院软件所的开源之夏,我将会担任BMF的mentor

BMF社区简介

BMF于2023年8月23日正式开源,到如今已经接近两年了,由于之前一直服务于字节内部的业务线,比如支持抖音、剪映等大家熟知的字节产品中多媒体的处理,所以在开源这条路上,BMF还是在不断学习成长的路上,不过现在已经慢慢吸引了一些外部贡献者,相信未来能有更多较为稳定的外部贡献者。

BMF没有得到广泛开发者参与除了时间以外,我总结了一些原因:

  1. BMF目前支持conda下载软件包 但仍未支持更为大家熟知的apt yum homebrew等包管理器

2.BMF社区的维护者们都是字节内部架构级别的开发者,平时工作比较忙,对于社区问题或者PR响应并不总是很及时 不过随着外来Committer的加入 这一问题得到改善

3.BMF的接口层并不是很统一 python和c++实现同样的功能 你会发现很多接口名字都有差异(不仅仅是编码风格 而是设计和命名问题)

4.BMF的文档及部分板块代码注释较少 对新手开发者并不友好

不过这四点正好也是广大外来贡献者可以发力的点,围绕这些方面的贡献也许更容易被社区接受。

简单介绍BMF项目的组成,官方分为了三个层级 应用层、框架层、模块层。这并非意味模块层是最底层,而是因为模块是应用业务逻辑的核心,其底层实现其实还是框架层的module sdk。

我主要解读一下框架层吧,从上往下大概分为四层:

builder 构造器

engine 引擎层

modulesdk sdk层

hmp (Heterogeneous Media Process Library)异构多媒体处理库

builder其实就是接口层,cpp和python的builder都是基于engine/connector构造的

engine层应该是bmf的最重要的一层了,大多数特性都是在这里实现的,比如node、scheduler、inputstreammanager、outputstreammanager等等

Module sdk里主要是服务于engine和module编写更精简的代码,这里大多都是一些数据结构的封装、module的构造逻辑 动态加载等逻辑

hmp就不用多说了 主要是底层的数据结构、cuda逻辑等

BMF社区开源有奖活动解读

此活动是我跟maintainer提议后推行的结果,准备了很多有价值有意义的奖品,目的是为了吸引更多开发者参与BMF贡献

名次获奖人数奖品
🏆 一等奖1名影石(Insta360)X4 全景运动相机
🥈 二等奖1名苹果 AirPods Pro (第二代)
🥉 三等奖1名小米 (Xiaomi) Watch S4
优秀奖5名充电宝 + 水杯 + 魔方旅游转换插座三件套
参与奖成功合入有效 pr 水杯、魔方旅游转换插座等随机抽取
幸运奖将活动信息转发至 CS 相关飞书群、微信群(> 20 人)、或者朋友圈即可参与抽奖水杯、魔方旅游转换插座等随机抽取

我们准备了一些可认领的任务 示例如下:

Bug

  • 初级:ModuleNotFoundError: No module named 'bmf.lib._hmp'
  • 中级:bmf::builder::Node::AddCallback设置回调抛出异常

Feature

  • 中级:实现与ffmpeg命令行 -re 选项相同的功能
  • 高级:线程池支持

Interface

  • 中级: Graph::update 缺少可以 generate 的 output_stream
  • 中级: C++ dynamic api 支持

Doc

  • 初级: Add Page_GraphUtilization 说明

  • 初级: 增加 files.tar.gz 说明

当然,即使不在任务列表的其他贡献,只要是符合社区意愿,都计入本次开源有奖活动中。

参与奖还是非常推荐所有开发者朋友都来参与一下的 只要花几个小时看看BMF的相关文档 肯定能发现一些可以改进的typo

如果是想要进阶一些,建议可以尝试写一些test case 目前BMF中cpp test case是比python少很多的 理应python写的test case, cpp也要写一遍 以验证两个接口层都没有bug。

如果想要再进阶一些,可以看一看我发起的接口对齐计划 github.com/BabitMF/bmf… BMF中cpp的接口实现是少于python的 所以有大量的cpp 接口需要实现 而且难度也比较适中

如果更加进阶的话,可以看一看engine层和hmp层的bug 或者新特性的开发 比如线程池的支持

如果想深入了解,欢迎进群讨论或者直接联系我本人获取帮助 jacklau1222@qq.com

展望

我个人还是比较看好BMF的发展的,作为国内寥寥无几的开源多媒体处理框架,社区open程度还是不错的,只是maintainer都比较忙(毕竟进了大厂就只有无休止的加班了 哈哈),不过随着更多外来贡献者的加入,我相信BMF社区能发展越来越好。