How To Convert A Video (on Disk) To A Rtsp Stream
I have a video file on my local disk and i want to create an rtsp stream from it, which i am going to use in one of my project. One way is to create a rtsp stream from vlc but i wa
Solution 1:
You tried to expose RTP protocol via TCP server but please note that RTP is not RTSP and that RTP (and RTCP) can only be part of RTSP.
Anyways, there is a way to create RTSP server with GStreamer and Python by using GStreamer's GstRtspServer and Python interface for Gstreamer (gi
package).
Assuming that you already have Gstreamer on your machine, first install gi python package and then install Gstreamer RTSP server (which is not part of standard Gstreamer installation).
Python code to expose mp4 container file via simple RTSP server
#!/usr/bin/env pythonimport sys
import gi
gi.require_version('Gst', '1.0')
gi.require_version('GstRtspServer', '1.0')
from gi.repository import Gst, GstRtspServer, GObject, GLib
loop = GLib.MainLoop()
Gst.init(None)
classTestRtspMediaFactory(GstRtspServer.RTSPMediaFactory):
def__init__(self):
GstRtspServer.RTSPMediaFactory.__init__(self)
defdo_create_element(self, url):
#set mp4 file path to filesrc's location property
src_demux = "filesrc location=/path/to/dir/test.mp4 ! qtdemux name=demux"
h264_transcode = "demux.video_0"#uncomment following line if video transcoding is necessary#h264_transcode = "demux.video_0 ! decodebin ! queue ! x264enc"
pipeline = "{0} {1} ! queue ! rtph264pay name=pay0 config-interval=1 pt=96".format(src_demux, h264_transcode)
print ("Element created: " + pipeline)
return Gst.parse_launch(pipeline)
classGstreamerRtspServer():
def__init__(self):
self.rtspServer = GstRtspServer.RTSPServer()
factory = TestRtspMediaFactory()
factory.set_shared(True)
mountPoints = self.rtspServer.get_mount_points()
mountPoints.add_factory("/stream1", factory)
self.rtspServer.attach(None)
if __name__ == '__main__':
s = GstreamerRtspServer()
loop.run()
Note that
- this code will expose RTSP stream named
stream1
on default port 8554 - I used
qtdemux
to get video from MP4 container. You could extend above pipeline to extract audio too (and expose it too via RTSP server) - to decrease CPU processing you can only extract video without decoding it and encoding it again to H264. However, if transcoding is needed, I left one commented line that will do the job (but it might choke less powerful CPUs).
You can play this with VLC
vlc -v rtsp://127.0.0.1:8554/stream1
or with Gstreamer
gst-launch-1.0 playbin uri=rtsp://127.0.0.1:8554/stream1
However, If you actually do not need RTSP but just end-to-end RTP following Gstreamer pipeline (that utilizes rtpbin) will do the job
gst-launch-1.0 -v rtpbin name=rtpbin \
filesrc location=test.mp4 ! qtdemux name=demux \
demux.video_0 ! decodebin ! x264enc ! rtph264pay config-interval=1 pt=96 ! rtpbin.send_rtp_sink_0 \
rtpbin.send_rtp_src_0 ! udpsink host=127.0.0.1 port=5000 sync=true async=false
and VLC can play it with
vlc -v rtp://127.0.0.1:5000
Post a Comment for "How To Convert A Video (on Disk) To A Rtsp Stream"