强大的高效视频处理框架——BMF | 社区征文

BMF2023总结

BMF 概述

BMF 是一款强大的跨平台、多语言、可定制的视频处理框架,用起来特别便利和强大,并且支持 GPU 加速。我粗略的体验了一番,BMF会成为日后工具箱中的重要一员,有了它需要转码时再也不用辛辛苦苦的到处寻找解决方式,最重要的是,它还支持特别多的高级应用,又强大又好用的一门工具。

我去了解了一下BMF的架构设计,叹为观止,BMF从架构设计到实现,涵盖了多种特性致力于解决新时代视频处理所面临的诸多困难。

picture.image

在我体验后,我认为 BMF 有几个方面深得我心。

  1. 简洁的多语言接口:使用非常方便,只要我安装成功,代码集成度超高,无非复杂配置,轻松就能完成所需。
  2. 文档健全,这很重要,很多应用无需重复造轮子,直接使用官方提供的案例修改即可
  3. 多语言支持,BMF 支持python、C++、Go语言,模块与框架之间,模块与模块之间松耦合,解耦度非常高,极大的增强了扩展能力和多元化的协同能力
  4. 成熟可靠,据不成熟统计,该框架每天处理超过20亿个视频,在可靠性和稳定好方法都足以信任
  5. 支持GPU,我认为这是图像处理、视频处理非常关键的一点,可以充分发挥电脑的性能,加速视频的处理过程
  6. 与AI结合,这点让我很欣喜,AI的强大有目共睹,与AI结合,自己实现的难度和复杂度不用我多说,借助BMF,已经可以实现多款AI处理方式,我唯一感觉的就是还不够,如果能多几种就更完美了。

本文主要体验了后续我可能会使用的一些功能,真不错

准备工作

在使用 BMF 之前,都需要先创建一个 bmf.graph 对象,这是一切使用的基础。

import bmf
graph = bmf.graph()

视频转码

转码分为两步,解码和编码,解码使用的函数是 decode,编码使用 encode。BMF 提供的转码功能非常强大,封装的非常完善,通过简单的参数修改就能完成视频、音频的轻松转码。这点我真是太爱了。

decode 核心参数是待处理视频的路径,一般情况使用这一个参数就可以,decode 方法位于 graph 上。

video = graph.decode({
  input_path: input_video_path,
});

encode 方法则位于 bmf 对象上,参数较复杂一些。video_stream, audio_stream 分别代表视频流和音频流,encoder_para 是编码参数,核心是输出路径。

def bmf.builder.ff_filter.encode (video_stream, audio_stream, encoder_para, type ="", path ="", entry ="", stream_alias =None)

然后我们就可以这样使用,下面举一个将 mp4 格式进行 hls 切片,同时不涉及音频和视频部分的解码和编码

bmf.encode(
    video['video'],
    video['audio'],
    {
        "output_path": output_path,
        "format": "hls",
        "mux_params": {
            "hls_list_size": "0",
            "hls_time": "2",
            "hls_segment_filename": "./file%03d.ts"
        }
    }
).run()

然后我们可以将 decode 和 encode 一起来进行使用,只处理视频部分,对其进行压缩,同时更换编码方式,这也可以较为轻松的实现。

input_video_path = "./big_bunny_10s_30fps.mp4"
output_path = "./decode_scale_encode_output.mp4"
(
    bmf.graph()
        # 只提取视频部分
        .decode({'input_path': input_video_path})['video']
        # 压缩视频
        .scale(720, 576)
        .encode(None, {
            "output_path": output_path,
            # 更换编码格式
            "video_params": {
                "codec": "libx265"
            }
        }).run()
)

同样的我们也可以只修改音频部分,前后各自添加一段音频,然后再进行编码。

input_video_path = "./big_bunny_10s_30fps.mp4"
output_path = "./with_null_audio.wav"

# create graph
graph = bmf.graph()

# decode
streams = graph.decode({
    "input_path": input_video_path
})

# 创建空的音频
audio_stream1 = graph.anullsrc('r=48000', 'cl=2').atrim('start=0', 'end=6')
audio_stream2 = graph.anullsrc('r=48000', 'cl=2').atrim('start=0', 'end=6')
# 音频连接
concat_audio = (
    bmf.concat(audio_stream1, streams['audio'], audio_stream2, n=3, v=0, a=1)
)

(
    bmf.encode(
        # 不处理视频
        None,
        # 只处理音频
        concat_audio,
        {
            "output_path": output_path,
            # 使用 wav 编码,实现 mp4 -> wav 的转换
            "audio_params": {
                "codec": "aac",
                "bit_rate": 128000,
                "sample_rate": 44100,
                "channels": 2
            }
        }
    )
    .run()
)

与 AI 结合

除了转码功能外,BMF 还具备很多便捷的功能,最让我赞叹的是与 AI 的结合。下面就官网提供的例子,来一起展望一一下 AI 与 BMF 的强大结合、

老照片上色

老照片上色、历史照片修复这些现在看来都不足为奇,毕竟 AI 做图片还是有一手,BMF 把最先进的着色算法(DeOldify 算法)集成到了 BMG 视频处理中,视频的翻新也变得简单起来。

Step1: 引入 DeOldify 着色算法,也就是 BMF-python 模块,设置 BMF 处理管道(解码-》彩色码-》编码),运行即可。

Step2:AI 视频处理是十分消耗性能的,需要庞大的算力,建议开启 GPU。

torch.cuda.is_available()

Step3: 设置 BMF 管道的执行顺序

graph = bmf.graph()

video = graph.decode({"input_path": input_video_path})

# 核心部分,对解码后的视频执行着色算法
output_video = video['video'].module(
    'py_deoldify_module',
    option={"model_path": model_weight_path})
# 编码
bmf.encode(
    output_video[0],
    None,
    {"output_path": output_video_path}
    ).run()

# 定义管道
def show_video(video_path, video_width = 800):

  video_file = open(video_path, "r+b").read()

  video_url = f"data:video/mp4;base64,{b64encode(video_file).decode()}"

  return HTML(f"""<video width={video_width} controls><source src="{video_url}#t=0.01"></video>""")

太强了,只需要在原有的视频转码过程中,加入对 DeOldify 算法,就可以轻松实现视频的翻新。

picture.image

其他应用

有了视频翻新的理念,其他的AI实现就比较好理解了,例如超分辨率便是在视频的转码过程中,结合 RealESRGAN 推理算法,借助通道就可以轻松实现。把握住转码的核心流程线,很多日常中比较复杂的视频处理都可以借助 BMF 来进行简化。

总结

BMF 真的是对了我的口味,作为一项多媒体处理框架,这是一项非常成熟和可靠的框架,它支持多语言、异构计算,GPU和CPU并行处理,与AI进行结合,完全兼容FFmpeg,搭建了一套完整的体系,对于多媒体处理领域是极大利好,对于日常使用者,简单便捷。

infoq链接 https://xie.infoq.cn/article/0e332586f79bbd7c183f9aaf2

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论