本篇博客记录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. Rosbridge 的使用

      参考文献: http://rosclub.cn/post-569.html ROS与Android的窃窃私语   1.简介 ROSbridge 顾名思义,是一个ROS当中的中间件,ROS 桥,是用 ...

  2. Oracle 重置序列

    Oracle将自增sequence重置为初始值1时,若是删除再重建,那么依赖它的函数和存储过程将失效,需要重新编译. 这里利用相反的过程,利用负值步长参数,将递增值改为(sequence.NEXTVA ...

  3. 关于汉诺塔,C++代码,代码效果演算

     1.故事介绍 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上依照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...

  4. ZooKeeper安装与执行

    首先从官网下载ZooKeeper压缩包,然后解压下载得到的ZooKeeper压缩包,发现有"bin,conf,lib"等文件夹. "bin文件夹"中存放有执行脚 ...

  5. spring异常 java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderServlet

    spring异常 java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderServlet   情况 ...

  6. Swing基础知识

    1 http://zxc8899.iteye.com/blog/1556094  最基本的组件 2 http://zhangjunhd.blog.51cto.com/113473/128174 布局管 ...

  7. JavaFX打包到Android上

    让JavaFX执行到移动平台一直是社区努力完毕的事.  当然,眼下已经能够让JavaFX执行到Android和IOS平台了,以下我们来看看怎样打包自己的JavaFX项目到Android平台.  首先下 ...

  8. 堆排序算法的java实现

         堆积排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素.堆排序是不稳定的排序方法,辅助空间为O(1), 最坏时间复杂度为O ...

  9. Maven的配置地址

    http://howtodoinjava.com/tools/eclipse/how-to-import-maven-remote-archetype-catalogs-in-eclipse/ htt ...

  10. 【PHP】富文本HTML过滤器:HTMLPurifier使用教程(防止XSS)

    在编程开发时安全问题是及其重要的,对于用户提交的数据要进行过滤,XSS就是需要重视的一点,先说一下什么是XSS,简单来说就是用户提交数据(例如发 表评论,发表日志)时往Web页面里插入恶意javasc ...