playbin2 connected to
Stefan Sauer
ensonic at hora-obscura.de
Thu Oct 13 14:33:28 PDT 2011
On 10/11/2011 05:01 PM, Steve wrote:
> Hi Guys,
>
> I am trying to modify wxMediaCtrl so that I can save a file.
>
> wxMediaCtrl uses playbin (which I am updating to playbin2). I have
> experimented with GST_PLAY_FLAG_DOWNLOAD, but the quality is not really good
> enough.
>
> So I am trying to create a new top-level bin containing the following
>
> tee name=t ! t. ! queue ! ffmpegcolorspace ! ximagesink ! t. ! queue
> videorate ! video/x-raw-yuv,framerate=10/1 ! y4menc ! filesink
> location=vid_tmp_mkv
tee name=t t. ! queue ! ffmpegcolorspace ! ximagesink t. ! queue
videorate ! video/x-raw-yuv,framerate=10/1 ! y4menc ! filesink
location=vid_tmp_mkv
two ! too much, but in the code it looks alright. You could use GST_DEBUG_BIN_TO_DOT_FILE to get a graph of the resulting pipleine
Stefan
> I then attach playbin2 to bin via its video-sink property with ghostpads.
>
> My issue is that I get nothing. No errors just a blank screen.
>
> The code follows.
>
> Many thanks in advance for your help.
>
> Regards
>
> Steve
>
> //--------------------------------------------------------------------------
> ---
> // wxGStreamerMediaBackend::DeviceCapture
> //
> // Used to Capture and store input from a local device (eg /dev/video0) in a
> specified file.
> //--------------------------------------------------------------------------
> ---
> //bool wxGStreamerMediaBackend::DeviceCapture(const gchar* fileSaveName, //
> If NULL just plays device, doesn't save.
> // const wxString& inputDevice, // Defaults to /dev/video0
> // const wxString& gst_encoder, // Defaults to y4menc
> // long encode_quality, // Defaults to encoder default
> // long framesSecond) // Defaults to 10/1
> bool wxGStreamerMediaBackend::DeviceCapture()
> {
> // Pause video and delete Bin.
>
> g_printerr ("DeviceCapture starts.\n");
> // Set playbin to ready to stop the current media...
> if( gst_element_set_state (m_playbin,
> GST_STATE_READY) == GST_STATE_FAILURE ||
> !SyncStateChange(m_playbin, GST_STATE_READY))
> {
> wxLogSysError(wxT("wxGStreamerMediaBackend::Load - ")
> wxT("Could not set initial state to ready"));
> return false;
> }
> // free current media resources
> gst_element_set_state (m_playbin, GST_STATE_NULL);
> //
> // Create DeviceCapture object
> //
> GstElement *bin, *videotee, *monitorqueue, *filequeue, *colorspace,
> *encoder, *filesink;
> GstPad *pad, *ghostpad;
> // Create elements
> bin = gst_bin_new ("sink_bin");
>
> videotee = gst_element_factory_make ("tee", "videotee");
> monitorqueue = gst_element_factory_make ("queue", "monitorqueue");
> filequeue = gst_element_factory_make ("queue", "filequeue");
> colorspace = gst_element_factory_make ("ffmpegcolorspace",
> "colorspace");
>
> // Setup video sink - first try gconf, then auto, then xvimage and
> // then finally plain ximage
> GstElement* videosink = gst_gconf_get_default_video_sink();
> if( !TryVideoSink(videosink) )
> {
> videosink = gst_element_factory_make ("autovideosink", "video-sink");
> if( !TryVideoSink(videosink) )
> {
> videosink = gst_element_factory_make ("xvimagesink", "video-sink");
> if( !TryVideoSink(videosink) )
> {
> // finally, do a final fallback to ximagesink
> videosink =
> gst_element_factory_make ("ximagesink", "video-sink");
> if( !TryVideoSink(videosink) )
> {
> g_object_unref(videosink);
> wxLogSysError(wxT("Could not find a suitable video sink"));
> return false;
> }
> }
> }
> }
>
> encoder = gst_element_factory_make ("y4menc", "videoenc");
> filesink = gst_element_factory_make ("filesink", "filesink");
>
>
> // Error reporting
> if (!bin|| !colorspace || !encoder
> || !videotee ) {
> g_printerr ("One element could not be created.\n");
> return NULL;
> }
>
> // Set paramaters for the GstElements
> g_object_set (G_OBJECT (filesink), "location", "tmp_vid.mkv", NULL);
>
> // add elements to pipeline
> gst_bin_add_many (GST_BIN (bin),
> colorspace, encoder, videotee, monitorqueue, videosink, filequeue,
> filesink, NULL);
> pad = gst_element_get_static_pad (videotee, "sink");
> ghostpad = gst_ghost_pad_new ("sink_pad", pad);
> gst_element_add_pad(bin, ghostpad);
> // link elements.
> gst_element_link_many( videotee, monitorqueue, colorspace, videosink,
> NULL );
> gst_element_link_many( videotee, filequeue, NULL );
>
> // Create caps stuff
> GstCaps *caps;
> caps = gst_caps_new_simple ("video/x-raw-yuv",
> // "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'),
> // "width", G_TYPE_INT, 384,
> // "height", G_TYPE_INT, 288,
> "framerate", GST_TYPE_FRACTION, 10, 1,
> NULL);
> gboolean link_ok;
> link_ok = gst_element_link_filtered (filequeue, encoder, caps);
> if (!link_ok) {
> g_warning ("Failed to link filequeue and encoder.");
> }
> gst_caps_unref (caps);
>
> if (!GST_IS_ELEMENT(bin))
> {
> if(G_IS_OBJECT(bin))
> g_object_unref(bin);
> wxLogSysError(wxT("Got an invalid bin"));
> return false;
> }
> gst_element_link_many( encoder, filesink, NULL );
>
> // // Now that we know (or, rather think) our video and audio sink
> // // are valid set our playbin to use them
> g_object_set (G_OBJECT (m_playbin),
> "video-sink", bin,
> NULL);
>
> // Try to pause media as gstreamer won't let us query attributes
> // such as video size unless it is paused or playing
> if( gst_element_set_state (m_playbin,
> GST_STATE_PAUSED) == GST_STATE_FAILURE ||
> !SyncStateChange(m_playbin, GST_STATE_PAUSED))
> {
> return false; // no real error message needed here as this is
> // generic failure 99% of the time (i.e. no
> // source etc.) and has an error message
> }
> g_printerr ("DeviceCapture activated.\n");
>
> return true;
> }
>
>
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
More information about the gstreamer-devel
mailing list