Вы пытались выставить протокол RTP через TCP-сервер, но учтите, что RTP не RTSP и что RTP (и RTCP) могут быть только частью RTSP.
В любом случае, существует способ создать RTSP-сервер с GStreamer и Python, используя GStreamer GstRtspServer и Python для Gstreamer (пакет gi
).
Предполагая, что у вас уже есть Gstreamer на вашем компьютере, сначала установите пакет gi python , а затем установите сервер Gstreamer RTSP (который не является частью стандартной установки Gstreamer).
Python код для предоставления файла контейнера mp4 через простой RTSP-сервер
#!/usr/bin/env python
import 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)
class TestRtspMediaFactory(GstRtspServer.RTSPMediaFactory):
def __init__(self):
GstRtspServer.RTSPMediaFactory.__init__(self)
def do_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)
class GstreamerRtspServer():
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()
Обратите внимание, что
- этот код предоставит RTSP поток с именем
stream1
на порту по умолчанию 8554 - Я использовал
qtdemux
для получения видео из контейнера MP4. Вы можете расширить вышеупомянутый конвейер, чтобы извлекать аудио тоже (и выставлять его тоже через RTSP-сервер) - , чтобы уменьшить загрузку ЦП, вы можете извлекать только видео без декодирования и повторного кодирования в H264. Однако, если необходимо транскодирование, я оставил одну закомментированную строку, которая выполнит работу (но это может задушить менее мощные процессоры).
Вы можете играть в это с VL C
vlc -v rtsp://127.0.0.1:8554/stream1
или с Gstreamer
gst-launch-1.0 playbin uri=rtsp://127.0.0.1:8554/stream1
Однако Если вам на самом деле не нужен RTSP, а просто сквозной RTP после конвейера Gstreamer (который использует rtpbin ) выполнит работу
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
и VL C сможет воспроизвести ее с
vlc -v rtp://127.0.0.1:5000