我已经花了几天的时间来抓取声子媒体对象的帧。我的目的是按用户指定的间隔捕获帧。我首先尝试为与Phonon::MediaObject相关的滴答信号实现一个​​插槽。但是,因为滴答信号是在第一时间发出的,所以有时时差可能会有所不同...并不是太多,以至于这不是一个可行的解决方案,但我仍然进行了进一步研究并尝试了seek和catchWidget的组合,但似乎该搜索需要一些时间才能完成,并且在视频再次正常运行时没有任何方法可以通知应用程序,这会导致类似

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

可以在90%的时间内节省黑色图像,但在剩余的时间内正确抓取帧。

我的问题是,对于这两个想法,我是否有任何办法可以使它们对我更好用,还是我在错误的树上狂吠,而我显然完全错过了吗?

提前致谢!

最佳答案

您正在吠叫错误的树,this应该可以工作,并使用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引用为phonon 4.4定义的VideoWidgetInterface44,如下所示(来自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的快照功能。因此,对于暂时​​的蜜蜂,我将研究其他创建快照的方法。

10-06 06:02