C++ 如何在不映射到系统内存的情况下访问视频帧数据?
我正在使用Qt,我可以将我的Logitech网络摄像头中的视频流封装在C++ 如何在不映射到系统内存的情况下访问视频帧数据?,c++,qt,video,overlay,gpu,C++,Qt,Video,Overlay,Gpu,我正在使用Qt,我可以将我的Logitech网络摄像头中的视频流封装在QCamera子类QVideoAbstractSurface中,并从那里将其馈送到视频小部件(特别是QCameraViewfinder)中,而不会出现问题。抱歉,视频帧永远不会进入系统内存,这就是我想要的。然而,我想进一步操纵这个视频(添加一些覆盖)。为此,对于每个帧,我需要获取句柄(QAbstractVideoBuffer::handle()),并将其与OpenGL API一起使用,以添加覆盖 bool MyVideoSur
QCamera
子类QVideoAbstractSurface
中,并从那里将其馈送到视频小部件(特别是QCameraViewfinder
)中,而不会出现问题。抱歉,视频帧永远不会进入系统内存,这就是我想要的。然而,我想进一步操纵这个视频(添加一些覆盖)。为此,对于每个帧,我需要获取句柄(QAbstractVideoBuffer::handle()
),并将其与OpenGL API一起使用,以添加覆盖
bool MyVideoSurface::present(const QVideoFrame& frame)
{
QVariant h = frame.handle();
// ... Manipulate h using OpenGL
// ... Send frame to a video widget
}
问题是,当我这样做时,h
无效,无论我如何指定QVideoSurfaceFormat
。例如,在初始化之前,我已经
QVideoSurfaceFormat qsvf(surfaceSize, pixelFormat, QAbstractVideoBuffer::GLTextureHandle);
mVideoSurface->start(qsvf); // MyVideoSurface instance
(相关文档和。)输入什么句柄类型并不重要,它们都无效(在某些情况下毫不奇怪)
我有没有办法在没有映射的情况下访问我的网络摄像头视频帧?我很高兴解决方案打破了我关于哪些Qt类是相关类的任何特定假设,但需要有重叠,需要在GPU上完成。访问它们的能力是否取决于硬件,即我需要提前选择一个支持此功能的设备