<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-CA link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal><span lang=EN-US>Hello everyone,<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>I am trying to implement reading a file (3gp container with h264 video and AMR-WB audio streams) and stream it to the client over RTP using GStreamer and save it at the destination.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>With gst-launch on both server and client sides I have done that successfully. <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>However the same pipeline coded in python does not work. The server side receives EOS and closes the pipeline successfully (tested it against gst-launch on the client). But the python client code never receives the EOS signal, and after server side streaming done, stopping the pipeline creates a file slightly less than the one streamed on the server in terms of the size. The file generated fails to play either with gst-launch or other standard video players. I can display the video stream and play the audio stream successfully when I change the pipeline on the client side coded in python. The only problem is saving the streams to a file in client coded in python.<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>My python server and client side codes are below. I have tested it on virtual machines as well as dedicated separate workstations, still not working. Performance seems to be not the issue. Any suggestion please?<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>Best Regards<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>Edip<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>#!/usr/bin/env python<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>########### RTP SERVER <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>import gi<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>from gi.repository import GObject as gobject<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>from gi.repository import Gst as gst<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>gi.require_version('Gst', '1.0')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>gobject.threads_init()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>gst.init(None)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>import sys<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>import os<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>import readline<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>REMOTE_HOST = '127.0.0.1'<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>mainloop = gobject.MainLoop()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline = gst.Pipeline.new('server')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>bus = pipeline.get_bus()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>filesource = gst.ElementFactory.make("filesrc", "file-source")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>filesource.set_property('location', "<dir>/Input.3gp")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>dvdemux = gst.ElementFactory.make("qtdemux", "dvdemux")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>q1 = gst.ElementFactory.make("queue", "q1")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>q2 = gst.ElementFactory.make("queue", "q2")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>rtph264pay = gst.ElementFactory.make("rtph264pay", "rtph264pay")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>rtpamrpay = gst.ElementFactory.make("rtpamrpay", "rtpamrpay")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>rtpbin = gst.ElementFactory.make('rtpbin', 'rtpbin')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>#For Video<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsink_rtpout = gst.ElementFactory.make("udpsink", "vudpsink_rtpout")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsink_rtpout.set_property('host', REMOTE_HOST)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsink_rtpout.set_property('port', 5000)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsink_rtcpout = gst.ElementFactory.make("udpsink", "vudpsink_rtcpout")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsink_rtcpout.set_property('host', REMOTE_HOST)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsink_rtcpout.set_property('port', 5001)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsink_rtcpout.set_property('sync', False)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsink_rtcpout.set_property('async', False)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsrc_rtcpin = gst.ElementFactory.make("udpsrc", "vudpsrc_rtcpin")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsrc_rtcpin.set_property('port', 5005)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>#For Audio<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsink_rtpout = gst.ElementFactory.make("udpsink", "audpsink_rtpout")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsink_rtpout.set_property('host', REMOTE_HOST)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsink_rtpout.set_property('port', 5002)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsink_rtcpout = gst.ElementFactory.make("udpsink", "audpsink_rtcpout")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsink_rtcpout.set_property('host', REMOTE_HOST)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsink_rtcpout.set_property('port', 5003)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsink_rtcpout.set_property('sync', False)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsink_rtcpout.set_property('async', False)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsrc_rtcpin = gst.ElementFactory.make("udpsrc", "audpsrc_rtcpin")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsrc_rtcpin.set_property('port', 5007)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US># Add elements<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(filesource)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(dvdemux)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(q1)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(q2)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(rtph264pay)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(rtpamrpay)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(rtpbin)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(vudpsink_rtpout)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(vudpsink_rtcpout)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(vudpsrc_rtcpin)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(audpsink_rtpout)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(audpsink_rtcpout)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(audpsrc_rtcpin)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>def dvdemux_padded(demuxer, pad):<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    #print "Demux_Callback entry: "+str(pad.get_name())<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    if pad.get_name() == "video_0":<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        print "Video Template"<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        qv_pad = q1.get_static_pad("sink")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        pad.link(qv_pad)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    elif pad.get_name() == "audio_0":<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        print "Audio Template"<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        qa_pad = q2.get_static_pad("sink")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        pad.link(qa_pad)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    else:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        print "Template: "+str(pad.get_property("template").name_template)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US># Create links<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>dvdemux.connect('pad-added', dvdemux_padded)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>filesource.link(dvdemux)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>q1.link(rtph264pay)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>q2.link(rtpamrpay)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>rtph264pay.link_pads('src', rtpbin, 'send_rtp_sink_0')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>rtpbin.link_pads('send_rtp_src_0', vudpsink_rtpout, 'sink')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>rtpbin.link_pads('send_rtcp_src_0', vudpsink_rtcpout, 'sink')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsrc_rtcpin.link_pads('src', rtpbin, 'recv_rtcp_sink_0')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>rtpamrpay.link_pads('src', rtpbin, 'send_rtp_sink_1')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>rtpbin.link_pads('send_rtp_src_1', audpsink_rtpout, 'sink')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>rtpbin.link_pads('send_rtcp_src_1', audpsink_rtcpout, 'sink')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsrc_rtcpin.link_pads('src', rtpbin, 'recv_rtcp_sink_1')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>def eos():<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print "Sending EOS to pipeline."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print pipeline.send_event(gst.Event.new_eos())<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print "Changing pipeline state to NULL."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print pipeline.set_state(gst.State.NULL)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print "Quitting the Mainloop."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print mainloop.quit()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>def on_message(bus, message):<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    #print "On_Message entry."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    t = message.type<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    if t == gst.MessageType.EOS:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        print "EOS Message."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        eos()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    elif t == gst.MessageType.ERROR:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        err, debug = message.parse_error()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        print "Error: %s" % err, debug<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        pipeline.set_state(gst.State.NULL)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    #else:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    #    print "Else Message: "+str(t)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>            <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>def on_sync_message(bus, message):<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print "On_Sync_Message entry."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>def on_finish(bus, message):<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print "Message:Finish."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>def on_eos(bus, msg):<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print "On_Eos."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    eos()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>def on_error(bus, msg):<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>   err, debug = msg.parse_error()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>   print "Error: %s" % err, debug<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>def on_warning(bus, msg):<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>   print "Warning."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>            <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>print "Creating the bus."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>bus.add_signal_watch()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>bus.connect('message::eos', on_eos)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>bus.connect('message::error', on_error)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>bus.connect('message::warning', on_warning)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>bus.connect("sync-message::element", on_sync_message)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>bus.add_signal_watch()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>def go():<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print ("Setting pipeline to PLAYING")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print pipeline.set_state(gst.State.PLAYING)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print ("Waiting pipeline to settle")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print pipeline.get_state(1000)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    try:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        print "Running the Mainloop."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        mainloop.run()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        print pipeline.set_state(gst.State.NULL)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    except KeyboardInterrupt:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        eos()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>go()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>#!/usr/bin/env python<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>################ RTP CLIENT<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>import gi<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>from gi.repository import GObject as gobject<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>from gi.repository import Gst as gst<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>gi.require_version('Gst', '1.0')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>gobject.threads_init()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>gst.init(None)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>import sys<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>import os<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>import readline<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>REMOTE_HOST = '127.0.0.1'<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>mainloop = gobject.MainLoop()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline = gst.Pipeline.new('client')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>bus = pipeline.get_bus()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>rtpbin = gst.ElementFactory.make('rtpbin', 'rtpbin')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US># For Video<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsrc_rtpin = gst.ElementFactory.make('udpsrc', 'vudpsrc_rtpin')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsrc_rtpin.set_property('port', 5000)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsrc_caps = gst.caps_from_string("application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsrc_rtpin.set_property('caps', vudpsrc_caps)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsrc_rtcpin = gst.ElementFactory.make('udpsrc', 'vudpsrc_rtcpin')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsrc_rtcpin.set_property('port', 5001)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsink_rtcpout = gst.ElementFactory.make('udpsink', 'vudpsink_rtcpout')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsink_rtcpout.set_property('host', REMOTE_HOST)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsink_rtcpout.set_property('port', 5005)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsink_rtcpout.set_property('sync', False)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsink_rtcpout.set_property('async', False)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>#For Audio<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsrc_rtpin = gst.ElementFactory.make('udpsrc', 'audpsrc_rtpin')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsrc_rtpin.set_property('port', 5002)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsrc_caps = gst.caps_from_string("application/x-rtp,media=(string)audio,clock-rate=(int)16000,encoding-name=(string)AMR-WB,encoding-params=(string)1,octet-align=(string)1")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsrc_rtpin.set_property('caps', audpsrc_caps)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsrc_rtcpin = gst.ElementFactory.make('udpsrc', 'audpsrc_rtcpin')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsrc_rtcpin.set_property('port', 5003)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsink_rtcpout = gst.ElementFactory.make('udpsink', 'audpsink_rtcpout')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsink_rtcpout.set_property('host', REMOTE_HOST)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsink_rtcpout.set_property('port', 5007)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsink_rtcpout.set_property('sync', False)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsink_rtcpout.set_property('async', False)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>rtph264depay = gst.ElementFactory.make("rtph264depay", "rtph264depay")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>rtpamrdepay = gst.ElementFactory.make("rtpamrdepay", "rtpamrdepay")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>avdec_h264 = gst.ElementFactory.make("avdec_h264", "avdec_h264")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>videoconvert = gst.ElementFactory.make("videoconvert", "videoconvert")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>avdec_amrwb = gst.ElementFactory.make("avdec_amrwb", "avdec_amrwb")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audioconvert = gst.ElementFactory.make("audioconvert", "audioconvert")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>progressreport = gst.ElementFactory.make("progressreport", "progressreport")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>#File<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>x264enc = gst.ElementFactory.make("x264enc", "x264enc")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>voamrwbenc = gst.ElementFactory.make("voamrwbenc", "voamrwbenc")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>qtmux = gst.ElementFactory.make("qtmux", "qtmux")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>filesink = gst.ElementFactory.make("filesink", "filesink")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>filesink.set_property("location", "<dir>/Captured.3gp")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(rtpbin)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(vudpsrc_rtpin)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(vudpsrc_rtcpin)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(vudpsink_rtcpout)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(audpsrc_rtpin)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(audpsrc_rtcpin)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(audpsink_rtcpout)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(rtph264depay)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(rtpamrdepay)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(avdec_h264)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(avdec_amrwb)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(videoconvert)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(audioconvert)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(progressreport)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>#File<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(x264enc)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(voamrwbenc)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(qtmux)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>pipeline.add(filesink)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>def pad_added_cb(rtpbin, pad, depay):<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    #print "Pad Added entry. Template: " +str(pad.get_property("template").name_template)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    #print "Pad name: " +str(pad.get_name())  <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    #print "Depay name: "+str(depay.get_name())<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    if pad.get_name().startswith("recv_rtp_src_0") and depay.get_name().startswith("rtph264depay"):<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        print "Linking video depay"<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        depay_pad = rtph264depay.get_static_pad("sink")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        pad.link(depay_pad)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    elif pad.get_name().startswith("recv_rtp_src_1") and depay.get_name().startswith("rtpamrdepay"):<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        print "Linking audio depay"<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        depay_pad = rtpamrdepay.get_static_pad("sink")<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        pad.link(depay_pad)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    #else:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    #    print "Can not do anything."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>print "Linking static pads."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsrc_rtpin.link_pads('src', rtpbin, 'recv_rtp_sink_0') <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>vudpsrc_rtcpin.link_pads('src', rtpbin, 'recv_rtcp_sink_0') <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>rtpbin.link_pads('send_rtcp_src_0', vudpsink_rtcpout, 'sink') <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsrc_rtpin.link_pads('src', rtpbin, 'recv_rtp_sink_1') <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audpsrc_rtcpin.link_pads('src', rtpbin, 'recv_rtcp_sink_1') <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>rtpbin.link_pads('send_rtcp_src_1', audpsink_rtcpout, 'sink')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>rtpbin.connect('pad-added', pad_added_cb, rtph264depay)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>rtpbin.connect('pad-added', pad_added_cb, rtpamrdepay)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>rtph264depay.link(avdec_h264)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>avdec_h264.link(videoconvert)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>rtpamrdepay.link(avdec_amrwb)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>avdec_amrwb.link(audioconvert)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>#File<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>videoconvert.link(x264enc)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>x264enc.link_pads('src', qtmux, 'video_0')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>audioconvert.link(progressreport)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>progressreport.link(voamrwbenc)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>voamrwbenc.link_pads('src', qtmux, 'audio_0')<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>qtmux.link(filesink)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>def on_message(bus, message):<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>#    print "On_Message entry."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    t = message.type<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    if t == gst.MessageType.EOS:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        print "EOS Message received ###################."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        eos()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    elif t == gst.MessageType.ERROR:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        err, debug = message.parse_error()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        print "Error: %s" % err, debug<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        pipeline.set_state(gst.State.NULL)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>#    else:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>#        print "Else Message: "+str(t)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>            <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>def on_sync_message(bus, message):<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print "On_Sync_Message entry."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>     <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>def on_eos(bus, msg):<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print "On_Eos."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    eos()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>def on_error(bus, msg):<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>   err, debug = msg.parse_error()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>   print "Error: %s" % err, debug<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>def on_warning(bus, msg):<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>   print "Warning."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>def on_state(bus, msg):<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>   print "State Changed."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>print "Creating the bus."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>bus.enable_sync_message_emission()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>#bus.connect("message", on_message)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>bus.connect('message::eos', on_eos)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>bus.connect('message::error', on_error)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>bus.connect('message::warning', on_warning)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>#bus.connect('message::state-changed', on_state)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>bus.connect("sync-message::element", on_sync_message)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>bus.add_signal_watch()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>def start():<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    pipeline.set_state(gst.State.PLAYING)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    vudpsink_rtcpout.set_locked_state(gst.State.PLAYING)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    audpsink_rtcpout.set_locked_state(gst.State.PLAYING)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print "Started..."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>def eos():<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print "Sending EOS to pipeline."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print pipeline.send_event(gst.Event.new_eos())<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print "Changing pipeline state to NULL."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print pipeline.set_state(gst.State.NULL)<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print "Quitting the Mainloop."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    print mainloop.quit()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>def loop():   <o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    try:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        print "Running the Mainloop."<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        mainloop.run()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    except KeyboardInterrupt:<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>        eos()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p><p class=MsoNormal><span lang=EN-US>if __name__ == '__main__':<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    start()<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US>    loop()<o:p></o:p></span></p></div></body></html>