Qt Phonon & QPixmap :: GrabWidget - PullRequest
       48

Qt Phonon & QPixmap :: GrabWidget

3 голосов
/ 23 января 2012

Я пару дней работал над захватом кадров из фононного медиа-объекта.Моя цель - захватывать кадры с некоторым интервалом, указанным пользователем.Сначала я попытался реализовать слот для тикового сигнала, связанного с Phonon :: MediaObject.Однако, поскольку тиковый сигнал испускается при первой возможности, иногда разница во времени может быть немного разнообразной ... не настолько, чтобы это было нереализуемым решением, но все же я исследовал дальше и попробовал комбинацию search и grabWidget, но, похоже,этот поиск занимает некоторое время и не имеет возможности уведомить приложение, когда видео снова работает нормально, это приводит к тому, что код, такой как

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

, сохраняет черное изображение в 90% случаев,но правильно возьмите кадр оставшиеся времена.

Мой вопрос: есть ли что-нибудь, что я могу сделать с любой из этих двух идей, которая заставит их работать лучше для меня, или я сильно лаю не на то дерево, и есть гораздо более очевидное, что я полностью пропустил?

Заранее спасибо!

1 Ответ

2 голосов
/ 23 января 2012

Вы лаете не на то дерево, это должно работать, создайте QImage с помощью функции snapshot () из Phonon :: VideoWidget

редактировать

Я исследовал этот вопрос дальше. Функция снимка даже не реализована. Вот реализация в 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 ссылается на VideoWidgetInterface44, который определен для фонона 4.4 следующим образом (из 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. Они пока не поддерживают функцию снимка с фонона 4.4. Поэтому пока я буду искать другие способы создания снимков.

...