QML optimal way to stream/update images (Qt 5)
-
First, a little background: I'm trying to display image data streamed from a medical device in real time. The approach I am currently testing is to define a QML Image element with a custom source (e.g. "image://device/0") and use a custom QQuickImageProvider::requestPixmap() to feed the Image element with fresh data from the device.
The problem is that the Image flickers whenever I update its contents, i.e. it disappears for a moment before it reappears with the fresh data.
Is there a way to enable some form of double-buffering to avoid this ugly flicker?
Alternatively, is there a more efficient way to go about implementing this? I would imagine that I might be able to use something like a Video element with a custom source that feeds it new frames as necessary. Unfortunately, I haven't been able to find anything relevant in the documentation.
I'd be grateful if someone could point me to the right direction!
-
@TomTomTom The way to do this is not to use
QQuickImageProviderandImageInstead use
VideoOutputwith asourceset as aQObjectbased class with a writablevideoSurfaceproperty that can accept aQAbstractVideoSurfacebased class and can follow the correct protocol to deliverQVideoFramesto it.That means that Qt will call your
videoSurfacesetter with aQAbstractVideoSurfacealready constructed (you don't have to create it, you just do stuff on the one passed to you). You then need to callstarton it with theQVideoSurfaceFormatof your choice (the one of the frames you will provide to it), and then just periodically callpresenton it with aQVideoFrameyou generated.The only technical point here is to generate the
QVideoFrame, and maybe decipher the doc ;).