0

カメラ出力フレームをキャプチャし、GPU パイプラインでさらに処理しようとしています。このため、フレームを GPU テクスチャとして戻すことが最良のオプションです。runメソッドによって受信されたQVideoFilterRunnableクラスから継承した後、QVideoFrameオブジェクトはQAbstractVideoBuffer::GLTextureHandleと等しくない型を持ちます。と同じで、手動でテクスチャのマップ/マップ解除とロードを行う必要がありますが、これはパフォーマンスが良くありません。テクスチャ名を返すために使用できるコントロール オプションはありますか?NoHandleglTexImage

いくつかのメモ:

  • Androidで良さそうです。返されたフレームはテクスチャなので、これは魅力のように機能します:

    QVideoFrame* input = ...;
    GLuint texture = input->handle().toUInt(); 
    f->glBindTexture(GL_TEXTURE_2D, texture);
    
  • 一般に、iOS テクスチャ キャッシュ機能がある可能性があります。

    CVPixelBufferRef pixelBuffer = ...;
    CVOpenGLESTextureCacheCreateTextureFromImage(..., pixelBuffer, ..., &textureRef);
    texture = CVOpenGLESTextureGetName(textureRef);
    
4

1 に答える 1

0

CVPixelBufferRef手動で作成できます(mapまだ使用する必要があります):

frame.map(QAbstractVideoBuffer::ReadOnly);

CVPixelBufferRef x;
CVPixelBufferCreateWithBytes(
    kCFAllocatorDefault,
    frame.size().width(),
    frame.size().height(),
    kCVPixelFormatType_32BGRA,
    frame.bits(),
    frame.bytesPerLine(),
    nullptr, // releaseCallback
    nullptr, // releaseRefCon
    nullptr, // pixelBufferAttributes
    &x
);

CVPixelBufferRefポインタの値を使用してキャッシュ テクスチャを作成する:

CVOpenGLESTextureRef texRef;
CVOpenGLESTextureCacheCreateTextureFromImage(
    kCFAllocatorDefault,
    textureCache,
    x,
    NULL, // texture attributes
    GL_TEXTURE_2D,
    GL_RGBA, // opengl format
    inputW,
    inputH,
    inputPixelFormat,
    GL_UNSIGNED_BYTE,
    0,
    &texRef
);

テクスチャ名の取得:

inputTexId = CVOpenGLESTextureGetName(texRef);
于 2015-12-21T17:03:41.633 に答える