Shaofei Wang
Shaofei Wang
这是编码(video.encode)时默认按照25 fps的帧率根据你的输入视频帧率来决定是否丢帧的策略。
可以在encode的参数中配置: "video_params": { "max_fr": 30 }, 参考bmf文档:https://babitmf.github.io/docs/bmf/api/encode_module/
这里graph/pipeline是相似的含义,就是用户可以把各种原子能力通过框架以相互关联的方式构建起来调度运行的方式。 BMF大体上有两种区别较大的使用方式,1是graph mode,2是sync mode,这种方式是指用户直接通过bmf接口调用bmf模块的原子能力而不去构建graph,是单独调用模块能力的使用方式而没有使用引擎的多模块调度功能。
参考一下test/dynamical_graph/dynamical_graph.py 1. 构建graph 2. graph/stream.run_wo_block() 3. graph.force_close()
> 好的, 谢谢! force_close在bmf::builder::Graph中没有接口,我增加了一个接口。 欢迎提patch
> graph.force_close()是不是不会把ffmpeg运行的线程杀死,使用graph.force_close()后进程出现了异常,Ctrl+c 杀不死脚本进程了 对,目前force close会强制结束各个模块,但由于并行调度,有些模块比如调用ffmpeg lib的可能会出异常。
关于Java,有Sync mode,也就是直接调用模块能力的接口;而构建Graph、带有模块调度的功能暂时不能通过Java实现。 请问使用场景是移动端上吗?
> dump_graph:1构造graph->创建解码器->创建编码器->任意一个node AddCallback->run 代码如下: nlohmann::json graph_para = {{"dump_graph", 1}}; auto graph = bmf::builder::Graph(bmf::builder::NormalMode, bmf_sdk::JsonParam(graph_para)); > > ``` > nlohmann::json decode_para = { > {"input_path", "../../files/big_bunny_10s_30fps.mp4"}}; > auto video = graph.Decode(bmf_sdk::JsonParam(decode_para));...
video = module("TWO_OUTPUT"...) stream1 = video.module(...) stream2 = video.module(...)