Qt Phonon & QPixmap::GrabWidget



我已经工作了几天,从声子介质对象中获取帧。我的目标是以用户指定的某个间隔捕捉帧。我首先尝试为与Phonon::MediaObject关联的tick信号实现一个槽。然而,由于滴答信号是在第一次机会发出的,有时时差会有一些变化。。。并不是说这不是一个可行的解决方案,但我仍然进行了进一步的研究,并尝试了seek和grabWidget的组合,但似乎seek需要一些时间才能完成,并且当视频再次正常运行时,没有任何方法通知应用程序,这导致了类似的代码

obj->seek(i*m_grabInterval);
QPixmap image = QPixmap::grabWidget(m_ui.videoPlayer);

保存黑色图像90%的时间,但正确抓取帧的剩余时间。

我的问题是,对于这两个想法中的任何一个,我能做些什么来让它们对我更好地发挥作用吗?还是我大错特错了,还有一个更明显的我完全错过了?

提前感谢!

你找错了树,这应该可以,使用Phonon::VideoWidget 中的snapshot()函数创建一个QImage

编辑

我已对此事作了进一步调查。快照功能甚至没有实现。以下是声子src视频小工具.cpp中的实现:

QImage VideoWidget::snapshot() const {
    P_D(const VideoWidget);
    ConstIface<IFACES4> iface(d);
    if(iface) return iface->snapshot();
    return QImage(); // TODO not implemented in VideoInterface
}

IFACES4指的是VideoWidgetInterface44,它为声子4.4定义如下(来自videowidgetinterface.h):

class VideoWidgetInterface
{
    public:
        virtual ~VideoWidgetInterface() {}
        virtual Phonon::VideoWidget::AspectRatio aspectRatio() const = 0;
        virtual void setAspectRatio(Phonon::VideoWidget::AspectRatio) = 0;
        virtual qreal brightness() const = 0;
        virtual void setBrightness(qreal) = 0;
        virtual Phonon::VideoWidget::ScaleMode scaleMode() const = 0;
        virtual void setScaleMode(Phonon::VideoWidget::ScaleMode) = 0;
        virtual qreal contrast() const = 0;
        virtual void setContrast(qreal) = 0;
        virtual qreal hue() const = 0;
        virtual void setHue(qreal) = 0;
        virtual qreal saturation() const = 0;
        virtual void setSaturation(qreal) = 0;
        virtual QWidget *widget() = 0;
        virtual int overlayCapabilities() const = 0;
        virtual bool createOverlay(QWidget *widget, int type) = 0;
       };
     class VideoWidgetInterface44 : public VideoWidgetInterface
    {
      public:
         virtual QImage snapshot() const = 0;
    };
}
#ifdef PHONON_BACKEND_VERSION_4_4
   namespace Phonon { typedef VideoWidgetInterface44 VideoWidgetInterfaceLatest; }
#else
   namespace Phonon { typedef VideoWidgetInterface VideoWidgetInterfaceLatest; }
#endif

我还研究了gstreamer和vlc后端的实现。它们还不支持声子4.4的快照功能。因此,在接下来的时间里,我将研究创建快照的其他方法。

相关内容

  • 没有找到相关文章

最新更新