既然使用ffmpeg gdigrab可以实现辅屏的采集,那么必须适配一下DXGI的多屏幕采集(先前实现参考《【音视频】WIN8|WIN10的桌面采集技术-DXGI(一)》)。

1、修改初始化d3d函数

将获取的IDXGIAdapter和IDXGIOutput保存为成员

int DuplicationCaptor::initD3d()
{int err = ERROR_CODE_OK;do {err = getAdapter(&m_adapter, &m_output, m_outputIndex);HCMDR_ERROR_CODE_BREAK(err);err = createD3dDevice(m_adapter, &m_d3dDevice);HCMDR_ERROR_CODE_BREAK(err);} while (0);return err;
}

其中getAdapter实现修改如下:

int DuplicationCaptor::getAdapter(IDXGIAdapter** adapter, IDXGIOutput** output, uint32_t& outputIndex)
{int err = ERROR_CODE_OK;do {std::list<IDXGIAdapter*> adapters;err = getAdapters(adapters);HCMDR_ERROR_CODE_BREAK(err);if (adapters.empty()) {err = ERROR_CODE_DXGI_FOUND_ADAPTER_FAILED;break;}bool found = false;for (std::list<IDXGIAdapter*>::iterator it = adapters.begin(); it != adapters.end(); it++) {UINT index = 0;IDXGIOutput* adapterOutput = nullptr;DXGI_ADAPTER_DESC adapterDesc = { 0 };(*it)->GetDesc(&adapterDesc);for (index = 0; (*it)->EnumOutputs(index, &adapterOutput) != DXGI_ERROR_NOT_FOUND; index++) {DXGI_OUTPUT_DESC outputDesc = { 0 };RECT outputRect = { 0 };HRESULT hr = adapterOutput->GetDesc(&outputDesc);if (FAILED(hr)) {continue;}outputRect = outputDesc.DesktopCoordinates;// The target area is within the selected areaif (m_rect.left >= outputRect.left && m_rect.top >= outputRect.top &&m_rect.right <= outputRect.right && m_rect.bottom <= outputRect.bottom) {found = true;break;}}if (found) {err = ERROR_CODE_OK;*adapter = *it;*output = adapterOutput;outputIndex = index;break;}}} while (0);return err;
}

2、修改初始化dxgi函数

使用获取的IDXGIOutput* m_output获取IDXGIOutputDuplication* m_duplication

int DuplicationCaptor::initDuplication()
{int err = ERROR_CODE_OK;do {HRESULT hr;IDXGIOutput* output = m_output;output->GetDesc(&m_outputDesc);IDXGIOutput1* output1 = nullptr;hr = output->QueryInterface(__uuidof(IDXGIOutput1), reinterpret_cast<void**>(&output1));output->Release();output = nullptr;if (FAILED(hr)) {err = ERROR_CODE_DXGI_QUERY_INTERFACE_FAILED;break;}// Create desktop duplicationhr = output1->DuplicateOutput(m_d3dDevice, &m_duplication);output1->Release();output1 = nullptr;if (FAILED(hr)) {err = ERROR_CODE_DXGI_DUPLICATE_FAILED;if (hr == DXGI_ERROR_NOT_CURRENTLY_AVAILABLE) {err = ERROR_CODE_DXGI_DUPLICATE_NOT_AVALIABLE;}LOGGER::Logger::log(LOGGER::LOG_TYPE_ERROR, "[%s] duplicate output failed %ld", __FUNCTION__, hr);break;}} while (0);return err;
}

3、采集桌面时注意重启采集器的情况

在采集线程中添加reinit:

void DuplicationCaptor::captureProcess()
{/* 省略 */while (m_running) {err = reinit();if (err != ERROR_CODE_OK) {if (m_onVideoCaptureError != nullptr) {m_onVideoCaptureError(err, m_index);}break;}err = getDuplicatedFrame(&frameInfo);/* 省略 */}/* 省略 */
}

reinit的实现如下。当桌面分辨率改变时重启采集器。

int DuplicationCaptor::reinit()
{int err = ERROR_CODE_OK;long handle = atol(m_deviceId.c_str());HMONITOR monitor = reinterpret_cast<HMONITOR>(handle);MONITORINFO mi;mi.cbSize = sizeof(mi);do {if (!GetMonitorInfo(monitor, &mi)) {err = ERROR_CODE_DEVICE_GET_MONITOR_FAILED;break;}RECT rect = mi.rcMonitor;if (rect.left != m_rect.left || rect.top != m_rect.top ||rect.right - rect.left != m_rect.right - m_rect.left ||rect.bottom - rect.top != m_rect.bottom - m_rect.top) {cleanup();err = init(m_deviceId, m_fps);HCMDR_ERROR_CODE_BREAK(err);if (!attatchedDesktop()) {err = ERROR_CODE_DXGI_ATTATCH_DESKTOP_FAILED;LOGGER::Logger::log(LOGGER::LOG_TYPE_ERROR, "[%s] attach desktop error: %s, last error: %lu",__FUNCTION__, HCMDR_GET_ERROR_DESC(err), GetLastError());if (m_onVideoCaptureError != nullptr) {m_onVideoCaptureError(err, m_index);}break;}err = initDuplication();if (err != ERROR_CODE_OK) {LOGGER::Logger::log(LOGGER::LOG_TYPE_ERROR, "[%s] init duplication error: %s", __FUNCTION__,HCMDR_GET_ERROR_DESC(err));if (m_onVideoCaptureError != nullptr) {m_onVideoCaptureError(err, m_index);}break;}}} while (0);return err;
}

【音视频】使用DXGI实现多屏幕采集(4-2)相关推荐

  1. Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件(学习笔记)

    关于 AudioRecord Android SDK 提供了两套音频采集的API,分别是:MediaRecorder 和 AudioRecord,前者是一个更加上层一点的API,它可以直接把手机麦克风 ...

  2. JavaCV音视频开发宝典:使用JavaCV采集windows系统声音并录制成mp3音频文件(FFmpeg采集windows系统声音)

    <JavaCV音视频开发宝典>专栏目录导航 <JavaCV音视频开发宝典>专栏介绍和目录 前言 之前已经写过很多采集windows.macos和linux本机麦克风声音的文章, ...

  3. android pcm文件大小_Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件...

    一.AudioRecord API详解 AudioRecord是Android系统提供的用于实现录音的功能类. 要想了解这个类的具体的说明和用法,我们可以去看一下官方的文档: AndioRecord类 ...

  4. JavaCV音视频开发宝典:JavaCV混合屏幕录屏和系统声音录制mp4视频文件(windows桌面屏幕和系统声音混合录制)

    <JavaCV音视频开发宝典>专栏目录导航 <JavaCV音视频开发宝典>专栏介绍和目录 前言 之前已经写过dshow方式采集摄像头画面.麦克风.系统声音和桌面屏幕画面. 之前 ...

  5. 音视频学习笔记1--音视频基础知识(1)

    音视频基础知识 1 音视频开发是什么? 2 音视频数据处理流程 2.1 音视频数据采集 2.2 封装与解封装 2.3 音视频输出 2.4 音视频同步 3 视频中的基础概念 3.1 视频码率 3.2 视 ...

  6. 《JavaCV音视频实战宝典》专栏介绍和目录

    <JavaCV音视频实战宝典>是2022年最新推出专注于音视频开发的高级实战宝典教程系列,更加偏重综合类流媒体音视频应用,技术不在局限于JavaCV,可能会包含结合Java中较为经典的sp ...

  7. 音视频开发开发核心知识+新手入门必看基础知识

    音视频开发是一个广泛的领域,它涉及到多个技术领域,包括音频编解码.视频编解码.媒体容器格式.流媒体传输.音视频处理等.以下是音视频开发的一些基础知识: 音频编解码器:音频编解码器是将数字音频信号编码成 ...

  8. Android 音视频开发学习思路

    Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 初级入门篇: Android 音视频开发(一) ...

  9. android音频开发6,Android 音视频开发(一) : 通过三种方式绘制图片

    想要逐步入门音视频开发,就需要一步步的去学习整理,并积累.本文是音视频开发积累的第一篇. 对应的要学习的内容是:在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView ...

  10. Android 音视频难学?音视频(流媒体)开发学习也有套路

    我们都知道音视频流媒体开发这块的知识比较纷繁复杂,对新手很不友好,自学难度大,想要们既需要比较扎实的C/C++基础,又需要有很多的工程/项目经验,今天就从音视频开发/开源框架/就业方向分析,为广大开发 ...

最新文章

  1. 一高校公示拟聘用人员信息,多为大龄“双非”土博,好像也没那么卷……
  2. VC++代码转换为QT代码问题总结
  3. Mac 下安装 ruby 环境解决 brew 安装 yarn 问题
  4. linux下/etc目录详解
  5. ML之API:国内外各大人工智能平台(百度云/华为云/阿里云/Face++等)及其API的简介、使用方法之详细攻略
  6. [Cordova]JS和Native交互实现关键代码(iOS)
  7. linux nginx F配置,linux下nginx的安装及配置
  8. 使用runtime 实现weex 跳转原生页面
  9. 赛锐信息:SAP设计ERP主路线
  10. 30岁,没有月入过万算失败吗?用可视化分析30岁的人收入真相
  11. 巴菲特致股东的一封信:2007年
  12. 斗地主不算花色算大小王,起初发到的17张牌有多少种?
  13. python用于导入模块或模块中的对象_在 Python 中导入模块中的对象有哪几种方式? (5.0分)_学小易找答案...
  14. [Python]networkx入门
  15. mongodb compact 理解
  16. Nginx采用yum安装-Carr
  17. NR DCI Format介绍
  18. 【AI视野·今日CV 计算机视觉论文速览 第219期】Tue, 15 Jun 2021
  19. Python之路【第三篇】:文件操作
  20. python生成一笔画_python实现欧拉路径查找算法与微信小游戏《一笔画完》(一)...

热门文章

  1. SQL2008 安装需要重启计算机
  2. 罗斯蒙特8712ESR1A1N0M4流量变送器
  3. prometheus + cadvisor + grafana 监控容器和服务器
  4. oracle数据存入临时表,ORACLE数据库临时表总结
  5. liunx的du命令查看文件夹大小
  6. itextpdf 更换字体
  7. Android多国语言缩写(全)
  8. “十四五”融合地表水国控断面监测数据(约3641个点位,含水质等级、水温,pH,溶解氧,电导率,浊度,高猛酸盐指数,化学需氧量,五日生化需氧量,氨氮,总磷,总氮,铜,锌,氟化物,硒,砷,汞,镉,等)
  9. 《中国各省名由来》 2010年11月03日
  10. android 视频播放器m3u8,Android 播放/下载M3U8视频(转)