开源赛道 1:高效视频处理
BMF 是一套通用的多媒体处理框架,通过提供简洁易用的跨语言接口、灵活的调度和扩展性,以模块化的方式动态扩展、管理和复用视频处理的原子能力。它以 graph/pipeline 的方式构建高性能的多媒体处理链路,同时还可以直接调用单个处理能力实现工程集成,帮助多媒体用户便捷、高效地将项目落地于生产环境。目前主要应用于视频转码、视频抽帧、视频增强、视频分析、视频插帧、视频编辑、视频会议、VR 等领域。
BMF 项目地址:https://github.com/BabitMF/bmf
了解/体验火山引擎多媒体处理框架 BMF,投稿内容可以是:
- 在调用部署安装过程中的具体问题和解决方法
- 运行 BMF 的体验与反馈,包括优势与不足
- 使用 BMF 搭建应用的过程
前文
笔者略懂python,从产品的定义去理解使用BMF ,BMF是一个针对主要针对非结构化文件【即视频、音频】进行编辑操作的多媒体处理框架,BMF的编辑操作分为 Transcode、 Edit、 Meeting/Broadcaster、CPU+GPU、 acceleration、 AI一共五部分。
- 面向对象主要是开发者或者使用者,怎么提供通俗易懂的更友好的五部份相关的API?
- 更友好的五部分相关的DEMO示例?
- 参数展开相关的形象立体的解释。
环境配置
I | 系统 | CPU | 内存 |
---|---|---|---|
Ubuntu 20.04.6 LTS | i7-4710HQ *8核 | 12G |
安装步骤
安装基础包
apt update
apt install -y make \
git pkg-config \
libssl-dev \
cmake binutils-dev \
libgoogle-glog-dev \
gcc g++ yasm nasm
apt install -y python3.9 \
python3-dev \
python3-pip
apt install -y \
ffmpeg \
libavcodec-dev \
libavdevice-dev \
libavfilter-dev \
libavformat-dev \
libavresample-dev \
libavutil-dev \
libpostproc-dev \
libswresample-dev \
libswscale-dev
我这里安装的时候需要 cmake3.1.7
https://cmake.org/files/
tar zxvf cmake-3.1.7.tar.gz
cd cmake-3.1.7
cmake .
make -j8
make install
把原来的cmake替代
root@henley-Inspiron-7447:~/cmake-3.1.7# update-alternatives --install /usr/bin/cmake cmake /usr/local/bin/cmake 1 --force
update-alternatives: using /usr/local/bin/cmake to provide /usr/bin/cmake (cmake) in auto mode
正式下载bmf
git clone https://github.com/BabitMF/bmf
cd bmf
进行编译安装
./build.sh
加载bmf相关库和头文件,环境 设置 如下
我默认的文件在/root/bmf
export pwd=/root/bmf/build
export C_INCLUDE_PATH=${C_INCLUDE_PATH}:$(pwd)/output/bmf/include
export CPLUS_INCLUDE_PATH=${CPLUS_INCLUDE_PATH}:$(pwd)/output/bmf/include
export LIBRARY_PATH=${LIBRARY_PATH}:$(pwd)/output/bmf/lib
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$(pwd)/output/bmf/lib
# only set if you want to use BMF in python
export PYTHONPATH=$(pwd)/output/bmf/lib:$(pwd)/output
python进入控制,看是否能够加载相关库
import bmf
graph = bmf.graph()
DEMO使用
/usr/local/bin有一些现成的命令功能,我的理解就是DEMO,看否能够正常使用。
/usr/local/bin/run_bmf_graph 就可以完成一个视频的转码,使用方式如下
/usr/local/bin/run_bmf_graph /root/bmf/output/test/run_by_config/config.json
/root/bmf/input1.mp4是输入, /root/bmf/out.mp4是输出
config.json的内容如下
{
"mode": "normal",
"input_streams": [],
"output_streams": [],
"option": {
"dump_graph": 1
},
"nodes": [
{
"id": 0,
"option": {
"input_path": "/root/bmf/input1.mp4"
},
"input_streams": [],
"output_streams": [
{
"identifier": "audio:ffmpeg_decoder_0_2",
"alias": ""
},
{
"identifier": "video:ffmpeg_decoder_0_1",
"alias": ""
}
],
"module_info": {
"name": "c_ffmpeg_decoder",
"type": "",
"path": "",
"entry": ""
},
"input_manager": "immediate",
"scheduler": 0,
"meta_info": {
"premodule_id": -1,
"callback_bindings": []
}
},
{
"id": 1,
"option": {
"name": "scale",
"para": "100:200"
},
"input_streams": [
{
"identifier": "ffmpeg_decoder_0_1",
"alias": ""
}
],
"output_streams": [
{
"identifier": "ffmpeg_filter_1_0",
"alias": ""
}
],
"module_info": {
"name": "c_ffmpeg_filter",
"type": "",
"path": "",
"entry": ""
},
"input_manager": "immediate",
"scheduler": 0,
"meta_info": {
"premodule_id": -1,
"callback_bindings": []
}
},
{
"id": 2,
"option": {
"name": "vflip"
},
"input_streams": [
{
"identifier": "ffmpeg_filter_1_0",
"alias": ""
}
],
"output_streams": [
{
"identifier": "ffmpeg_filter_2_0",
"alias": ""
}
],
"module_info": {
"name": "c_ffmpeg_filter",
"type": "",
"path": "",
"entry": ""
},
"input_manager": "immediate",
"scheduler": 0,
"meta_info": {
"premodule_id": -1,
"callback_bindings": []
}
},
{
"id": 3,
"option": {
"video_params": {
"width": 320,
"codec": "h264",
"crf": 23,
"preset": "veryfast",
"height": 240
},
"audio_params": {
"channels": 2,
"bit_rate": 128000,
"codec": "aac",
"sample_rate": 44100
},
"output_path": "/root/bmf/out.mp4"
},
"input_streams": [
{
"identifier": "ffmpeg_filter_2_0",
"alias": ""
},
{
"identifier": "ffmpeg_decoder_0_2",
"alias": ""
}
],
"output_streams": [],
"module_info": {
"name": "c_ffmpeg_encoder",
"type": "",
"path": "",
"entry": ""
},
"input_manager": "immediate",
"scheduler": 1,
"meta_info": {
"premodule_id": -1,
"callback_bindings": []
}
}
]
}
我的使用
我对bmf的了解主要是根据这个
https://babitmf.github.io/docs/bmf/quick_experience/
我想了解 python相关的 api,根据这个
https://babitmf.github.io/docs/bmf/api/api_in_python/
我想了解更多的DEMO使用,根据以下demo目录。
demo目录下有更多的使用例子
建议改进
- python api建议以五部分的方式来进行编排分布,再按照工程上的特点来进行分组,再按照功能特点划组织划分
- python api的api细粒度参数详解,翻看了几个页面,来回 看了很久,感觉只有对api的声明,缺乏具休的参数调整后带来的变化 。
- DEMO示例已经声明技术环境需要准备什么,但是业务来看光从语言还是没有了解到它所处的业务场景 ,建议用视频的方式来表明这个DEMO的示例和起到的效果是要用来做什么。
- 作为国内不多的多媒 体框架,建议一个命令工具能够马上测出这个效果出来,现在我来看只有一个run_bmf_graph,这个run_bmf_graph感觉 没有那么好用,不能代表bmf。
- 建议自带 官方的视频数据集在这里,这样使用后能够快速展现结果,而不是我还要上传一个视频。