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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top