Hello, I am trying to get a little more familiar with gstreamer, and thought I'd do some of the "basic" programming tutorial examples.
I did play with the 3rd example: https://gstreamer.freedesktop.org/documentation/tutorials/basic/dynamic-pipelines.html?gi-language=c
If I copy the example, and compile it, it works, no surprise
there. But when I change it and do the "exercise", I get some
weirdness.
What I noticed is (well I probably missed something)... but the function call:
_______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
so while messing with it, I forgot to change teh second part, and even though it seems incosistent, can someone explain why this works? (I am just putting the declarations here, rewritting to ugly got's into something nicr is not the problem)
in the main part the declarations I had are: // Create the elements
and I forgot to make the changes in the second part (pad_added_handler), surprised it worked, and seems counter-intuitive? GstPad *audiosink_pad =
gst_element_get_static_pad(data->audioconvert, "sink");
but .. why?? How can it even find the
right GstElement, since none of the are named "sink"?
docs: ****************************************************************** gst_element_get_static_pad ()GstPad * gst_element_get_static_pad ( Retrieves a pad from Parameters element a GstElement to find a static pad of. name the name of the static GstPad to retrieve. Returnsthe requested GstPad if
found, otherwise MT safe. ************************************************************************
thanks,
Ron
On 5/15/19 8:33 PM, R C wrote:
_______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Hi RC
"sink" is not element name. It is pad name of of videoconvert and audioconvert. -- Sent from: http://gstreamer-devel.966125.n4.nabble.com/ _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
In reply to this post by R C
On 16/5/19 1:11 pm, R C wrote:
"sink" is the name of the pad on the element you're retrieving from (audio/videoconvert in this case) not the name of the element.
The element is the 'data->audio/videoconvert' parameters you pass into 'gst_element_get_static_pad'. Cheers -Matt
_______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel signature.asc (499 bytes) Download Attachment |
In reply to this post by R C
Le mer. 15 mai 2019 22 h 40, R C <[hidden email]> a écrit :
I'm not really able to see all steps that lead you to this, but I can give you a trick to help. G_DEBUG=fatal_criticals will make it abort on the assertion, run this in gdb, and analyse the context that lead to that pad being null.
_______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
In reply to this post by R C
Le mer. 15 mai 2019 23 h 25, R C <[hidden email]> a écrit :
The names in the first part are the element names, while in this callback, you are handling pad names. Pad names are chosen by the elements and follow the pattern in the pad template (see gst-inspect-1.0 element to see the template).
_______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
So basically one would never have two elements that are the same, and only differ in the name you made/created them with? On Thu, May 16, 2019 at 7:19 AM Nicolas Dufresne <[hidden email]> wrote:
_______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Le jeu. 16 mai 2019 09 h 25, R C <[hidden email]> a écrit :
Element names must unique per GstBin only. You'd get an error from gst_bin_add() if you had a duplicate. Always check your return values, there is no exception in C to save the day.
_______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
In reply to this post by Nicolas Dufresne-5
Ok, cool I try that. btw: is there a tool that can be used to display what's going on in a pipe created with gst-launch? (what I mean is, that shows the pipeline and branches). Is there 'something' that would optimize a pipeline? thanks, Ron On Thu, May 16, 2019 at 7:15 AM Nicolas Dufresne <[hidden email]> wrote:
_______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
In reply to this post by Nicolas Dufresne-5
Hello all,
I am using the examples from the Gstreamer basic tutorial to see if I can build a c program that streams some IP cameras. The reason why I want to use C code is that is seems the ryn 'faster', less lag/latency. I have a working example that streams the camera to a "gstreamer window" and the timestamps on the stream are only 3-4 secs behind, while running the same stream with the gst launch cmd line (into browser) is about 20 - 30 secs behind. (although I am streaming into a web page with gst-launch This is the gst-launch pipeline I am using: gst-launch-1.0 uridecodebin uri=rtsp://192.168.x.y:554/user=admin_password=XXXXXXXX_channel=1_stream=0.sdp?real_stream name=d ! queue ! theoraenc ! oggmux name=m ! tcpserversink host=192.168.q.r port=8080 d. ! queue ! audioconvert ! audioresample ! flacenc ! m. Being a rookie, using gstreamer, I assume that he names, d and m, are used to ID the video and audio stream? I "adapted" a gstreamer example a little and so far I can stream the video and audio to a gstreamer window., like (some excerpts) : // Create the elements data.source = gst_element_factory_make("uridecodebin", "source"); data.audioconvert = gst_element_factory_make("audioconvert", "audioconvert"); data.audiosink = gst_element_factory_make("autoaudiosink", "audiosink"); data.videoconvert = gst_element_factory_make("videoconvert", "videoconvert"); data.videosink = gst_element_factory_make("autovideosink", "videosink"); I connect the audioconvert to the audio sink, same for video. and when the stream starts, I connect the source (uridecodebin) to the rest of the pipeline: GstPad *audiosink_pad = gst_element_get_static_pad(data->audioconvert, "sink"); GstPad *videosink_pad = gst_element_get_static_pad(data->videoconvert, "sink"); gst_pad_link (new_pad, audiosink_pad); gst_pad_link (new_pad, videosink_pad); where "new_pad" are the pads that are created, by source/uridecodebin when the stream starts. So I assume, in the C code I don't really have to use the names, since I can directly connect those elements, while in gst-launch one needs to ID what elements go where? right? The gst-launch command I used seems to work, I don't know if it is the most efficient way to do that though, but wondering how the elements should be linked in C code would it be something like?: video: uridecodebin -> queue -> theoraenc -> oggmux -> tcpserversink audio: uridecodebin -> queue -> audioconvert -> audioresample -> flacenc -> tcpserversink In the reference manual I see that the tcpserversink element has 1 sink, so I need the element for both the audio stream and video stream? (or do the two streams need to be combined before I connect them to the tcpserversink element?) thanks, Ron _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Hi
There is no reason why a C app would have less lag/latency than a gst-launch-1.0 pipeline (assuming the pipes are exactly the same). After all, gst-launch-1.0 is a C application as well. Network streaming will typically have more latency than local display, and that’s the reason gst-launch-1.0 seems more laggy. Here’s a tip that may simplify your application development. Take a look at gst_parse_launch, you can pass in the same line as in gst-launch-1.0 and it will handle all the complexities automatically. In fact, that’s what gst-launch-1.0 uses underneath. Roughly, it would look something like: const gchar * description = "uridecodebin uri=<a href="rtsp://192.168.x.y:554/user=admin_password=XXXXXXXX_channel=1_stream=0.sdp?real_stream" class="">rtsp://192.168.x.y:554/user=admin_password=XXXXXXXX_channel=1_stream=0.sdp?real_stream name=d ! queue ! theoraenc ! oggmux name=m ! tcpserversink host=192.168.q.r port=8080 d. ! queue ! audioconvert ! audioresample ! flacenc ! m." GError *error = NULL; GstElement * pipeline = gst_parse_launch (description, &error); If (!pipeline) { g_printerr (“Unable to create pipeline: %s\n”, error->message); g_error_free (error); } Hope it helps! Michael
_______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
In reply to this post by R C
Yes. GStreamer can render a diagram of your pipeline. Take a look at:
https://developer.ridgerun.com/wiki/index.php?title=How_to_generate_a_Gstreamer_pipeline_diagram_(graph) Michael
_______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
In reply to this post by Michael Gruner
I have been playing with that, and that works. (btw: I want to write some c code, because at some point I want it to run as a deamon, and do some trickery with it, like switching cameras etc)
I see some "weird" msgs, don't know what they really mean, but the stream video/audio, seems to work.
this is what I see (I called the little program basic-ipcam, 'a la' the basic gstreamer API example. : # ./basic-ipcamDtsGetHWFeatures: Create File Failed DtsGetHWFeatures: Create File Failed Running DIL (3.22.0) Version DtsDeviceOpen: Opening HW in mode 0 DtsDeviceOpen: Create File Failed On 5/17/19 11:46 AM, Michael Gruner
wrote:
Hi _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Free forum by Nabble | Edit this page |