RTP h264 stream
Big Gaz
earthwormgaz at gmail.com
Tue Mar 18 15:39:35 PDT 2014
If it's ever any use to anyone, this was the answer ...
// request pad for video, and link that
GstPad * vsrcpad = gst_element_get_static_pad(p_h264parse, "src");
GstPad * vsinkpad = gst_element_get_request_pad(p_matroskamux,
"video_0");
if(gst_pad_link (vsrcpad, vsinkpad) == false)
{
std::cout << "Failed to link elements 5" << std:: endl;
}
On Sun, 2014-03-16 at 17:29 +0000, Big Gaz wrote:
> Hi,
>
> I'm trying to save some video to disk. I can do it with the command
> line, but my C code isn't working.
>
> gst-launch-1.0 -e rtspsrc
> location="rtsp://admin:12345@192.168.1.201:554//Streaming/Channels/1" !
> rtph264depay ! h264parse ! matroskamux ! filesink location=foo1.mkv
>
> That works fine. Can anyone help with the C code?
>
> #include <iostream>
>
> #include <gst/gst.h>
>
> static void cb_new_rtspsrc_pad
> (
> GstElement * element,
> GstPad * pad,
> gpointer data
> )
> {
> gchar *name;
>
> name = gst_pad_get_name(pad);
> g_print("A new pad %s was created\n", name);
>
> // here, you would setup a new pad link for the newly created pad
> // sooo, now find that rtph264depay is needed and link them?
> GstCaps * p_caps = gst_pad_get_pad_template_caps (pad);
>
> gchar * description = gst_caps_to_string(p_caps);
> std::cout << p_caps << ", " << description << std::endl;
> g_free(description);
>
> GstElement * p_rtph264depay = GST_ELEMENT(data);
>
> // try to link the pads then ...
> if(gst_element_link_pads(element, name, p_rtph264depay, "sink") ==
> false)
> {
> std::cout << "Failed to link elements 3" << std::endl;
> }
>
> g_free(name);
> }
>
> static void cb_new_matroskamux_pad
> (
> GstElement * element,
> GstPad * pad,
> gpointer data
> )
> {
> gchar *name;
>
> name = gst_pad_get_name(pad);
> g_print("A new pad %s was created\n", name);
>
> GstCaps * p_caps = gst_pad_get_pad_template_caps (pad);
>
> gchar * description = gst_caps_to_string(p_caps);
> std::cout << p_caps << ", " << description << std::endl;
> g_free(description);
>
> GstElement * p_h264parse = GST_ELEMENT(data);
>
> // try to link the pads then ...
> if(gst_element_link_pads(p_h264parse, "src", element, name) == false)
> {
> std::cout << "Failed to link elements 4" << std::endl;
> }
>
> g_free(name);
> }
>
> int
> main (int argc,
> char *argv[])
> {
> // init GStreamer
> gst_init (&argc, &argv);
>
> gst_debug_set_active(true);
> gst_debug_set_threshold_for_name ("*", GST_LEVEL_INFO );
>
> /*
> * gst-launch-1.0 -e rtspsrc location=rtsp://... ! rtph264depay !
> h264parse ! matroskamux ! filesink location=foo.mkv might be a good
> start
> * gst-launch-1.0 -e rtspsrc
> location="rtsp://admin:12345@192.168.1.201:554//Streaming/Channels/1" !
> rtph264depay ! h264parse ! matroskamux ! filesink location=foo1.mkv
> <__tim> then you translate that into C code :)
> <earthw0rm> Hmm, I see
> <earthw0rm> So each part of that pipeline has a C equivalent?
> <__tim> either use gst_parse_launch() or create the elements one by one
> (if the latter: note that rtspsrc has sometimes pads, see "pad-added"
> signal,
> and matroskamux has request pads; parse_launch() handles these things
> for you)
> */
>
> GstElement *pipeline = gst_pipeline_new("my_pipeline");
>
> // create source
> GstElement * rtspsrc = gst_element_factory_make("rtspsrc", "rtspsrc");
> g_object_set(G_OBJECT(rtspsrc), "location",
> "rtsp://192.168.1.201:554//Streaming/Channels/1", NULL);
> g_object_set(G_OBJECT(rtspsrc), "user-id", "admin", NULL);
> g_object_set(G_OBJECT(rtspsrc), "user-pw", "12345", NULL);
>
> // create other pipeline elements
> GstElement * p_rtph264depay = gst_element_factory_make("rtph264depay",
> "rtph264depay");
> GstElement * p_h264parse = gst_element_factory_make("h264parse",
> "h264parse");
> GstElement * p_matroskamux = gst_element_factory_make("matroskamux",
> "matroskamux");
> GstElement * p_filesink = gst_element_factory_make("filesink",
> "filesink");
>
> g_object_set(G_OBJECT(p_filesink), "location", "foo.mkv", NULL);
>
> // listen for newly created pads
> g_signal_connect(rtspsrc, "pad-added", G_CALLBACK(cb_new_rtspsrc_pad),
> p_rtph264depay);
> g_signal_connect(p_matroskamux, "pad-added",
> G_CALLBACK(cb_new_matroskamux_pad), p_h264parse);
>
> // put together a pipeline
> gst_bin_add_many(GST_BIN(pipeline), rtspsrc, p_rtph264depay,
> p_h264parse, p_matroskamux, p_filesink, NULL);
>
> // link elements
> if(gst_element_link_pads(p_rtph264depay, "src", p_h264parse, "sink") ==
> false)
> {
> std::cout << "Failed to link elements 1" << std::endl;
> }
>
> if(gst_element_link_pads(p_matroskamux, "src", p_filesink, "sink") ==
> false)
> {
> std::cout << "Failed to link elements 2" << std::endl;
> }
>
> // start the pipeline
> gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PLAYING);
> GMainLoop * loop = g_main_loop_new(NULL, FALSE);
> g_main_loop_run(loop);
>
> // TODO: clean up
> //gst_object_unref(GST_OBJECT(element));
>
> return 1;
> }// end main
>
> It fails with these messages ...
>
> 0:00:00.157460582 29771 0x7f3b50005400 INFO GST_STATES
> gstelement.c:2303:gst_element_continue_state:<rtpjitterbuffer0>
> committing state from READY to PAUSED, pending PLAYING, next PLAYING
> 0:00:00.157486081 29771 0x7f3b50005400 INFO GST_STATES
> gstelement.c:2233:_priv_gst_element_state_changed:<rtpjitterbuffer0>
> notifying about state-changed READY to PAUSED (PLAYING pending)
> 0:00:00.157516723 29771 0x7f3b50005400 INFO GST_STATES
> gstelement.c:2310:gst_element_continue_state:<rtpjitterbuffer0> continue
> state change PAUSED to PLAYING, final PLAYING
> 0:00:00.157544516 29771 0x7f3b50005400 INFO GST_STATES
> gstelement.c:2328:gst_element_continue_state:<rtpjitterbuffer0>
> completed state change to PLAYING
> 0:00:00.157567741 29771 0x7f3b50005400 INFO GST_STATES
> gstelement.c:2233:_priv_gst_element_state_changed:<rtpjitterbuffer0>
> notifying about state-changed PAUSED to PLAYING (VOID_PENDING pending)
> 0:00:00.157600347 29771 0x7f3b50005400 INFO GST_ELEMENT_PADS
> gstelement.c:897:gst_element_get_static_pad: found pad
> rtpssrcdemux0:src_1034261883
> 0:00:00.157622066 29771 0x7f3b50005400 INFO GST_ELEMENT_PADS
> gstelement.c:897:gst_element_get_static_pad: found pad
> rtpjitterbuffer0:sink
> 0:00:00.157650077 29771 0x7f3b50005400 INFO GST_PADS
> gstpad.c:2120:gst_pad_link_prepare: trying to link
> rtpssrcdemux0:src_1034261883 and rtpjitterbuffer0:sink
> 0:00:00.157674805 29771 0x7f3b50005400 INFO GST_PADS
> gstpad.c:2322:gst_pad_link_full: linked rtpssrcdemux0:src_1034261883 and
> rtpjitterbuffer0:sink, successful
> 0:00:00.157704075 29771 0x7f3b50005400 INFO GST_EVENT
> gstevent.c:1313:gst_event_new_reconfigure: creating reconfigure event
> 0:00:00.157755339 29771 0x7f3b50005400 INFO GST_ELEMENT_PADS
> gstelement.c:897:gst_element_get_static_pad: found pad
> rtpssrcdemux0:rtcp_src_1034261883
> 0:00:00.157779606 29771 0x7f3b50005400 INFO GST_ELEMENT_PADS
> gstelement.c:894:gst_element_get_static_pad: no such pad 'sink_rtcp' in
> element "rtpjitterbuffer0"
> 0:00:00.157849460 29771 0x7f3b50005400 INFO GST_ELEMENT_PADS
> gstelement.c:646:gst_element_add_pad:<rtpjitterbuffer0> adding pad
> 'sink_rtcp'
> 0:00:00.157883645 29771 0x7f3b50005400 INFO GST_PADS
> gstpad.c:2120:gst_pad_link_prepare: trying to link
> rtpssrcdemux0:rtcp_src_1034261883 and rtpjitterbuffer0:sink_rtcp
> 0:00:00.157908892 29771 0x7f3b50005400 INFO GST_PADS
> gstpad.c:2322:gst_pad_link_full: linked
> rtpssrcdemux0:rtcp_src_1034261883 and rtpjitterbuffer0:sink_rtcp,
> successful
> 0:00:00.157930670 29771 0x7f3b50005400 INFO GST_EVENT
> gstevent.c:1313:gst_event_new_reconfigure: creating reconfigure event
> 0:00:00.158025936 29771 0x7f3b50005400 WARN rtpjitterbuffer
> rtpjitterbuffer.c:183:rtp_jitter_buffer_set_clock_rate: Clock rate
> changed from 0 to 90000
> 0:00:00.158167617 29771 0x7f3b40001770 INFO GST_EVENT
> gstevent.c:628:gst_event_new_caps: creating caps event
> application/x-rtp, media=(string)video, payload=(int)96,
> clock-rate=(int)90000, encoding-name=(string)H264,
> profile-level-id=(string)420029, packetization-mode=(string)1,
> sprop-parameter-sets=(string)"Z00AKZpmA8ARPyzUBAQFAAADA+gAAMNQBA\=\=
> \,aO48gA\=\=", a-Media_header=(string)"MEDIAINFO
> \=494D4B48010100000400010000000000000000000000000000000000000000000000000000000000\;", a-appversion=(string)1.0, clock-base=(uint)786867504, seqnum-base=(uint)12983, npt-start=(guint64)0, play-speed=(double)1, play-scale=(double)1
> 0:00:00.158283874 29771 0x7f3b40001770 INFO GST_ELEMENT_PADS
> gstelement.c:646:gst_element_add_pad:<rtpptdemux0> adding pad 'src_96'
> 0:00:00.158377158 29771 0x7f3b40001770 INFO GST_PADS
> gstpad.c:2120:gst_pad_link_prepare: trying to link rtpptdemux0:src_96
> and recv_rtp_src_0_1034261883_96:proxypad3
> 0:00:00.158407781 29771 0x7f3b40001770 INFO GST_PADS
> gstpad.c:2322:gst_pad_link_full: linked rtpptdemux0:src_96 and
> recv_rtp_src_0_1034261883_96:proxypad3, successful
> 0:00:00.158430910 29771 0x7f3b40001770 INFO GST_EVENT
> gstevent.c:1313:gst_event_new_reconfigure: creating reconfigure event
> 0:00:00.158507325 29771 0x7f3b40001770 INFO GST_ELEMENT_PADS
> gstelement.c:646:gst_element_add_pad:<manager> adding pad
> 'recv_rtp_src_0_1034261883_96'
> 0:00:00.158622779 29771 0x7f3b40001770 INFO GST_PADS
> gstpad.c:2120:gst_pad_link_prepare: trying to link
> manager:recv_rtp_src_0_1034261883_96 and
> recv_rtp_src_0_1034261883_96:proxypad4
> 0:00:00.158657346 29771 0x7f3b40001770 INFO GST_PADS
> gstpad.c:2322:gst_pad_link_full: linked
> manager:recv_rtp_src_0_1034261883_96 and
> recv_rtp_src_0_1034261883_96:proxypad4, successful
> 0:00:00.158680054 29771 0x7f3b40001770 INFO GST_EVENT
> gstevent.c:1313:gst_event_new_reconfigure: creating reconfigure event
> 0:00:00.158768431 29771 0x7f3b40001770 INFO GST_ELEMENT_PADS
> gstelement.c:646:gst_element_add_pad:<rtspsrc> adding pad
> 'recv_rtp_src_0_1034261883_96'
> A new pad recv_rtp_src_0_1034261883_96 was created
> 0x23eae30, application/x-rtp; application/x-rdt
> 0:00:00.158909614 29771 0x7f3b40001770 INFO GST_ELEMENT_PADS
> gstutils.c:1543:gst_element_link_pads_full: trying to link element
> rtspsrc:recv_rtp_src_0_1034261883_96 to element rtph264depay:sink
> 0:00:00.158937915 29771 0x7f3b40001770 INFO GST_ELEMENT_PADS
> gstelement.c:897:gst_element_get_static_pad: found pad
> rtspsrc:recv_rtp_src_0_1034261883_96
> 0:00:00.158960733 29771 0x7f3b40001770 INFO GST_ELEMENT_PADS
> gstelement.c:897:gst_element_get_static_pad: found pad rtph264depay:sink
> 0:00:00.158982041 29771 0x7f3b40001770 INFO GST_PADS
> gstutils.c:1443:prepare_link_maybe_ghosting: rtspsrc and rtph264depay in
> same bin, no need for ghost pads
> 0:00:00.159015973 29771 0x7f3b40001770 INFO GST_PADS
> gstpad.c:2120:gst_pad_link_prepare: trying to link
> rtspsrc:recv_rtp_src_0_1034261883_96 and rtph264depay:sink
> 0:00:00.159091339 29771 0x7f3b40001770 INFO GST_PADS
> gstpad.c:2322:gst_pad_link_full: linked
> rtspsrc:recv_rtp_src_0_1034261883_96 and rtph264depay:sink, successful
> 0:00:00.159117046 29771 0x7f3b40001770 INFO GST_EVENT
> gstevent.c:1313:gst_event_new_reconfigure: creating reconfigure event
> 0:00:00.159379528 29771 0x7f3b40001770 INFO GST_PADS
> gstpad.c:3675:gst_pad_peer_query:<h264parse:src> pad has no peer
> 0:00:00.159502645 29771 0x7f3b40001770 INFO GST_EVENT
> gstevent.c:628:gst_event_new_caps: creating caps event video/x-h264,
> stream-format=(string)avc, alignment=(string)au,
> codec_data=(buffer)014d0029ffe10019674d00299a6603c0113f2cd404040500000303e80000c3500401000468ee3c80
> 0:00:00.159570362 29771 0x7f3b40001770 INFO GST_PADS
> gstpad.c:3675:gst_pad_peer_query:<h264parse:src> pad has no peer
> 0:00:00.171480674 29771 0x7f3b40001770 INFO GST_EVENT
> gstevent.c:709:gst_event_new_segment: creating segment event time
> segment start=0:00:00.000000000, stop=99:99:99.999999999, rate=1.000000,
> applied_rate=1.000000, flags=0x00, time=0:00:00.000000000,
> base=0:00:00.000000000, position 0:00:00.000000000, duration
> 99:99:99.999999999
> 0:00:00.171612970 29771 0x7f3b40001770 INFO h264parse
> gsth264parse.c:1258:gst_h264_parse_update_src_caps:<h264parse>
> resolution changed 1920x1080
> 0:00:00.171662988 29771 0x7f3b40001770 INFO GST_EVENT
> gstevent.c:628:gst_event_new_caps: creating caps event video/x-h264,
> stream-format=(string)byte-stream, alignment=(string)au,
> width=(int)1920, height=(int)1080, parsed=(boolean)true
> 0:00:00.171925728 29771 0x7f3b40001770 INFO task
> gsttask.c:300:gst_task_func:<rtpjitterbuffer0:src> Task going to paused
> 0:00:00.207741859 29771 0x7f3b50005400 INFO basesrc
> gstbasesrc.c:2785:gst_base_src_loop:<udpsrc0> pausing after
> gst_pad_push() = not-linked
> 0:00:00.207820982 29771 0x7f3b50005400 WARN basesrc
> gstbasesrc.c:2865:gst_base_src_loop:<udpsrc0> error: Internal data flow
> error.
> 0:00:00.207840802 29771 0x7f3b50005400 WARN basesrc
> gstbasesrc.c:2865:gst_base_src_loop:<udpsrc0> error: streaming task
> paused, reason not-linked (-1)
> 0:00:00.207876964 29771 0x7f3b50005400 INFO GST_ERROR_SYSTEM
> gstelement.c:1835:gst_element_message_full:<udpsrc0> posting message:
> Internal data flow error.
> 0:00:00.207925487 29771 0x7f3b50005400 INFO GST_ERROR_SYSTEM
> gstelement.c:1858:gst_element_message_full:<udpsrc0> posted error
> message: Internal data flow error.
> 0:00:00.207984106 29771 0x7f3b50005400 INFO task
> gsttask.c:300:gst_task_func:<udpsrc0:src> Task going to paused
> 0:00:03.157010361 29771 0x7f3b50024190 INFO GST_EVENT
> gstevent.c:628:gst_event_new_caps: creating caps event
> application/x-rtcp
> 0:00:03.157168413 29771 0x7f3b50024190 INFO GST_EVENT
> gstevent.c:709:gst_event_new_segment: creating segment event time
> segment start=0:00:00.000000000, stop=99:99:99.999999999, rate=1.000000,
> applied_rate=1.000000, flags=0x00, time=0:00:00.000000000,
> base=0:00:00.000000000, position 0:00:00.000000000, duration
> 99:99:99.999999999
> 0:00:03.489885234 29771 0x7f3b50005450 INFO GST_EVENT
> gstevent.c:709:gst_event_new_segment: creating segment event time
> segment start=0:00:00.000000000, stop=99:99:99.999999999, rate=1.000000,
> applied_rate=1.000000, flags=0x00, time=0:00:00.000000000,
> base=0:00:00.000000000, position 0:00:00.000000000, duration
> 99:99:99.999999999
> 0:00:03.490247549 29771 0x7f3b50005450 INFO basesrc
> gstbasesrc.c:2772:gst_base_src_loop:<udpsrc1> marking pending DISCONT
> 0:00:03.490424944 29771 0x7f3b50005450 INFO GST_EVENT
> gstevent.c:628:gst_event_new_caps: creating caps event
> application/x-rtcp, ssrc=(uint)1034261883
> 0:00:03.490728048 29771 0x7f3b50005450 INFO GST_EVENT
> gstevent.c:628:gst_event_new_caps: creating caps event
> application/x-rtcp
> 0:00:03.490875829 29771 0x7f3b50005450 INFO GST_EVENT
> gstevent.c:628:gst_event_new_caps: creating caps event
> application/x-rtcp, ssrc=(uint)1034261883
>
More information about the gstreamer-devel
mailing list