zoukankan      html  css  js  c++  java
  • 【计算机视觉】【并行计算与CUDA开发】GPU硬编码

    一、OpenCV中的硬编码

    OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由cv::gpu::VideoWriter_GPU完成,其示例程序如下。

    复制代码
     1 int main(int argc, const char* argv[])
     2 {
     3     if (argc != 2)
     4     {
     5         std::cerr << "Usage : video_writer <input video file>" << std::endl;
     6         return -1;
     7     }
     8 
     9     const double FPS = 25.0;
    10     cv::VideoCapture reader(argv[1]);
    11 
    12     if (!reader.isOpened())
    13     {
    14         std::cerr << "Can't open input video file" << std::endl;
    15         return -1;
    16     }
    17 
    18     cv::gpu::printShortCudaDeviceInfo(cv::gpu::getDevice());
    19     cv::gpu::VideoWriter_GPU d_writer;
    20 
    21     cv::Mat frame;
    22     cv::gpu::GpuMat d_frame;
    23 
    24     for (int i = 1;; ++i)
    25     {
    26         std::cout << "Read " << i << " frame" << std::endl;
    27         reader >> frame;
    28         if (frame.empty())
    29         {
    30             std::cout << "Stop" << std::endl;
    31             break;
    32         }
    33         cv::resize(frame,frame,cv::Size(704,576));
    34         if (!d_writer.isOpened())
    35         {
    36             std::cout << "Open GPU Writer" << std::endl;
    37 
    38             d_writer.open("output_gpu.avi", frame.size(), FPS);
    39         }
    40         d_frame.upload(frame);
    41         std::cout << "Write " << i << " frame" << std::endl;
    42         d_writer.write(d_frame);
    43     }
    44     return 0;
    45 }
    复制代码

    深入阅读cv::gpu::VideoWriter_GPU类的实现,发现其底层编码实现是基于NVCUVENC库,视频文件的封装是FFmpeg。

    二、NVCUVENC库

    NVCUVENC库是NVIDIA公司提供的视频编码库,可以实现H.264的GPU编码,接收原始YUV frames数据,编码产生NAL packets。

    利用NVCUVENC库进行视频硬编码的基本步骤如下:

    1.检测是否支持NVCUVENC

    2.新建编码器,设置编码类型

    3.设置编码参数,注册回调函数

    4.创建编码器相关资源

    5.循环编码每帧数据

    6.删除编码器,释放资源

    伪代码示意图如下所示,其中编码前缓冲区的分配,以及编码后的数据处理都由回调函数。

    回调函数说明:

    AcquireBitstream() 分配coded bitstream缓冲区

    ReleaseBitstream() 处理、保存coded bitstream

    OnBeginFrame() 编码前的初始化工作

    OnEndFrame() 编码后的统计工作

    回调函数的调用顺序:

  • 相关阅读:
    OP_REQUIRES failed at conv_ops.cc:386 : Resource exhausted: OOM when allocating tensor with shape..
    Python中*args和**kwargs的区别
    命令行运行Python脚本时传入参数的三种方式
    关于 initWithNibName 和 loadNibNamed 的区别和联系-iPhone成长之路
    NSBundle介绍
    UIView总结
    iPhone How-to:如何调整UIView的Z-Order
    有关View的几个基础知识点-IOS开发
    NSNumber与NSInteger的区别
    iOS第三方开源库的吐槽和备忘
  • 原文地址:https://www.cnblogs.com/huty/p/8517788.html
Copyright © 2011-2022 走看看