IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ | 内存共享 -> 正文阅读

[C++知识库]C++ | 内存共享

一、背景

????????最近在做美颜软件虚拟摄像头的功能,类似YY开播(我们获取笔记本的摄像头列表时,列表中除了自带的摄像头,以及usb的摄像头,还有YY开播),查了一下网络上实现的虚拟摄像头展示的都是本地的视频,但是我这边的美颜软件需要读取自带摄像头拍摄的画面,美颜后将视频帧数据传输到虚拟摄像头中,当我们调用虚拟摄像头的时候就能看到美颜后的画面,这个功能的实现就用到了美颜软件和虚拟摄像头的内存共享。

二、代码实现

1.美颜软件写数据

(1)注册共享句柄

QMap<const char*, void*> mRegisterData;
void* RegisterSendData(const char *name, const int buf_size)
{
    if (mRegisterData.count(name)  > 0)
    {
        return mRegisterData[name];
    }
    HANDLE hMapFile2 = CreateFileMapping(
                INVALID_HANDLE_VALUE,   // 物理文件句柄
                NULL,   // 默认安全级别
                PAGE_READWRITE,   // 可读可写
                0,   // 高位文件大小
                buf_size,   // 低位文件大小
                name   // 共享内存名称
                );

    // 映射缓存区视图 , 得到指向共享内存的指针
    if (hMapFile2 != nullptr)
    {
        void* lpBase2 = MapViewOfFile(
                    hMapFile2,            // 共享内存的句柄
                    FILE_MAP_ALL_ACCESS, // 可读写许可
                    0,
                    0,
                    buf_size
                    );
        mRegisterData.insert (name, lpBase2);
        return mRegisterData[name];
    }
    else
    {
        return nullptr;
    }
}

?(2)写共享数据

void set_buffer_data(LPVOID lpBase,unsigned char* buffer_data, int buffer_size)
{
    if(lpBase)
    {
        memcpy((unsigned char*)lpBase, buffer_data, buffer_size);
    }
}

(3)调用?

LPVOID lpBase= register_data("FrameBuffer",800* 600 * 3);
if(lpBase)
{
    QImage map_img = effectImage.scaled(800,600);//effectImage即美颜后的图片
    set_buffer_data(lpBase,map_img.bits(),BUF_SIZE);
}

?2.虚拟摄像头读数据

(1)注册共享句柄并获取共享内容

bool GetFrameBuffer(const char* name, unsigned char* buffer_data, const int buf_size)
{
	if (buffer_data == nullptr)
	{
		return false;
	}
	 打开共享的文件对象
	HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, NULL, name);

	if (hMapFile) {
		LPVOID lpBase = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
		// 将共享内存数据拷贝出来
		if (lpBase != nullptr)
		{
			memcpy(buffer_data, lpBase, buf_size);

			// 解除文件映射
			UnmapViewOfFile(lpBase);
		}
		// 关闭内存映射文件对象句柄
		CloseHandle(hMapFile);
		return true;
	}
	else {
		// 打开共享内存句柄失败
		std::cout << "打开共享失败!" << std::endl;
		return false;
	}
}

(2)调用?

unsigned char* szBuffer = nullptr;
szBuffer = (unsigned char*)malloc(800*600*3*sizeof(char));
GetFrameBuffer("FrameBuffer", szBuffer, 800*600*3);

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-01 14:19:22  更:2021-08-01 14:21:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/1 5:53:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码