高效视频处理框架 BMF 实践|社区征文

2023总结
高效视频处理框架BMF实践

日常工作主要开发环境是MAC,在MAC下涉及音视频处理用到的主要工具:

  1. 音视频播放:VLC、FFPLAY
  2. 音视频采集:OBS
  3. 音视频编解码处理:FFMPEG、OpenCV
  4. 音频处理:Audition
  5. OCR:Mac自带

其他AI相关的音视频处理,比如图像识别,语音转文本,文本转语音,基于商业API。 最近接触到字节开源的高效音视频处理框架bmf,在FFMPEG等流行开源库基础上封装了其他更强大的能力。

bmf框架是三层设计,底层提供了音视频相关的基础处理滤镜,实时流媒体(WebRtc)处理,3D处理等,中间框架层提供了各语言基础能力封装,框架的图/管道调度、跨数据类型和跨设备数据传输后端,以及常用的跨设备格式化、色彩空间转换、张量算子等sdk,接口层提供了多语言的API接口。

本文基于docker跑通了bmf框架,实践了解码和合成功能。

1、环境搭建

日常工作使用的是Inter芯片的Mac本,基于docker环境搭建了bmf环境。 bmf提供的docker镜像基于ubuntu 20.04,它包含了运行BMF CPU和GPU的完整环境依赖:Cuda11.8, Pytorch 2.0, TensorRT 8.6.1, CV-CUDA 0.3。 安装完docker后执行官方教程命令:

# 拉取官方镜像
docker pull babitmf/bmf_runtime:latest

启动docker环境:

docker run  -it babitmf/bmf_runtime:latest bash

编译bmf:

./build.sh

2、跑通demo

bmf基于graph的方式组织各个模块,使用下面方式构建graph:

import bmf

graph = bmf.graph()

构建完后可以直接使用内置的模块解码视频:

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

平时如果我们要将一个音频和视频文件合成一个文件,通常使用ffmpeg命令:

ffmpeg -i input_video.mp4 -i input_audio.aac -c:v copy -c:a copy output.mp4

bmf官方提供了对应实现:

bmf.encode(
     video['video'],
     video['audio'],
     {
         "output_path": output_path,
         "video_params": {
             "codec": "h264",
             "width": 320,
             "height": 240,
             "crf": 23,
             "preset": "very fast"
         },
         "audio_params": {
             "codec": "aac",
             "bit_rate": 128000,
             "sample_rate": 44100,
             "channels": 2
         }
     }
)
     .run()

这里指定了音频参数和视频参数,比ffmpeg更灵活,比ffmpeg代码实现更便捷。

此外bmf还提供了视频增强、实时音视频传输等能力,对于音视频处理绝对是一个宝库,等待着我们去挖掘和尝试。

3、使用感受总结

bmf的接口框架及接口设计都比较不错,整体体验也比较方便,但是总体上看文档建设有待提高,从能力到最佳实践缺少更详细的描述,针对不同场景和不同端(移动端 or 桌面端 or 服务端)推荐使用方式以详细描述。内部结构和原理也可以多一些介绍,让大家使用时更有数。

总体来说是一个不错的项目,大而全,如果能够对不同场景做更合理的拆分,实用性会更强。

https://xie.infoq.cn/article/4bba56946712b546ffcd65a0c

157
0
0
0
关于作者
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论