Qt Phonon e QPixmap::GrabWidget
Pergunta
Estou trabalhando há alguns dias na captura de quadros de um objeto de mídia fônon.Meu objetivo é capturar frames em algum intervalo especificado pelo usuário.Primeiramente tentei implementar um slot para o sinal de tick associado a Phonon::MediaObject.No entanto, como o sinal do tick é emitido na primeira oportunidade, às vezes pode haver uma pequena variação na diferença horária...não tanto que não seja uma solução viável, mas ainda assim investiguei mais e tentei uma combinação de busca e grabWidget, mas parece que a busca leva algum tempo para ser concluída e não tem como notificar o aplicativo quando o vídeo estiver funcionando bem novamente, isso causa código como
obj->seek(i*m_grabInterval);
QPixmap image = QPixmap::grabWidget(m_ui.videoPlayer);
para salvar uma imagem preta em 90% das vezes, mas capturar corretamente o quadro nas vezes restantes.
Minha pergunta é: há algo que eu possa fazer sobre qualquer uma dessas duas idéias que as fará funcionar melhor para mim, ou estou latindo pesadamente para a árvore errada e há uma coisa muito mais óbvia que perdi completamente?
Desde já, obrigado!
Solução
Você está latindo para a árvore errada, esse deve funcionar, crie um QImage usando a função snapshot() do Phonon::VideoWidget
editar
Eu investiguei esse assunto mais detalhadamente.A função de instantâneo nem sequer está implementada.Aqui está a implementação em 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
}
O IFACES4 refere-se a VideoWidgetInterface44 que é definido para o phonon 4.4 da seguinte forma (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
Também examinei implementações de back-ends gstreamer e vlc.Eles ainda não suportam a funcionalidade de snapshot do phonon 4.4.Por enquanto, procurarei outras maneiras de criar instantâneos.