DXGI抓屏优化扩展:GPU硬件编码保存文件即录像为MP4和FLV,外加麦克风+计算机声音

我们一般要实现某个功能,首先希望能找到对应的DEMO,比如我们做屏幕共享,在WIN10下,首先想到的就是DXGI技术,帧率和效率是非常不错的,这里不讲性能,讲下怎么扩展某些功能:

前面一篇文章已经介绍和实现了以下功能:

  1. 鼠标功能:
  2. 数据获取
  3. 多显示器需求(多屏,副显,扩展屏说法很多)

写这篇文章的目的在于继续扩大其高性能应用,我们继续扩展以下功能:

  1. 硬件GPU编码
  2. 录像同时保存为MP4和FLV
  3. 录像时同时预览视频(D3D显示)
  4. 声音输入多种选择:麦克风,计算机声音,麦克风+计算机声音混合

先说第一个:

DXGI如此性能优秀的截屏方法,如果我们再用H264软件编码,是不是有点暴殄天物

(拼音是bào tiǎn tiān wù),既然可以用dxgi抓屏,也可以用显卡加速进行编码,目前代码支持INTEL的QSV硬件加速和英伟达的CUDA硬件加速编码,当然也可以选择H264软编码,前者和后者主要还是性能上的差异,经过硬件加速的H264编码比软件编码更快,缺点是兼容性不是很好,不过既然都支持DXGI了,肯定也有显卡编码加速的支持。

好的,我们加上吧,直接上代码就是这么简单粗暴:

bool CFFFindEncoder::Find(char* szName)
{//MessageBox(0,L"1",0,0);AVCodecContext *c= NULL;//AVFrame *frame;AVPacket *pkt;AVCodec *codec=avcodec_find_encoder_by_name(szName);if(codec==0)return false;//MessageBox(0,L"2",0,0);c = avcodec_alloc_context3(codec);if (!c) {return false;}//MessageBox(0,L"3",0,0);pkt = av_packet_alloc();if (!pkt){return false;}c->bit_rate = 8000000;c->width = 1920;c->height = 1080;c->time_base.num=1;c->time_base.den=25;c->framerate.num=25;c->framerate.den=1;c->gop_size = 10;c->max_b_frames = 0;c->pix_fmt = AV_PIX_FMT_NV12;//AV_PIX_FMT_YUV420P;if (codec->id == AV_CODEC_ID_H264)av_opt_set(c->priv_data, "preset", "slow", 0);int ret = avcodec_open2(c, codec, NULL);if (ret < 0) {return false;}//MessageBox(0,L"4",0,0);avcodec_free_context(&c);av_packet_free(&pkt);return true;
}

以上代码是判断是否支持硬件编码:

调用代码为:

 int bOK0=0;//enc.Find(L"opus");char* Encoder[4]={"h264_qsv","h264_nvenc","libx264","h264_amf"};for(int i=0;i<4;i++){char* szEncoder=Encoder[i];bOK0=enc.Find(szEncoder);//hevc_nvenc  h264_qsvif(bOK0){m_nEncoder=i;PCHAR szA=Encoder[i];m_cx=(m_cx/16)*16;m_cy=(m_cy==768?768:m_cy);enc.Init(szA,m_cx ,m_cy);break;}}

如上面代码所示, h264_qsv显卡为intel GPU,h264_nvenc显卡为英伟达 GPU,libx264为软件编码,h264_amf还没测试,下次买个AMD的笔记本测试,不过代价挺大,哎,开发也不容易啊!

编码器初始化后就可以编码图像数据(YUV)为视频数据(H264)了,dxgi输出数据为RGB32,我们需要转换为NV12或者YV12,一般用libyuv进行转换效率更高。来吧,上代码:

static int ARGBToYv12(uint8* src_frame,uint8* dst_frame,int width,int height)
{           uint8* yplane= dst_frame;      uint8* uplane= dst_frame   + width    * height;       uint8* vplane= uplane+    (width  * height/4);        int n = libyuv::ARGBToI420(src_frame,width*4,yplane, width,uplane, width/2,vplane, width/2, width, height);        return n;
}static int ARGBToNv12(uint8* src_frame,uint8* dst_frame,int width,int height)
{           uint8* yplane= dst_frame;      uint8* uplane= dst_frame   + width    * height;       uint8* vplane= uplane+    (width  * height/4);        int n = libyuv::ARGBToNV12(src_frame,width*4,yplane, width,uplane, width, width, height);      return n;
}

这个颜色空间转换速度很NICE,要做就做最好,这是我的原则!

先写到这里,下次继续写。。。尽请期待!QQ35744025联系我,美女优先

DXGI抓屏优化扩展:GPU硬件编码保存文件即录像为MP4和FLV,外加麦克风+计算机声音相关推荐

  1. 如何用DXGI抓屏,并识别视频文件中的数字

    项目内容 DXGI 抓屏,设计定时器,获取数据之后回调函数,多屏 建立数字图片数据库,pytorch 训练模型 回调函数,识别数字框,存取drop位置,copy drop位置内存,存到queue 新建 ...

  2. h264_nvenc GPU硬件编码与硬件加速

    参考: https://developer.nvidia.com/blog/nvidia-ffmpeg-transcoding-guide/ https://developer.nvidia.com/ ...

  3. Matlab | MATLAB编辑器:无法使用GBK编码保存文件,请改用UTF-8编码保存文件(问题解决)

    ================================================ 博主github:https://github.com/MichaelBeechan 博主CSDN:h ...

  4. 抓屏的各种方法(http://www.codeproject.com/KB/dialog/screencap.aspx)

    文章翻译自 P.GopalaKrishna 的 Various methods for capturing the screen 一文,原版地址见下面.本文章版权归原作者所有.     如果转载该译文 ...

  5. VC 抓屏的各种方法

    目录: 1 导言 2 用GID函数抓屏 3  用DirectX方式抓屏 4 用Windows Media API抓屏 1 导言 有时候我们需要编程抓取整个屏幕上的内容,下面我将介绍抓屏是如何实现的.典 ...

  6. JAVA输出带BOM的UTF-8编码的文件

    https://blog.csdn.net/comeonyangzi/article/details/81708134 当从http 的response输出CSV文件的时候,设置为utf8的时候默认是 ...

  7. windows远程桌面实现之一 (抓屏技术总览 MirrorDriver,DXGI,GDI)

    https://blog.csdn.net/fanxiushu/article/details/73269286 by fanxiushu 2017-06-14     转载或引用请注明原始作者 要实 ...

  8. ffmpeg快速抓屏DXGI技术,基于screen-capture-recorder抓屏的升级screen-capture-dxgi:directshow滤镜,升级为支持dxgi120帧

    文章包含资源下载地址: (136条消息) screen-capture-recorder升级dxgi版本安装包(支持120帧高帧率,低CPU占有率)资源-CSDN文库 (8条消息) screen-ca ...

  9. 集显也能硬件编码:Intel SDK 各种音视频编解码学习详解

    http://blog.sina.com.cn/s/blog_4155bb1d0100soq9.html INTEL MEDIA SDK是INTEL推出的基于其内建显示核心的编解码技术,我们在播放高清 ...

  10. 【读书笔记】【WebKit技术内 幕(三)】GPU硬件加速渲染、canvas与WebGL、 JavaScript与JavaScript 引擎、JavaScriptCore与V8

    文章目录 前言 Something great 第8章 硬件加速机制 硬件加速基础 -- *** Chromium的硬件加速机制 -- *** 其他硬件加速模块 第9章 JavaScript引擎 Ja ...

最新文章

  1. 如何理解JS的单线程?
  2. NLP界的「MVP」再次夺冠,刷新GLUE榜单
  3. Ubuntu 14.04.1 安装 python mysqldb
  4. 配置切入点表达式|| 前置通知、后置通知、异常通知、最终通知、环绕通知
  5. PHP 遇见 Serverless,帮你解决这些痛点
  6. Socket详解——全面明了
  7. (一)为什么要UML
  8. 微软Power BI技术文章与资源目录
  9. openjdk(HOTSPOT)垃圾回收源码解读
  10. tornado学习笔记day01-高并发性能web框架
  11. python字符串定义符_python入门——定义字符串
  12. GYM 101617 F
  13. 47. Use traits for information about types.
  14. EXTJS弹出框关闭 隐藏 显示都没问题
  15. 计算机坏处英语,玩电脑的危害英语作文,沉迷电脑的危害英语作文!
  16. Android半圆形进度条动画,Android:半圆形进度条
  17. MLAPP————第五章 贝叶斯统计
  18. Vim 编辑器及其基本操作
  19. 数据结构实训《表达式求值》
  20. Android实现身份证识别

热门文章

  1. git提交代码时遇到代码库有更新以及本地有更新的解决方法
  2. 常用的编程语言有哪些
  3. 云端(服务器)车牌识别SDK
  4. 51单片机 之 8*8 LED点阵(解决程序烧录没反应、显示拖影问题、取字模软件)
  5. 嫡权法赋权法_赋权法_
  6. java 车牌模糊_免费模糊车牌照片处理软件
  7. 壳浏览器 android,QQ浏览器2020安卓版
  8. 奈奎斯特稳定判据matlab处理,控制理论-奈奎斯特稳定判据学习笔记-综合电源技术-世纪电源网社区...
  9. 世界各国国家代码简称
  10. Linux实验四——Linux用户和用户组管理