VPF:适用于 Python 的开源视频处理框架,加速视频任务、提高 GPU 利用率
近日,NVIDIA 开源了适用于 Python 的视频处理框架「VideoProcessingFramework(VPF)」。该框架为开发人员提供了一个简单但功能强大的 Python 工具,可用于硬件加速的视频编码、解码和处理类等任务。
同时,由于 Python 绑定下的 C ++ 代码,它使开发者可以在数十行代码中实现较高的 GPU 利用率。解码后的视频帧以 NumPy 数组或 CUDA 设备指针的形式公开,以简化交互过程及其扩展功能。
目前,VPF 并未对 NVIDIA Video Codec SDK 附加任何限制,开发者可充分利用 NVIDIA 专业级 GPU 的功能。
Python 中的硬件加速视频处理框架 VPF
VPF 是基于 CMake 的开源跨平台框架,它依赖于 FFmpeg 库来进行(de)muxing 和 pybind11 项目从而构建 Python 绑定。它包含了一组开源的 C ++ 库和 Python 绑定,可与其封闭源代码 Codec SDK 进行交互。
该框架的主要功能是简化从 Python 开发 GPU 加速视频编码 / 解码的过程,可为视频处理任务(例如解码,编码,代码转换以及 GPU 加速的色彩空间和像素格式转换)提供完整的硬件加速。
尽管 Python 不是性能最高的语言,但它易于使用;在 NVIDIA 发布此视频处理框架之后,它相当于在现有 Video Codec SDK C ++ 堆栈周围的 Python wrapper,将用于在 Kepler 及更高版本上基于 GPU 的视频编码 / 解码。这使得 VPF 在利用基于 GPU 的高性能视频加速的同时,也获得了易于阅读 / 编写的代码。
同时值得注意的是,VPF 还利用 NVIDIA Video Codec SDK(一套全面的 API,包括用于 Windows 和 Linux 上硬件加速视频编码和解码的高性能工具,示例和文档)来提高灵活性和性能,并为开发人员提供 Python 固有的易用性。目前,该代码在 GitHub 上已开源。
Github 地址:
https:// github.com/NVIDIA/Video ProcessingFramework
代码示例及结果
在官网博客宣布 VPF 时,开发者也提供了一个简短的 Python 代码示例,该示例使用 PyNvCodec 模块显示 Python 中的视频转码:
import PyNvCodec as nvc
gpuID = 0
encFile = "big_buck_bunny_1080p_h264.mov"
xcodeFile = open("big_buck_bunny_1080p.h264", "wb")
nvDec = nvc.PyNvDecoder(encFile, gpuID)
nvEnc = nvc.PyNvEncoder({'preset': 'hq', 'codec': 'h264', 's': '1920x1080'}, gpuID)
while True:
rawSurface = nvDec.DecodeSingleSurface()
# Decoder will return zero surface if input file is over;
if not (rawSurface.GetCudaDevicePtr()):
break
encFrame = nvEnc.EncodeSingleSurface(rawSurface)
if(encFrame.size):
frameByteArray = bytearray(encFrame)
xcodeFile.write(frameByteArray)