日常工作主要开发环境是MAC,在MAC下涉及音视频处理用到的主要工具:
- 音视频播放:VLC、FFPLAY
- 音视频采集:OBS
- 音视频编解码处理:FFMPEG、OpenCV
- 音频处理:Audition
- 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 服务端)推荐使用方式以详细描述。内部结构和原理也可以多一些介绍,让大家使用时更有数。
总体来说是一个不错的项目,大而全,如果能够对不同场景做更合理的拆分,实用性会更强。