Qt phonon & qpixmap :: grabwidget
Domanda
Ho lavorato per un paio di giorni in grabbando fotogrammi da un oggetto multimediale Phonon. Il mio obiettivo è quello di catturare i fotogrammi ad un certo intervallo specificato dall'utente. Prima ho provato ad implementare uno slot per il segnale di spunta associato a Phonon :: MediaObject. Tuttavia, poiché il segnale di spunta viene emesso alla prima opportunità che a volte può essere una piccola varietà nella differenza di tempo ... non così tanto che non è una soluzione praticabile ma ancora ho studiato ulteriormente e provato una combinazione di ricerca e grabwidget ma appare Quella ricerca richiede un po 'di tempo per completare e non ha alcun modo per avvisare l'applicazione quando il video è di nuovo in funzione, questo causa il codice come
obj->seek(i*m_grabInterval);
QPixmap image = QPixmap::grabWidget(m_ui.videoPlayer);
.
Per salvare un'immagine nera del 90% del tempo, ma afferrare correttamente il telaio dei tempi rimanenti.
La mia domanda è che c'è qualcosa che posso fare su una di queste due idee che li farà lavorare meglio per me, o sto abbaiando pesantemente sull'albero sbagliato e c'è molto più ovvio che ho perso completamente? .
Grazie in anticipo!
Soluzione
stai abbaiando sull'albero sbagliato, dovrebbeLavoro, creare un Qimage utilizzando l'istantanea () Func dal Phonon :: Videowidget
Modifica
Ho studiato ulteriormente questa questione.La funzione Snapshot non è nemmeno implementata.Ecco l'implementazione in 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
}
Gli IFACES4 si riferisce a VideoWidgetInterface44 che è definito per Phonon 4.4 come segue (da 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
Ho anche guardato le implementazioni di Gstreamer e VLC backend.Non supportano ancora la funzionalità dell'istantanea da Phonon 4.4.Quindi per il tempo di essere esaminerò in altri modi per creare istantanee.