基于英伟达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

相关推荐
TSINGSEE3 天前
画面模糊、花屏、遮挡?EasyGBS视频质量诊断让监控故障主动上报
音视频·视频编解码·画面冻结·花屏检测·画面抖动·蓝屏检测·偏色检测
TSINGSEE4 天前
融合与重构:从EasyDSS一站式视频云平台看流媒体技术如何重塑企业交互边界
重构·音视频·视频编解码·智能摘要·智能字幕
willhuo4 天前
纯C#实现了RTSP摄像头拉流并转存MP4文件
开发语言·c#·视频编解码
zymill4 天前
hysAnalyser和flvAnalyser对比
音视频·实时音视频·视频编解码·h.264·智能电视·视频分析·mpeg-2
憧憬成为原神糕手10 天前
音视频学习一
学习·音视频·视频编解码
q55070717721 天前
格式转换专家视频格式转换教程
视频编解码·视频处理·格式工厂
TSINGSEE24 天前
国标GB28181视频质量诊断:EasyGBS服务插件EasyVQD快速识别花屏、蓝屏、画面冻结抖动
人工智能·音视频·实时音视频·视频编解码·视频质量诊断·花屏检测·画面抖动
ℳ₯㎕ddzོꦿ࿐1 个月前
告别延迟:HLS (m3u8) 实时转 FLV 全栈方案实战
视频编解码
霜雪i1 个月前
ISP模式
视频编解码·h.266
CheungChunChiu1 个月前
视频编解码与 GOP 结构详解
linux·视频编解码