如何获取obs视频帧的二进制数据
前面几篇文章梳理了obs的录屏和推流流程,几条纵线整理下来,算是基本理清了obs的工作流程。
现在回到第一个目标:捕捉桌面的帧数据,用rendertarget显示并输出到UE5材质。
那么,帧数据到底存放在哪里?如何读取?
现在录屏效率最高的方法,是直接调用gpu方法去从显存拿数据,dx下的方法是AcquireNextFrame函数。
在整个工程搜索这个函数,果然obs在windows下是用这个方法实现的录屏
//obs 录屏核心代码
//用dx截取当前屏幕帧
EXPORT bool gs_duplicator_update_frame(gs_duplicator_t *d)
{
DXGI_OUTDUPL_FRAME_INFO info;
ComPtr<ID3D11Texture2D> tex;
ComPtr<IDXGIResource> res;
HRESULT hr;
if (!d->duplicator) {
return false;
}
if (d->updated) {
return true;
}
hr = d->duplicator->AcquireNextFrame(0, &info, res.Assign());
if (hr == DXGI_ERROR_ACCESS_LOST) {
return false;
} else if (hr == DXGI_ERROR_WAIT_TIMEOUT) {
return true;
} else if (FAILED(hr)) {
blog(LOG_ERROR,
"gs_duplicator_update_frame: Failed to update "
"frame (%08lX)",
hr);
return true;
}
//关键步骤,这一步调用dx查询接口,将屏幕帧写入tex
hr = res->QueryInterface(__uuidof(ID3D11Texture2D),
(void **)tex.Assign());
if (FAILED(hr)) {
blog(LOG_ERROR,
"gs_duplicator_update_frame: Failed to query "
"ID3D11Texture2D (%08lX)",
hr);
d->duplicator->ReleaseFrame();
return true;
}
//copy材质到d->duplicator->texture
copy_texture(d, tex);
d->duplicator->ReleaseFrame();
d->updated = true;
return true;
}
看到这里,明白了怪不得之前所有结构都找不到图像帧的二进制data数据。
因为obs用的都是directX或openGL 的texture来存储data数据,这样做的好处是copy和渲染都直接在显存操作,避免了内存和显存交换数据进行的效率损耗。
obs是优雅了,但太浑然一体了。导致我想开个口子从obs拿二进制数据到Unrea5进行渲染就不容易做了,最简单的办法就是在obs中增加一个内存数据desktopdata,直接挂在obs下面,并增加相应的访问接口。
但这样效率肯定不会高,因为obs调用显存接口录屏之后, 还需要从显存往内存desktopdata copy一次数据。
然后我用desktopdata数据再从内存copy到Unreal5的显存,这会中断unreal5本身的渲染,去等待我这次copy完成。
有貌似完美的解决方法,如果我把desktopdata创建到显存,去暂存录屏数据,让unreal5直接访问显存的desktopdata,去copy材质,理论上是完美的,但有一个最大的雷,obs用的是dx11,unreal5.1用的是dx12,这样copy感觉会遇到一些不可测的风险。
剩下的方法有:
1 不用obs的获取桌面方法,直接在unreal5里用dx12重写获取桌面接口,但也意味着无法使用obs的rtmp推流相关流程和接口,工作量很大。而且obs最厉害的是音频和视频多通道混合,这些都是我想用的。
2 帮obs升级dx12,这个可以干,但工作量同样很大,但比1还是简单一些。
如何获取obs视频帧的二进制数据的更多相关文章
- 背水一战 Windows 10 (89) - 文件系统: 读写文本数据, 读写二进制数据, 读写流数据
[源码下载] 背水一战 Windows 10 (89) - 文件系统: 读写文本数据, 读写二进制数据, 读写流数据 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 读写文本数 ...
- Python+moviepy音视频剪辑:视频帧数据的本质、Clip的fl方法进行变换处理的原理以及滚屏案例
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一. ...
- Android CameraX ImageAnalysis 获取视频帧
CameraX使用ImageAnalysis分析器,可以访问缓冲区中的图像,获取视频帧数据. 准备工作 准备工作包括gradle,layout,动态申请相机权限,外部存储权限等等,大部分设置与Came ...
- iOS 直播-获取音频(视频)数据
iOS 直播-获取音频(视频)数据 // // ViewController.m // capture-test // // Created by caoxu on 16/6/3. // Copyri ...
- [转]android 获取视频帧
本文转自:http://blog.csdn.net/heart_Moving/article/details/17414067 今天做Android视频文件解码,需求:从一个视频文件获取到一帧一帧的图 ...
- 获取音视频文件AVMetadata数据
获取音视频文件AVMetadata数据 问题来源: http://stackoverflow.com/questions/16318821/extracting-mp3-album-artwork-i ...
- PHP通过链接获取二进制数据的方法
function urltoblob($url){ $data = @file_get_contents($url); //如果file得不到数据,则给空值 if(!$data){ $data = & ...
- 利用ffmpeg获取视频帧
如果要对视频帧进行处理,可以先把视频帧读取出来. sh文件代码如下: #!/usr/bin/env sh VIDEO=/home/xxx/video/ FRAMES=/home/xxx/frame/ ...
- FFmpeg进行视频帧提取&音频重采样-Process.waitFor()引发的阻塞超时
由于产品需要对视频做一系列的解析操作,利用FFmpeg命令来完成视频的音频提取.第一帧提取作为封面图片.音频重采样.字幕压缩等功能: 前一篇文章已经记录了FFmpeg在JAVA中的使用-音频提取&am ...
- FFmpeg 入门(1):截取视频帧
本文转自:FFmpeg 入门(1):截取视频帧 | www.samirchen.com 背景 在 Mac OS 上如果要运行教程中的相关代码需要先安装 FFmpeg,建议使用 brew 来安装: // ...
随机推荐
- SQL Server 解析Json(单层/多层)
一,单层Json数据取出 1.取出取出@JsonData字符串中的 __type,DocNo,OrderPriceTC,Organization_Code 字段 DECLARE @JsonData ...
- 20200922--计算矩阵边缘元素之和(奥赛一本通P91 3二维数组)
输入一个整数矩阵,计算位于矩阵边缘的元素之和.所谓矩阵边缘的元素,就是就一行和最后一行以及第一列和最后一列的元素. 输入; 第一行分别为矩阵的行数m和列数n(m<100,n<100),两者 ...
- react 前端导出Excel
1.首先下载 js-export-excel npm install js-export-excel; 2.下载 xlsx npm install xlsx; 3.引入 import * as ...
- 如何在Windows 10上使用VS2019 编译C
一.安装VS 2019 首先VS官网上下载免费的VS2019 community.我们的目的是在Windows上使用该软件编译C,如下图所示,把使用C++的桌面开发打上勾 二.创建.C 项目 1.打开 ...
- 【项目记录】2:python3 使用MySQL 出现RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods 报错
报错是因为缺少了一个库 cryptography 导入了就好了. ps:如果是本机,输入IP会报错,直接使用localhost可连接数据库
- 学习JavaScript第三周
字符串的遍历,字符串虽是简单数据类型却有对应的属性和方法,这是因为字符串是包装类型(当然布尔类型和数字类型也是包装类型),临时具有对象的属性和方法,在使用完后就会释放对象. 简单的淡入淡出的轮播图,原 ...
- requests模块获取cookie -----class 'requests.cookies.RequestsCookieJar'
#coding=utf-8 import requests url="http://www.baidu.com" response=requests.get(url) cookie ...
- hdu:Two Rabbits(区间DP)
Problem DescriptionLong long ago, there lived two rabbits Tom and Jerry in the forest. On a sunny af ...
- scanf()函数的详解以及使用时需要注意的一些细节-C语言基础
这篇文章要探讨的是"scanf()函数的详解以及使用时需要注意的一些细节".涉及scanf()函数的应用和需要注意的问题.属于C语言基础篇(持续更新). scanf()(函数原型: ...
- Delphi中IdHttp调用接口,返回值乱码
--------开发环境是Delphi XE10-------- 这里要说的是BUG问题, var respStream : TStringStream; respStream.DataString有 ...