繁体   English   中英

Qt Phonon和QPixmap :: GrabWidget

[英]Qt Phonon & QPixmap::GrabWidget

我已经工作了几天从声子媒体对象抓取帧。 我的目标是以用户指定的某个间隔捕获帧。 我首先尝试为与Phonon :: MediaObject相关联的滴答信号实现一个​​槽。 然而,因为嘀嗒信号是在第一次机会时发出的,所以时间差异有时会有所不同......并不是说它不是一个可行的解决方案,但我仍然进一步调查并尝试了seek和grabWidget的组合,但它出现了该搜索需要一些时间才能完成,并且在视频再次正常运行时无法通知应用程序,这会导致代码如下

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

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

我的问题是,我可以做些什么来解决这两个问题,这些想法会让我们更好地为我工作,或者我是在咆哮着错误的树,还有一个更明显的我完全错过了吗?

提前致谢!

你正在咆哮错误的树, 应该工作,使用来自Phonon :: VideoWidget的snapshot()函数创建一个QImage

编辑

我进一步调查了这个问题。 快照功能甚至没有实现。 这是phonon src videowidget.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后端的实现。 它们还不支持phonon 4.4的快照功能。 因此,对于时间的推移,我将研究创建快照的其他方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM