1

我正在开发一个 N-API 插件,以使用windows 图形捕获API 捕获视频帧,提取帧字节并将其发送回 JavaScript。我已经尝试了事件发射器,但我无法获取数据。

这是我的 C++ 代码:

#include <napi.h>
// my other include

Napi::Value startCapture(const Napi::CallbackInfo &info){
    Napi::Env env = info.Env();
    Napi::Function emit = info[0].As<Napi::Function>();
    emit.Call({Napi::String::New(env, "start")});
    auto framePool = winrt::Direct3D11CaptureFramePool::Create(
    device, //d3d device
    winrt::DirectXPixelFormat::B8G8R8A8UIntNormalized,
    2,
    itemSize);
    // capture session
    auto session = framePool.CreateCaptureSession(item);

    // Lambda Function 
    framePool.FrameArrived([session, d3dDevice, d3dContext, &emit, &env](auto &framePool, auto &) {
        auto frame = framePool.TryGetNextFrame();
        auto frameTexture = GetDXGIInterfaceFromObject<ID3D11Texture2D>(frame.Surface());
        // Extraction the byte and so on ...
        emit.Call({Napi::String::New(env, "data"), Napi::String::New(env, "data ...")});
    }
    
    session.StartCapture();
    emit.Call({Napi::String::New(env, "end")});
    return Napi::String::New(env, "OK");
}

这里我的 JavaScript 代码调用了开始捕获函数

<!-- language-all: js -->
const EventEmitter = require('events').EventEmitter
const addon = require('./build/myaddon.node')
const emitter = new EventEmitter()

emitter.on('start', () => {
    console.log('Start Recording ...')
})
emitter.on('data', (evt) => {
    console.log(evt);
})

emitter.on('end', () => {
    console.log('Stop Recording ...')
})

addon.startCapture(emitter.emit.bind(emitter))

通常我的输出应该是数据消息的无限循环,直到我停止它

开始记录……数据数据。. . 数据

在查看了 lambda 函数framePool.FrameArrived之后,如果我正确理解 lambda 函数概念,它似乎在与startCapture函数不同的线程上运行,我只想找到一种方法来了解如何使用事件发射器将这些消息流式传输到 JavaScript 或任何其他建议都非常受欢迎。

4

0 回答 0