本篇博客记录NVENC硬编码的预研过程

github:  https://github.com/MarkRepo/NvencEncoder

步骤如下:

(1)环境搭建

(2)demo编译,测试,ARGB编码

(3)研究demo源码,阅读API文档

(4)封装so共享库,联调测试多路编码性能

(5)研究内存,显存拷贝方案,尝试解决CPU,GPU消耗过高等性能问题

1. 环境搭建

(1)编译环境,预研中这个环境不是我亲手搭建的,需要CUDAToolKit, NVENC SDK

(2)运行环境,需要Nvidia独立显卡,另外还要注意NVENC SDK的版本对显卡驱动版本有要求,具体在SDK的文档中会有说明。

2. demo测试

  demo中提供了Makefile,只需拷贝到编译环境,编译官方SDK中的demo,测试yuv编码h264, 用VLC正确播放出来。尝试编码RGB,一开始由于缺乏对YUV和RGB的理解,导致走了不少弯路,尝试了挺久才试出来。后来预研了QSVE之后才发现NVENC的编码接口更简单,需要注意的是YUV,RGB等输入数据在缓存中要行对齐。

3.研究源码,封装so共享库

  在能够正确编码rgb数据之后,设计能与SPICE服务端通信的接口,提供SO供其调用,这一步主要是研究demo源码中各个API如何调用,查看API文档的详细解说。(后面会把相关代码、文档放到github上管理)。

4.内存到显存拷贝方案。(各种方案的使用方法,不在这里细讲,参见github上的源码和相关文档)

(1)使用NVENC API分配的input buffer, 将显存指针映射成cpu指针,然后调用memcpy拷贝

(2)使用cuda的api分配的显存,然后将显存注册到NVENC,调用cuda api将内存拷贝到显存

(3)使用zero-copy, 调用cuda api分配锁页内存,映射到显存,然后注册到NVENC,往主机锁页内存写数据,当调用NVENC的编码接口时,gpu调用DMA进行数据拷贝。

三种方案总结:

NVENC显存: 占用cpu最高,主要是memcpy占用

GPU显存: 占用cpu也很高,主要CUDA api的内存拷贝

zero-copy    不占用cpu, 但是拷贝效率也不高,实际运用中体验效果不如前面两种方案。

Nvidia NVENC 硬编码预研总结的更多相关文章

  1. [转] 前后端分离开发模式的 mock 平台预研

    引入 mock(模拟): 是在项目测试中,对项目外部或不容易获取的对象/接口,用一个虚拟的对象/接口来模拟,以便测试. 背景 前后端分离 前后端仅仅通过异步接口(AJAX/JSONP)来编程 前后端都 ...

  2. 【GPU编解码】GPU硬编码

    一.OpenCV中的硬编码 OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由cv::gpu::VideoWriter_GPU完成,其示例程序如下. int main(int argc, ...

  3. 【GPU编解码】GPU硬编码 (转)

    一.OpenCV中的硬编码 OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由cv::gpu::VideoWriter_GPU完成,其示例程序如下. 1 int main(int arg ...

  4. WebRTC 源码分析(三):安卓视频硬编码

    数据怎么送进编码器? 怎么从编码器取数据? 如何做流控? 在开始之前,我们先了解一下 MediaCodec 的基本知识. MediaCodec 基础 Developer 官网 上的描述已经很清楚了,下 ...

  5. 【计算机视觉】【并行计算与CUDA开发】GPU硬编码

    一.OpenCV中的硬编码 OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由cv::gpu::VideoWriter_GPU完成,其示例程序如下. 1 int main(int arg ...

  6. 告别硬编码,让你的POI导入导出拥抱变化

    GitHub地址 | 博客 | 中文 | English | 原文链接 为什么使用AutoExcel? Excel导入导出在软件开发中非常常见,只要你接触过开发,就一定会遇到.相信很多人会跟我一样选择 ...

  7. iOS视频硬编码技术

    iOS视频硬编码技术 一.iOS视频采集硬编码 基本原理 硬编码 & 软编码 硬编码:通过系统自带的Camera录制视频,实际上调用的是底层的高清编码硬件模块,即显卡,不使用CPU,速度快 软 ...

  8. Android安全开发之浅谈密钥硬编码

    Android安全开发之浅谈密钥硬编码 作者:伊樵.呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码.文件中,这样做会引起很大风 ...

  9. 使用VideoToolbox硬编码H.264<转>

    文/落影loyinglin(简书作者)原文链接:http://www.jianshu.com/p/37784e363b8a著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. ======= ...

随机推荐

  1. 自己定义circle

    写了一个还不错的自己定义控件.用来展示完毕度或能力值,程序中配置好所占百分比.图中就能够用外面的圆环来显示百分比,效果还是不错的~ watermark/2/text/aHR0cDovL2Jsb2cuY ...

  2. python——双下划线与python命名机制

    python中双下划线的作用(1)所有以双下划线开头的成员是私有的(2)python对于私有变量是会进行扎压(mangling)的,扎压规则是原始定义:class A():    __function ...

  3. NSDate 类的总结,全面基础

    <span style="font-size:24px;"><span style="font-size:18px;">//1.创建日期 ...

  4. jQuery 事件 - delegate() 方法

    <html><head><script type="text/javascript" src="/jquery/jquery.js" ...

  5. 【转】纯干货:PS高手完全自学宝典(原创文章)

    文章版权:Tommy子言  原创 一. 一切从基础开始 强大的PS虽然功能众多,但归纳起来主要有三大功能: 修图——主要包括纯图片的修饰.合成.3D合成等等: 画图——主要是指用PS来绘画.广告插画, ...

  6. 正则化--Lambda

    模型开发者通过以下方式来调整正则化项的整体影响:用正则化项的值乘以名为 lambda(又称为正则化率)的标量.也就是说,模型开发者会执行以下运算: $$\text{minimize(Loss(Data ...

  7. GridControl 二次封装,自定义颜色样式风格

    1.自定义颜色格式,分组,筛选 1.封装类 必须引用类库 using System; using System.Collections.Generic; using System.Linq; usin ...

  8. Android适配方案小结(二)

    该节主要记录从代码中获取与屏幕适配相关的各个參数: Java代码例如以下 public class ScreenUtil { /** * Note: * 仅仅有activity能够使用getWindo ...

  9. Android OOM的解决方式

    尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图. 由于这些函数在完毕decode后,终于都是通过ja ...

  10. PHP压缩上传图片

    最近手上的项目页面要显示很多图片,虽然用了jQuery的lazyload,但是效果并没理想,滑动到一个区域还要比较长的时间图片才完全显示出来.于是想着将上传上去的900KB+压缩备份一份缩略图. PH ...