Last active
November 4, 2024 03:39
-
-
Save half2me/8b7395b86cc541a345f220537a11a2a4 to your computer and use it in GitHub Desktop.
GST RTSP Server
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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?