Question

Je travaille depuis quelques jours pour saisir des cadres d'un objet de média phonon. Mon objectif est de capturer des cadres à un intervalle spécifié par l'utilisateur. J'ai d'abord essayé d'implémenter un emplacement pour le signal de tick associé à Phonon :: MediaObject. Cependant, parce que le signal de tick est émis à la première occasion, il peut parfois y avoir un peu de variété dans la différence de temps ... pas tellement que ce n'est pas une solution réalisable, mais j'ai quand même enquêté et j'ai essayé une combinaison de Seek et GrabWidget mais il semble que Seek prend du temps à terminer et n'a aucun moyen d'informer l'application lorsque la vidéo fonctionne à nouveau, cela provoque un code comme

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

Pour économiser une image noire 90% du temps, mais saisissez correctement le cadre les temps restants.

Ma question est qu'il y a quelque chose que je peux faire à propos de l'une de ces deux idées qui les fera mieux fonctionner pour moi, ou est-ce que j'aboie fortement dans le mauvais arbre et il y a beaucoup plus évident que j'ai manqué complètement?

Merci d'avance!

Était-ce utile?

La solution

Vous aboyez sur le mauvais arbre, cette Devrait fonctionner, créez un qimage en utilisant la func instantanée () à partir du phonon :: videowidget

Éditer

J'ai enquêté plus loin. La fonction instantanée n'est même pas implémentée. Voici l'implémentation dans 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
}

L'IFaces4 fait référence à VideowidgeTinterface44 qui est défini pour Phonon 4.4 comme suit (de 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

J'ai également examiné les implémentations de Gtrestamer et VLC Backends. Ils ne prennent pas encore en charge la fonctionnalité instantanée de Phonon 4.4. Donc, pour le moment, je vais examiner d'autres façons de créer des instantanés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top