wang-bin / mdk-sdk

multimedia development kit. download:
https://sourceforge.net/projects/mdk-sdk/files/
291 stars 33 forks source link

请教一个问题,onFrame 在窗口最小化时就没有回调了,导致窗口最小化时视频相当于就被暂停了,有什么好的解决方法吗 #187

Closed RAVER0306 closed 8 months ago

wang-bin commented 8 months ago

onFrame不需要窗口也有回调,你代码里暂停的,你可以给个最简单的例子

RAVER0306 commented 8 months ago

onFrame不需要窗口也有回调,你代码里暂停的,你可以举个最简单的例子

不好意思,是我在updatePaintNode中阻塞了 onFrame,似乎最小话QQuickItem就不触发updatePaintNode了,我能在onFrame里面将QSGNode转成纹理提供给 QQuickItem 去绘制吗,因为我需要在onFrame解码的帧之上绘制一些内容

wang-bin commented 8 months ago

qsgnode(qsgsimpletexturenode)本来就可以提供纹理给item显示的,和onFrame没关系,onFrame不在渲染线程没法直接操作qsgnode。如果只是绘制简单的内容不需要知道帧内容,renderVideo()之后就可以加你想绘制的代码。如果要对渲染后帧的内容进行处理,可以参考 gyroflow 里用的代码,可能需要注意同步问题

RAVER0306 commented 8 months ago

renderVideo()

我刚刚试了一下,在窗口最小化的时候,QQuickWindow::beforeRendering 信号似乎也没有发出,听您说的方法,我是需要在onFrame里面使用QRhi的接口将纹理提供给QRhi,然后再onFrame的最后调用一次renderVideo()吗

wang-bin commented 8 months ago

onframe不能用,线程不对,你要确保在qsg的渲染线程里渲染。最小化了为啥还要渲染?不清楚你要做什么

RAVER0306 commented 8 months ago

我目前的做法是在updatePaintNode中通过grabToImage获取quickitem的绘制内容,最小化之后收不到这些信号,这条路就走不通了

RAVER0306 commented 8 months ago

我在onframe之后需要保存帧图片,然后再到updatePaintNode绘制AI识别帧的方框,最后对比原图和在VideoTextureNode基础上绘制一些方框的图片

wang-bin commented 8 months ago

最小化了为什么还要处理?没最小化你是怎么做的?没最小化你用onframe能做的话最小化也一样啊

RAVER0306 commented 8 months ago

没最小化是在updatePaintNode里面使用 grabToImage 和 QSGGeometry 做的

RAVER0306 commented 8 months ago

现在我应该是要在onframe里面通过OpenCV或者qt相关的工具类画好转成纹理提供给item绘制了,这样Qt不绘制也能正常保存原图和AI识别的图片了

wang-bin commented 8 months ago

要用内存上都数据处理的话onframe回调里对frame数据处理,硬解用frame.to()拷贝显存数据和转换格式等,处理好再赋值给frame,这么做会很慢。grabimage也是慢的

RAVER0306 commented 8 months ago

好吧,非常感谢您的帮助