Bmf源码解析
简介:
BMF是由字节跳动开源视频处理框架,主要包括框架,算子能力,本身携带ffmpeg模块。
框架的调度主要逻辑:抽象有向图管理业务节点,节点由自己调度线程驱动,节点和节点直接通过inputstream和outputstream链接;节点与节点之间调用通过task关联。
逻辑关系如下图:
Graph代码详解:
一:根据提供的json获取graph生成信息
BMFGraph::BMFGraph(const std::string &graph_config, bool is_path,bool need_merge)
First我们先看看创建一个graph需要的json文件应该是什么样的
[root@192 bin]# cat test.json
{
"input_streams": [], #这个graph没有输入流
"mode": "Normal",
"nodes": [
{
"alias": "",
"id": 0,
"input_manager": "immediate",
"input_streams": [],
"meta_info": {
"callback_bindings": {},
"premodule_id": 0
},
"module_info": {
"entry": "",
"name": "c_ffmpeg_decoder", #模块名:c_ffmpeg_decoder,创建模块的时候需要根据这个名字调用构造函数
"path": "",
"type": "c++" #是c++模块
},
"option": {
"input_path": "./media.mp4" #此模块输入流是同模块自己读取media.mp4文件产生,无直接输入流
},
"output_streams": [
{
"alias": "",
"identifier": "video:c_ffmpeg_decoder_0_0" #输出流和下一个节点的输入流名一样
},
{
"alias": "",
"identifier": "audio:c_ffmpeg_decoder_0_1" #输出流和下一个节点的输入流名一样
}
],
"scheduler": 0
},
{
"alias": "",
"id": 1,
"input_manager": "immediate",
"input_streams": [
{
"alias": "",
"identifier": "video:c_ffmpeg_decoder_0_0" #对应上面节点的输出流名
},
{
"alias": "",
"identifier": "audio:c_ffmpeg_decoder_0_1" #对应上面节点的输出流名
}
],
"meta_info": {
"callback_bindings": {},
"premodule_id": 0
},
"module_info": {
"entry": "",
"name": "c_ffmpeg_encoder",
"path": "",
"type": "c++"
},
"option": {
"audio_params": {
"bit_rate": 128000,
"channels": 2,
"codec": "aac",
"sample_rate": 44100
},
"output_path": "./output.mp4", #输出到文件中
"video_params": {
"codec": "h264",
"crf": 23,
"height": 240,
"preset": "veryfast",
"width": 320
}
},
"output_streams": [],
"scheduler": 1
}
],
"option": null,
"output_streams": []
}