【高效视频处理】BMF 项目安装与老视频修复体验全流程及总结

一、BMF简介

BMF(Babit Multimedia Framework)是字节跳动开发的跨平台、多语言、可定制的多媒体处理框架。经过 4 年多的测试和改进,BMF 已经过量身定制,能够熟练地应对我们现实生产环境中的挑战。目前广泛应用于字节跳动的视频串流、直播转码、云剪辑和移动前/后处理场景。该框架每天处理超过 20 亿个视频。
在这里插入图片描述
官方仓库地址为:https://github.com/BabitMF/bmf?tab=readme-ov-file

二、BMF初体验

2.1、安装方式

1️⃣、pip安装
首先要确保本机已经安装了Python,然后使用pip install BabitMF安装BabitMF,安装过程中其会帮你同时安装依赖包,显示successfully安装即为成功:
在这里插入图片描述
2️⃣、源码编译安装
首先我们使用git clone命令克隆BMF源码git clone https://github.com/BabitMF/bmf bmf,克隆完成后,项目的文件结构如下:
在这里插入图片描述
使用重终端命令cd进入bmf项目目录,然后输入./build.sh开始构建,构建可能会持续5到15分钟:
在这里插入图片描述

2.2、初步体验

1️⃣、创建Graph

import bmf
graph = bmf.graph()
video = graph.decode({"input_path": input_video_path //输入视频的本地目录地址
})
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()

Graph是bmf中最基础的一个概念,使用graph.decode和encode可以对视频进行解码和编码,这里首先使用import bmf导入模块,然后使用graph = bmf.graph() 创建了一个graph对象,然后video = graph.decode({“input_path”: input_video_path}) 使用创建的图形对象对输入视频进行解码。解码后,video对象包含了解码后的视频数据和相关信息。bmf.encode(…).run() 是对解码后的视频进行编码,其中
视频参数包括:

  • “codec”: “h264” - 视频编码器为H.264。
  • “width”: 320 - 视频宽度为320像素。
  • “height”: 240 - 视频高度为240像素。
  • “crf”: 23 - 视频质量控制参数,值越低质量越高。

音频参数包括:

  • “codec”: “aac” - 音频编码器为AAC。
  • “bit_rate”: 128000 - 音频比特率为128,000 bps。
  • “sample_rate”: 44100 - 音频采样率为44.1 kHz。
  • “channels”: 2 - 音频通道数为2(立体声)。“preset”: “very fast” - 编码速度预设为"very fast"。

2️⃣、创建Pipeline
同时,BMF提供构建一个视频处理的Pipeline,通过串联不同的同步模块来实现视频处理的流程:

  1. 构建同步模块:首先调用bmf_sync.sync_module接口创建四个bmf模块(c_ffmpeg_decoder、c_ffmpeg_filter(Scale)、c_ffmpeg_filter(volume)、c_ffmpeg_encoder)。然后,它不断循环地从输入视频中读取视频流,逐帧解码,并首先将其发送到缩放过滤模块,将视频缩放到320x250的分辨率。然后,获取处理后的视频帧,发送至音量过滤模块进行一次音量调节。最后,视频被发送到编码器模块进行视频编码并保存为文件。
  2. 构建管道:调用了 bmf_sync.process 接口,直接执行同步模块的处理过程,将输入数据包提供给模块进行处理,并返回处理后的结果和任务完成的时间戳。
  3. 管道循环:不断调用 bmf_sync.process 来处理视频和音频帧。使用 decoder 模块处理输入数据。得到 frames 字典,其中包含了不同通道的视频或音频帧。如果有下一帧需要处理,分别根据通道编号(0 或 1)判断是否有帧数据,然后使用 scale 或 volume 模块进行相应的处理,最后将处理后的帧数据传递给 encoder 模块继续处理。

其核心代码如下:

import bmf
from bmf import bmf_sync, Packet
input_video_path = "./big_bunny_10s_30fps.mp4"
output_path = "./video.mp4"def bmf.builder.bmf_sync.sync_module (name, option, input_streams, output_streams 
)
def bmf.builder.bmf_sync.process (module, pkts_dict 
)   # create sync modules
decoder = bmf_sync.sync_module("c_ffmpeg_decoder", {"input_path": input_video_path}, [], [0, 1])
scale = bmf_sync.sync_module("c_ffmpeg_filter", {"name": "scale","para": "320, 250"
}, [0], [0])
volume = bmf_sync.sync_module("c_ffmpeg_filter", {"name": "volume","para": "volume=3"
}, [0], [0])
encoder = bmf_sync.sync_module("c_ffmpeg_encoder", {"output_path": output_path
}, [0, 1], [])while True:frames, _ = bmf_sync.process(decoder, None)has_next = Falsefor key in frames:if len(frames[key]) > 0:has_next = Truebreakif not has_next:bmf_sync.send_eof(encoder)breakif 0 in frames.keys() and len(frames[0]) > 0:frames, _ = bmf_sync.process(scale, {0: frames[0]})bmf_sync.process(encoder, {0: frames[0]})if 1 in frames.keys() and len(frames[1]) > 0:frames, _ = bmf_sync.process(volume, {0: frames[1]})bmf_sync.process(encoder, {1: frames[0]})

2.3、老视频修复体验

熟悉了基础的BMF操作后,我们可以体验一下BMF修复老视频的demo,官方为我们提供了一个写好的colab的notebook:https://colab.research.google.com/github/BabitMF/bmf/blob/master/bmf/demo/colorization_python/deoldify_demo_colab.ipynb

点击进入链接,连接到Colab的资源,申请T4资源,申请成功后如下所示:
在这里插入图片描述

然后点击代码执行程序-全部运行:
在这里插入图片描述
运行流程首先会克隆老视频修复的git仓库,然后安装对应的依赖和工具:
在这里插入图片描述
其通过构建一个 BMF 模块,使用 DeOldify 算法对黑白视频进行颜色化处理。核心代码如下:

class py_deoldify_module(bmf.Module):def __init__(self, node, option=None):print(f'py_deoldify_module init ...')self.node_ = nodeself.option_ = optionprint(option)warnings.filterwarnings("ignore", category=UserWarning, message=".*?Your .*? set is empty.*?")#NOTE:  This must be the first call in order to work properly!#choices:  CPU, GPU0...GPU7device.set(device=DeviceId.GPU0)if not torch.cuda.is_available():print('warning: GPU is not available, the computation is going to be very slow...')weight_path=Path('/content/DeOldify')if option and 'model_path' in option.keys():model_path = option['model_path']if not model_path:print(f'model_path={model_path}')weight_path=Path(model_path)self.colorizer = get_stable_video_colorizer(weight_path)self.idx = 0print(f'py_deoldify_module init successfully...')def process(self, task):# iterate through all input queues to the moduleidx = self.idxfor (input_id, input_queue) in task.get_inputs().items():# get output queueoutput_queue = task.get_outputs()[input_id]while not input_queue.empty():# get the earliest packet from queuepacket = input_queue.get()# handle EOFif packet.timestamp == Timestamp.EOF:output_queue.put(Packet.generate_eof_packet())task.timestamp = Timestamp.DONE# process packet if not emptyif packet.timestamp != Timestamp.UNSET and packet.is_(VideoFrame):vf = packet.get(VideoFrame)rgb = mp.PixelInfo(mp.kPF_RGB24)np_vf = vf.reformat(rgb).frame().plane(0).numpy()# numpy to PILimage = Image.fromarray(np_vf.astype('uint8'), 'RGB')colored_image = self.colorizer.colorize_single_frame_from_image(image)if not colored_image:print(f'Fail to process the input image with idx = {idx}')continueif debug:input_name = f'video/bmf_raw/frame_{idx}.png'print(f'input_name = {input_name}')image.save(input_name)output_name = f'video/bmf_out/frame_{idx}.png'print(f'output_name = {output_name}')colored_image.save(output_name)self.idx = idx + 1out_frame_np = np.array(colored_image)rgb = mp.PixelInfo(mp.kPF_RGB24)frame = mp.Frame(mp.from_numpy(out_frame_np), rgb)out_frame = VideoFrame(frame)out_frame.pts = vf.ptsout_frame.time_base = vf.time_basepkt = Packet(out_frame)pkt.timestamp = out_frame.ptsoutput_queue.put(pkt)return ProcessResult.OK

模型构建好之后,在2-2这里,可以修改相关的参数,其中:input_video_path是输入视频路径,output_video_path是输出彩色视频路径。model_weight_path是在步骤1-3中下载模型权重的路径(仅体验的话不用管这个参数)。
在这里插入图片描述
等待片刻后,就能输出对应的老视频修复结果了:
在这里插入图片描述

三、BMF体验总结

3.1、优点

通过以上实践体验,总的来讲,BMF通过提供简洁易用的跨语言接口、灵活的调度和扩展性,以 graph/pipeline 的方式构建高性能的多媒体处理链路,以模块化的方式动态扩展、管理和复用视频处理,非常适合运用在视频转码、视频抽帧、视频增强、视频分析、视频插帧、视频编辑、视频会议、VR 等领域,其具有:

1、跨平台兼容性:BMF广泛支持多个操作系统,包括Linux、Windows和Mac OS,并且经过优化以适应x86和ARM CPU架构,确保在不同平台上的高效运行。

2、多语言支持:BMF提供Python、Go和C++ API,为开发人员提供了使用首选编程语言进行开发的灵活性,使项目更易于使用。

3、高效数据处理:BMF提供了无缝的数据格式转换,涵盖了流行框架(FFmpeg/Numpy/PyTorch/OpenCV/TensorRT)。这包括硬件设备(CPU/GPU)之间的转换,以及色彩空间和像素格式的高效转换,为项目提供高度灵活性和效率。

3.2、缺点

1、ARM GPU支持受限:官方暂不支持ARM GPU架构。
2、文档较少:目前仅有官方文档和极少数论坛文章可供参考。
3、社区活跃度不足:目前社区相对不够活跃,遇到问题时可能难以获得及时的帮助和反馈。

最后

💖 个人简介:人工智能领域研究生,目前主攻文本生成图像(text to image)方向

📝 个人主页:中杯可乐多加冰

🔥 限时免费订阅:文本生成图像T2I专栏

🎉 支持我:点赞👍+收藏⭐️+留言📝

另外,我们已经建立了研学交流群,如果你也是大模型、T2I方面的爱好者或研究者可以私信我加入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/602356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

主流大语言模型从预训练到微调的技术原理

引言 本文设计的内容主要包含以下几个方面: 比较 LLaMA、ChatGLM、Falcon 等大语言模型的细节:tokenizer、位置编码、Layer Normalization、激活函数等。大语言模型的分布式训练技术:数据并行、张量模型并行、流水线并行、3D 并行、零冗余优…

机器学习--回归算法

🌳🌳🌳小谈:一直想整理机器学习的相关笔记,但是一直在推脱,今天发现知识快忘却了(虽然学的也不是那么深),但还是浅浅整理一下吧,便于以后重新学习。 &#x1…

IOS:Safari无法播放MP4(H.264编码)

一、问题描述 MP4使用H.264编码通常具有良好的兼容性,因为H.264是一种广泛支持的视频编码标准。它可以在许多设备和平台上播放,包括电脑、移动设备和流媒体设备。 使用caniuse查询H.264兼容性,看似确实具有良好的兼容性: 然而…

【响应式编程-05】Lambda方法引用

一、简要描述 Lambda的方法引用也叫引用方法 方法引用初体验方法引用的底层实现方法引用的语法格式方法引用举例 静态方法引用构造方法引用普通方法引用super和this方法引用数组的方法引用 二、方法引用初体验 为什么出现方法引用? 引用已存在方法,避免重…

四则运算 C语言xdoj20

问题描述: 输入两个整数和一个四则运算符,根据运算符计算并输出其运算结果(和、差、积、商、余之一)。注意做整除及求余运算时,除数不能为零。 输入说明: 使用scanf()函数输入两个整数和一个运算符&#xf…

政府采购变数大,AI PC是联想的“新希望”?

文|新熔财经 作者|余一 发布两款AI PC,并预热CES将有AI PC大动作后,联想似乎找到了计算机终端的新思路。 而在这之前,联想终端业务面临的挑战不可谓不严重。 “事业单位更换纯国产电脑”、“联想被排除在大订单之外…

前端面试题-nodejs

1.什么是nodejs,它与传统的网页服务器有什么不同? 是什么?nodejs是基于Chrome V8引擎的JavaScript运行环境,它可以使JavaScript代码在服务器上运行。 有什么不同?第一,nodejs采用事件驱动、非阻塞式I/O模型…

汽车电子行业的 C 语言编程标准

前言 之前分享了一些编程规范相关的文章,有位读者提到了汽车电子行业的MISRA C标准,说这个很不错。 本次给大家找来了一篇汽车电子行业的MISRA C标准的文章一同学习下。 什么是MISRA? MISRA (The Motor Industry Software Reliability Ass…

微型导轨在设备中起什么作用

微型导轨精度高,摩擦系数小,自重轻,结构紧凑,可以用于电子制造设备、半导体制造设备、医疗设备、光学设备和机器人等各种工业机械设备中,那么微型导轨在设备中起什么作用呢? 1、导向与定位:为机…

G4周:CGAN,手势生成

本文为🔗365天深度学习训练营 中的学习记录博客 原作者:K同学啊|接辅导、项目定制 我的环境: 1.语言:python3.7 2.编译器:pycharm 3.深度学习框架Pytorch 1.8.0cu111 一、CGAN介绍 条件生成对抗网络(…

Visio导出eps格式图片

Visio导出eps格式图片 文章目录 Visio导出eps格式图片1. Visio中使用Adobe Acrobat虚拟打印2. Adobe Acrobat中裁剪并另存为eps格式 如何使用Visio绘图然后导出.eps格式的图片呢?这个过程需要用到Adobe Acrobat,使用Adobe Acrobat的虚拟打印功能&#xf…

ssm基于JAVA的驾校信息管理系统设计论文

摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古…

Java HashMap 面试题(一)

HashMap 面试题(一) 文章目录 HashMap 面试题(一)3.3 面试题-说一下HashMap的实现原理?面试题-HashMap的put方法的具体流程hashMap常见属性源码分析 3.3 面试题-说一下HashMap的实现原理? HashMap的数据结…

篇三:让OAuth2 server支持密码模式

由于Spring-Security-Oauth2停止维护&#xff0c;官方推荐采用 spring-security-oauth2-authorization-server&#xff0c;而后者默认不支持密码授权模式&#xff0c;本篇实战中采用的版本如下&#xff1a; <dependency><groupId>org.springframework.security<…

1-02VS的安装与测试

一、概述 对于一名C语言程序员而言&#xff0c;进行C语言程序的开发一般需要一个文本编辑器加上一个编译器就足够了。但为了方便起见&#xff0c;我们选择使用集成开发环境——Visual Studio&#xff08;简称VS&#xff09;。安装Visual Studio 下面讲一下如何安装VS&#xff0…

【AI视野·今日Sound 声学论文速览 第三十八期】Mon, 1 Jan 2024

AI视野今日CS.Sound 声学论文速览 Mon, 1 Jan 2024 Totally 5 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers The Arrow of Time in Music -- Revisiting the Temporal Structure of Music with Distinguishability and Unique Orientability as the …

金和OA C6 MailTemplates.aspx SQL注入漏洞复现

0x01 产品简介 金和OA协同办公管理系统软件(简称金和OA),本着简单、适用、高效的原则,贴合企事业单位的实际需求,实行通用化、标准化、智能化、人性化的产品设计,充分体现企事业单位规范管理、提高办公效率的核心思想,为用户提供一整套标准的办公自动化解决方案,以帮助…

【DevOps-07-3】Jenkins集成Sonarqube

一、简要说明 Jenkins安装Sonarqube插件Jenkins安装和配置Sonar-Scanner信息Jenkins打包项目中,增加Sonar-Scanner代码质量扫描二、Jenkins安装Sonarqube插件 1、登录Jenkins管理后台,搜索安装Sonar-Scanner插件 Jenkins管理后台示例:http://192.168.95.131:8080/jenkins/

Oracle数据库新手零基础入门,Oracle安装配置和操作使用详解

一、教程描述 本套教程是专门为初学者量身定制的&#xff0c;无需任何Oracle数据库基础&#xff0c;课程采用循序渐进的教学方式&#xff0c;从Oracle数据库的基础知识开始讲起&#xff0c;并不会直接涉及到一项具体的技术&#xff0c;而是随着课程的不断深入&#xff0c;一些…

docker部署mysql主从复制篇

环境准备&#xff1a;docker服务安装&#xff0c;mysql镜像 配置文件方式&#xff1a;可以挂载目录&#xff0c;也可以写好配置文件&#xff0c;利用docker cp 到容器内&#xff0c;这里直接在启动镜像创建容器时候挂载目录方式服务器上配置文件内容(下图标红路径)&#xff1a…