Qt Phonon 和 QPixmap::GrabWidget

3

我已经花了几天时间从 Phonon 媒体对象中抓取帧。我的目标是按照用户指定的间隔捕获帧。我首先尝试实现一个处理 Phonon::MediaObject 的 tick 信号的插槽。然而,由于 tick 信号在第一次机会就被发出,因此时间差异有时会有一些变化……虽然这不是一个不能解决的问题,但我还是进一步调查了一下,并尝试了 seek 和 grabWidget 的组合,但似乎 seek 需要一些时间才能完成,并且没有任何方法通知应用程序视频再次运行良好,这导致代码如下:

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

90%的时间内保存一张黑色图像,但在其余时间内正确获取帧。

我的问题是,我能否对这两个想法做出任何改进,使它们更适合我,或者我完全忽略了更明显的方法?

提前感谢!

1个回答

2
你可能误解了,这里应该可以用,使用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,它在phonon 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的快照功能。因此,暂时我将寻找其他创建快照的方法。


我也尝试过了,这个这个似乎表明我不是唯一一个在挣扎的人。决定看看是否可以使用qt ffmpeg包装器,会为类似情况的人报告结果。 - Sixx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接