play video in Qt using GStreamer xvimagesink

#include "gstengine.h"
#include <QDebug>
#include <gst/interfaces/xoverlay.h>
#include <QWidget>
 
GstEngine::GstEngine(QObject *parent) :
    QObject(parent)
{
    gst_init(NULL, NULL);
 
    mPlayer = gst_element_factory_make("playbin2", "play");
    GstElement *videosink = gst_element_factory_make("xvimagesink", "videosink");
    g_object_set(G_OBJECT(mPlayer), "video-sink", videosink, NULL);
 
    //gst_bus_set_sync_handler(gst_pipeline_get_bus(GST_PIPELINE(m_players[id].player)), bus_cb, &m_players[id]);
    //gst_bus_add_watch (gst_pipeline_get_bus (GST_PIPELINE(m_players[id].player)), message_cb, NULL);
}
 
GstEngine::~GstEngine()
{
    gst_object_unref(GST_OBJECT (mPlayer));
}
 
void GstEngine::setUrl(const QUrl &url)
{
    g_object_set(G_OBJECT (mPlayer), "uri", qPrintable(url.toString()), NULL);
    gst_element_set_state (mPlayer, GST_STATE_PAUSED);
}
 
void GstEngine::play()
{
   gst_element_set_state(mPlayer, GST_STATE_PLAYING);
}
 
void GstEngine::stop()
{
    gst_element_set_state(mPlayer, GST_STATE_NULL);
}
 
void GstEngine::pause()
{
    gst_element_set_state (mPlayer, GST_STATE_PAUSED);
}
 
bool GstEngine::isPlaying() const
{
    GstState state;
    gst_element_get_state (mPlayer, &state, NULL, -1 );
    return state == GST_STATE_PLAYING;
}
 
bool GstEngine::isPaused() const
{
    GstState state;
    gst_element_get_state (mPlayer, &state, NULL, -1 );
    return state == GST_STATE_PAUSED;
}
 
 
bool GstEngine::seek(uint ms)
{
    gst_element_get_state(mPlayer, NULL, NULL, 100*GST_MSECOND);
    if (!gst_element_seek (mPlayer, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, ms*GST_MSECOND, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE))
    {
      qWarning("Can't seek");
      return false;
    }
    return true;
}
 
uint GstEngine::position() const {
 
    GstFormat fmt = GST_FORMAT_TIME;
    gint64 value = 0;
    gst_element_query_position( mPlayer, &fmt, &value );
    return static_cast<uint>( ( value / GST_MSECOND ) );
}
uint GstEngine::duration() const {
    GstFormat fmt = GST_FORMAT_TIME;
    gint64 value = 0;
    gst_element_query_duration( mPlayer, &fmt, &value );
    return static_cast<uint>( ( value / GST_MSECOND ) );
}
void GstEngine::setVolume(int percent)
{
    g_object_set(G_OBJECT(mPlayer), "volume", percent*0.01, NULL );
}
 
int GstEngine::volume()
{
    double volume;
    g_object_get(G_OBJECT(mPlayer), "volume", &volume, NULL );
    return volume * 100;
}
bool GstEngine::setVideoWidget(QWidget *w)
{
    GstElement *videosink = 0;
    g_object_get(mPlayer, "video-sink", &videosink, NULL);
    if (videosink && GST_IS_X_OVERLAY(videosink) )
    {
        gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(videosink), w->winId() );
        return true;
    }
    return false;
}

你可能感兴趣的:(qt,qt,qt,gstreamer)