• [高性能] 关于如何高效的往本地写入视频


    前言

    视频流中检测算法,如果要从cv::Mat形式写入本地,怎么可以快速且高效呢?

    方式1

    把cv::Mat直接以单个图片的形式写入本地,使用cv::imwrite()即可;

    如果觉得速度慢,可以使用多线程从同一个队列里去取,然后写入本地

    方式2

    图像如果都以单个文件形式存在本地的话,比较散,可以使用opencv videowriter 写入本地视频

    方式3

    如果写入视频太慢的话,有什么办法提高速度呢?下面才是要表达的

    - 方式3.1

    使用 使用opencv cuda版本,利用显卡编码写入本地

    -方式3.2

    使用ffmpeg cpu 写入本地,利用多线程的形式

    -方式3.3

    使用cuda ENC 硬编码的形式写入视频文件

    - 方式3.4

    使用ffmpeg +cuda编码的形式写入视频

    以上硬编码的话,各有利弊,同时你也可以选择H264、H265的编码形式


    方式3.1
    opencv cuda编码 该方案放弃了 HAVE_NVCUVENC ,2014年的时候使用的是这个库,当时还没有win10,现在接口变了,叫CUVID,opencv samples中并没有给出解码的接口

    ---- opencv cuda 编码------
    https://github.com/opencv/opencv/blob/master/samples/gpu/video_writer.cpp
    opencv 找到ffmpeg包
    https://zhuanlan.zhihu.com/p/472115312
    https://blog.csdn.net/wanggao_1990/article/details/124555285
    HAVE_NVCUVENC 弃用了
    https://github.com/opencv/opencv/issues/18271


    方式3.4
    ----- ffmpeg cuda 编码----------
    打开Nvidia控制面板,选择“管理3D设置”,点击左下角“系统信息”
    https://blog.csdn.net/u012117034/article/details/123131144
    nvidia 给出的编译建议
    https://docs.nvidia.com/video-technologies/video-codec-sdk/ffmpeg-with-nvidia-gpu/
    详细的中文安装教程
    https://blog.csdn.net/u012117034/article/details/123131144

    版本要求:

    ffmpeg版本4.3.4 :https://git.ffmpeg.org/gitweb/ffmpeg.git/shortlog/refs/heads/release/4.3
    nv-codec-headers-master 版本 11.1.5.0: https://github.com/FFmpeg/nv-codec-headers/releases
    cuda 版本 11.0
    ffmpeg 全编译
    https://github.com/GyanD/codexffmpeg/releases?page=8

    操作步骤

    1.下载好ffmpeg 和 nv-codec-headers-master到 C:\msys64\home
    2.管理员身份运行x64 Native Tools Command Prompt for VS 2019
    3. cd c:\msys64\ 启动窗口 :.\msys2_shell.cmd -mingw64
    4.准备好nv-codec-headers
    make install PREFIX=/usr
    export PKG_CONFIG_PATH=“C:/msys64/mingw32/lib/pkgconfig”:$PKG_CONFIG_PATH
    .PC 的位置 拷贝.pc文件到 C:\msys64\usr\lib\pkgconfig
    你想查看某一个名称的环境变量,命令是:echo $环境变量名,比如:echo $PKG_CONFIG_PATH
    删除环境变量: unset -v PKG_CONFIG_PATH 添加环境变量: export PKG_CONFIG_PATH=“你需要设置的路径”
    ffnvcodec include目录 C:/msys64/usr/local/include
    5. 下面命令是生效的,在开头添加 PKG_CONFIG_PATH=“C:/msys64/usr/lib/pkgconfig”
    在执行命令前,打开configure文件修改两个地方
    5.1 sm_30 -> sm_86 :ffmpeg 目录下的config 更改架构:https://www.cnblogs.com/xiaochouk/p/16228915.html
    5.2 enabled cuda_nvcc && { check_nvcc cuda_nvcc ; }
    5.3 拷贝文件 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include
    和 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\lib\x64
    到 C:\msys64\home\nv_sdk_11.0

    CC=cl.exe PKG_CONFIG_PATH="C:/msys64/usr/lib/pkgconfig" ./configure \
    --prefix=/home/ffmpeg-n4.3.4/installcuda \
    --enable-gpl \
    --enable-nonfree \
    --enable-shared \
    --enable-cuda-nvcc \
    --enable-libnpp \
    --toolchain=msvc \
    --enable-cuda \
    --enable-cuvid \
    --enable-nvenc \
    --extra-cflags="-IC:/msys64/home/nv_sdk_11.0" \
    --extra-ldflags="-LIBPATH:C:/msys64/home/nv_sdk_11.0"
    
    make -j32
    make insall
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    可能遇到的问题

    1. NVcc 失败
    https://blog.csdn.net/weixin_43442574/article/details/119540428
    重装后成功,一定要显示下方信息

    C:\Users\>nvcc -V
    nvcc: NVIDIA (R) Cuda compiler driver
    Copyright (c) 2005-2020 NVIDIA Corporation
    Built on Tue_Sep_15_19:12:04_Pacific_Daylight_Time_2020
    Cuda compilation tools, release 11.1, V11.1.74
    Build cuda_11.1.relgpu_drvr455TC455_06.29069683_0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.cuda requested, but not all dependencies are satisfied: ffnvcodec
    https://www.csdn.net/tags/OtDaQg1sMzQ2Mi1ibG9n.html
    3. nvcc fatal : Could not set up the environment for Microsoft Visual Studio using
    https://blog.csdn.net/qq_41840797/article/details/122604806 (有效)
    https://www.codenong.com/56002017/
    4.编译空间不足,尝试失败
    https://wenku.baidu.com/view/c3cd601732126edb6f1aff00bed5b9f3f90f72bb.html

    未完待续,这几天做完再贴代码

  • 相关阅读:
    深入探究Java内存模型
    混合动力电动车优化调度与建模(发动机,电机,电池组等组件建模)(Matlab代码实现)
    【尚硅谷】MybatisPlus 学习笔记(下)
    pytest精髓__fixture
    momerymap mmap 存储映射I/O
    2、灰度图
    10.Flink实时项目之订单维度表关联
    Python 设计模式之工厂函数模式
    stm32无人机-飞行力学原理
    ExtJS-内置字体图标(Font)
  • 原文地址:https://blog.csdn.net/weixin_41449637/article/details/126647975