Skip to content

Instantly share code, notes, and snippets.

@half2me
Last active March 8, 2021 06:33
Show Gist options
  • Save half2me/8b7395b86cc541a345f220537a11a2a4 to your computer and use it in GitHub Desktop.
Save half2me/8b7395b86cc541a345f220537a11a2a4 to your computer and use it in GitHub Desktop.
GST RTSP Server
import logging
import gi
from gst.caps import CapsRegistry
from gst.pipe_loader import PipelineLoader
from gst.pipeline import Pipeline
gi.require_version('Gst', '1.0')
gi.require_version('GstRtspServer', '1.0')
from gi.repository import Gst, GstRtspServer
logger = logging.getLogger('logic.gst.server')
class RtspFactory(GstRtspServer.RTSPMediaFactory):
yaml_file = None # Pipe config file
caps_store = None # type: CapsRegistry
origin_pipe = None # type: Pipeline
def do_create_element(self, uri):
# Create new pipe for rtsp from definition
pipe = PipelineLoader.create_base_pipe(self.get_launch())
# TODO rtsp connections can be loaded from gui HERE
yaml_defs = PipelineLoader.load_yaml_blocking(self.yaml_file)
PipelineLoader.process_yaml(pipe, self.caps_store, yaml_defs)
PipelineLoader.process_filters(pipe, self.caps_store, yaml_defs)
return pipe.gst_element
class RtspServer:
def __init__(self, caps_store):
self.caps_store = caps_store # type: CapsRegistry
self.server_id = None
self.port = '8554'
logger.info('Creating RTSP server')
self.server = GstRtspServer.RTSPServer()
self.auth = GstRtspServer.RTSPAuth()
self.token = GstRtspServer.RTSPToken()
self.token.set_string('role', 'user')
print(self.token.get_string('role'))
self.token.set_bool('perm', True)
print(self.token.is_allowed('perm'))
basic = GstRtspServer.RTSPAuth.make_basic('user', 'user')
self.auth.set_default_token(self.token)
self.auth.add_basic(basic, self.token)
self.permissions = GstRtspServer.RTSPPermissions()
# self.permissions.add_role("user")
self.permissions.add_permission_for_role("user", "media.factory.access", True)
self.permissions.add_permission_for_role("user", "media.factory.construct", True)
self.permissions.add_permission_for_role("user", "auth.check.media.factory.access", True)
self.permissions.add_permission_for_role("user", "auth.check.media.factory.construct", True)
def start(self, mainloop):
logger.info('Starting RTSP server')
self.server.set_auth(self.auth)
self.server.set_service(self.port)
self.server.connect("client-connected", self.client_connected)
self.server_id = self.server.attach(mainloop)
def close(self):
# GObject.source_remove(self.server_id)
logger.info('Stop RTSP server')
async def create_factory(self, uri, yaml_file_name, gst_pipe):
logger.info('Creating RTSP Factory from YAML def: ' + yaml_file_name)
factory = RtspFactory()
factory.set_shared(True)
factory.caps_store = self.caps_store
# factory.set_eos_shutdown(True)
# save the url of the stream - base uses this to store the launch line :P
factory.set_launch(uri)
# save some reference to the definition of the pipe to create
factory.yaml_file = yaml_file_name
# save the origin pipe that provides the stream, None if (restarting it) is not needed
factory.origin_pipe = gst_pipe.gst_element if gst_pipe else None
factory.connect("media-configure", self.on_media_configure)
factory.set_permissions(self.permissions)
mounts = self.server.get_mount_points()
mounts.add_factory('/' + uri, factory)
logger.info('RTSP stream is available at rtsp://0.0.0.0:{0}/{1}'.format(self.port, uri))
def remove_factory(self, uri):
logger.info('Remove RTSP Factory: ', uri)
mounts = self.server.get_mount_points()
mounts.remove_factory('/' + uri)
def on_media_configure(self, factory, media):
logger.info('Start RTSP "%s"\n' % factory.get_launch())
if factory.origin_pipe:
logger.warning('FIXME: Restart origin pipe...')
factory.origin_pipe.set_state(Gst.State.READY)
factory.origin_pipe.set_state(Gst.State.PLAYING)
def client_connected(self, arg1, arg2):
logger.info('Rtsp client connected.')
@eunafinta
Copy link

hellow, thanks to the post.

I have some problem with code:

"AttributeError: 'RTSPToken' object has no attribute 'set_string'"

My gstreamer is 1.14.

Can you help me?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment