基于英伟达PyNvVideoCodec视频编解码

整体架构:

优点:

基于PyNvVideoCodec,视频解码、AI模型推理都在显存操作,减少了显存和cpu的数据拷贝。

缺点:

接口只支持本地视频,不支持实时视频流。

环境安装:

pip install PyNvVideoCodec

示例代码:

复制代码
#!/usr/bin/env python3
"""
Decode + FasterRCNN 推理(单 GPU,零拷贝)
运行:  python infer.py
"""

import os
import torch
import torchvision
from   torchvision import transforms as T
import pycuda.driver as cuda
import pycuda.autoinit          # 自动创建并激活 primary context
import PyNvVideoCodec as nvc



# --------------------------------------------------
# 1. 参数
# --------------------------------------------------
VIDEO_PATH        = "input.mp4"          # 上一步生成的文件
BATCH             = 3                   # 每次拿 3 帧
DEVICE_ID         = 0                   # 用 0 号 GPU
BUFFER_SIZE       = 30                  # 解码器缓冲帧数

# --------------------------------------------------
# 2. 创建 CUDA stream(必须与后面 torch 用同一个)
# --------------------------------------------------
cuda.init()
dev   = cuda.Device(DEVICE_ID)
ctx   = dev.retain_primary_context()      # 与 pycuda.autoinit 同一个 context
ctx.push()
stream = cuda.Stream()                   # PyCUDA stream
ctx.pop()

# --------------------------------------------------
# 3. 初始化 ThreadedDecoder
# --------------------------------------------------
decoder = nvc.ThreadedDecoder(
    enc_file_path     = VIDEO_PATH,
    buffer_size       = BUFFER_SIZE,
    start_frame       = 0,
    cuda_context      = int(ctx.handle),   # 裸指针
    cuda_stream       = int(stream.handle),# 裸指针
    use_device_memory = True,
    output_color_type = nvc.OutputColorType.RGBP  # planar RGB
)



# 2. 立即取元数据
meta = decoder.get_stream_metadata()
if meta:                      # 防止空指针
    print("width :", meta.width)
    print("height:", meta.height)
    print("average_fps:", meta.average_fps)
    print("codec_name:", meta.codec_name)




# --------------------------------------------------
# 4. 加载模型
# --------------------------------------------------
device   = torch.device(f'cuda:{DEVICE_ID}')
model    = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
model.to(device)
model.eval()

# --------------------------------------------------
# 5. 推理循环
# --------------------------------------------------
def main():

    DESIRED_FPS = 5                # 想要的几帧/秒
    stride = max(1, round(25 / DESIRED_FPS))   # 25 是源 fps,可 ffprobe 读出来
    frame_idx = 0

    while True:
        frames = decoder.get_batch_frames(BATCH)   # list[PyCapsule]
        if len(frames) == 0:
            break

        batch_tensor = []
        for frm in frames:
            if frame_idx % stride == 0: #抽帧
            
                # 5.1 dlpack 零拷贝 → torch
                t = torch.from_dlpack(frm)          # shape: (C, H, W)  planar RGB
                t = t.float() / 255.0
                batch_tensor.append(t)

            frame_idx = (frame_idx + 1)%100

        # 5.4 组 batch
        if len(batch_tensor)!=0:
            batch = torch.stack(batch_tensor).to(device, non_blocking=True)

            # 5.5 推理
            with torch.no_grad():
                outputs = model(batch)        # List[Dict[str, Tensor]]
                print(f"[INFO]  decoded {len(frames)} frames, "
                  f"detected {[len(o['labels']) for o in outputs]} objects")

    #del decoder
    print("[INFO]  done.")

if __name__ == "__main__":
    main()

参考链接:

https://developer.nvidia.com/pynvvideocodec

https://docs.nvidia.com/video-technologies/pynvvideocodec/pynvc-api-prog-guide/index.html#overview

https://catalog.ngc.nvidia.com/orgs/nvidia/resources/pynvvideocodec?version=2.0.2

https://gitee.com/mirrors/videoprocessingframework/tree/master

相关推荐
常州晟凯电子科技1 天前
多对一无线视频传输系统评测
音视频·视频编解码
智能直播3 天前
RK3528 RGA+DRM框架 HDMI out视频输出:从多图层合成到显示送显
视觉检测·音视频·实时音视频·视频编解码
VidDown4 天前
上传 2GB 文件别让 Django 接:分片上传、对象存储直传与秒传
python·django·音视频·状态模式·实时音视频·视频编解码·视频
智能直播4 天前
RK3528 Tinyalsa/ALSA框架:输入源声音获取与HDMI out声音输出,一文讲透直播音频链路
音视频·实时音视频·视频编解码
常州晟凯电子科技7 天前
sigmaStar SSC305DE/SSC308开发笔记之开发环境搭建和SDK编译
人工智能·笔记·嵌入式硬件·物联网·性能优化·视频编解码
常州晟凯电子科技8 天前
sigmaStar SSC8836Q/SSC8826Q开发笔记之环境搭建和SDK编译
笔记·嵌入式硬件·物联网·视频编解码
VidDown15 天前
从视频画面里提取文字:OCR、文字检测与结构化输出
python·网络协议·ocr·音视频·视频编解码·视频
VidDown15 天前
文件没问题但网页播不了:播放器接入实战与那些“环境问题
python·网络协议·音视频·视频编解码·视频
VidDown15 天前
从一堆脚本到能维护的系统:视频处理管道的工程化
服务器·ffmpeg·音视频·视频编解码
the3clipse15 天前
Windows 11 对 VVC 与 AV1 编码支持全景解析:硬件、软件与开发者指南
windows·视频编解码·av1·vvc·h.266·硬件加速·视频扩展