Class: RTSP::Server
Overview
Instantiates an RTSP Server Streaming is performed using socat. All you need is the multicast source RTP host and port.
require ‘rtsp/server’ server = RTSP::Server.new “10.221.222.90”, 8554
This is for the stream at index 1 (rtsp://10.221.222.90:8554/stream1) RTSP::StreamServer.instance.source_ip << “239.221.222.241” RTSP::StreamServer.instance.source_port << 6780 RTSP::StreamServer.instance.fmtp << “96 packetization-mode=1…” RTSP::StreamServer.instance.rtp_map << “96 H264/90000”
This is for the stream at index 2 (rtsp://10.221.222.90:8554/stream2) RTSP::StreamServer.instance.source_ip << “239.221.222.141” RTSP::StreamServer.instance.source_port << 6740 RTSP::StreamServer.instance.fmtp << “96 packetization-mode=1…” RTSP::StreamServer.instance.rtp_map << “96 MP4/90000”
Now start the server server.start
Constant Summary collapse
- OPTIONS_LIST =
%w(OPTIONS DESCRIBE SETUP TEARDOWN PLAY PAUSE GET_PARAMETER SET_PARAMETER)
Constants included from Global
Global::DEFAULT_RTSP_PORT, Global::DEFAULT_VERSION
Instance Attribute Summary collapse
-
#agent ⇒ Object
Returns the value of attribute agent.
-
#options_list ⇒ Object
Returns the value of attribute options_list.
-
#session ⇒ Object
Returns the value of attribute session.
-
#version ⇒ Object
Returns the value of attribute version.
Attributes included from Global
#log, #log_level, #logger, #raise_errors
Instance Method Summary collapse
-
#add_headers(request, response, body, status = "200 OK") ⇒ Array<Array<String>>
Adds the headers to the response.
-
#announce(request) ⇒ Array<Array<String>>
Handles the announce request.
-
#describe(request) ⇒ Array<Array<String>>
Handles the describe request.
-
#get_parameter(request) ⇒ Array<Array<String>>
Handles the get_parameter request.
-
#initialize(host, port = 554) ⇒ Server
constructor
Initializes the the Stream Server.
-
#method_missing(method_name, *args, &block) ⇒ Object
Handles unsupported RTSP requests.
-
#options(request) ⇒ Array<Array<String>>
Handles the options request.
-
#pause(request) ⇒ Array<Array<String>>
Handles a pause request.
-
#play(request) ⇒ Array<Array<String>>
Handles the play request.
-
#process_request(request_str, io) ⇒ String
Process an RTSP request.
-
#redirect(request) ⇒ Array<Array<String>>
Handles the redirect request.
-
#serve(io) ⇒ Object
Serves a client request.
-
#set_parameter(request) ⇒ Array<Array<String>>
Handles the set_parameter request.
-
#setup(request) ⇒ Array<Array<String>>
Handles the setup request.
-
#start ⇒ Object
Starts accepting TCP connections.
-
#teardown(request) ⇒ Array<Array<String>>
Handles the teardown request.
-
#udp_listen ⇒ Object
Listens on the UDP socket for RTSP requests.
Methods included from Global
log?, raise_errors?, reset_config!, rtsp_version
Constructor Details
#initialize(host, port = 554) ⇒ Server
Initializes the the Stream Server.
45 46 47 48 49 50 51 52 53 54 |
# File 'lib/rtsp/server.rb', line 45 def initialize(host, port=554) @session = rand(99999999) @stream_server = RTSP::StreamServer.instance @interface_ip = host @stream_server.interface_ip = host @tcp_server = TCPServer.new(host, port) @udp_server = UDPSocket.new @udp_server.bind(host, port) @agent = {} end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method_name, *args, &block) ⇒ Object
Handles unsupported RTSP requests.
280 281 282 283 284 |
# File 'lib/rtsp/server.rb', line 280 def method_missing(method_name, *args, &block) RTSP::Server.log("Received request for #{method_name} (not implemented)", :warn) [[], "Not Implemented"] end |
Instance Attribute Details
#agent ⇒ Object
Returns the value of attribute agent.
39 40 41 |
# File 'lib/rtsp/server.rb', line 39 def agent @agent end |
#options_list ⇒ Object
Returns the value of attribute options_list.
36 37 38 |
# File 'lib/rtsp/server.rb', line 36 def end |
#session ⇒ Object
Returns the value of attribute session.
38 39 40 |
# File 'lib/rtsp/server.rb', line 38 def session @session end |
#version ⇒ Object
Returns the value of attribute version.
37 38 39 |
# File 'lib/rtsp/server.rb', line 37 def version @version end |
Instance Method Details
#add_headers(request, response, body, status = "200 OK") ⇒ Array<Array<String>>
Adds the headers to the response.
256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 |
# File 'lib/rtsp/server.rb', line 256 def add_headers(request, response, body, status="200 OK") result = [] version ||= SUPPORTED_VERSION result << "RTSP/#{version} #{status}" result << "CSeq: #{request.cseq}" unless body.nil? result << "Content-Type: #{request.accept}" result << "Content-Base: #{request.url}/" result << "Content-Length: #{body.size}" end result << "Date: #{Time.now.gmtime.strftime('%a, %b %d %Y %H:%M:%S GMT')}" result << response.join("\r\n") unless response.nil? result << body unless body.nil? result.flatten.join "\r\n" end |
#announce(request) ⇒ Array<Array<String>>
Handles the announce request.
147 148 149 |
# File 'lib/rtsp/server.rb', line 147 def announce(request) [] end |
#describe(request) ⇒ Array<Array<String>>
Handles the describe request.
136 137 138 139 140 141 |
# File 'lib/rtsp/server.rb', line 136 def describe(request) RTSP::Server.log "Received DESCRIBE request from #{request.remote_host}" description = @stream_server.description(request.multicast?, request.stream_index) [[], description] end |
#get_parameter(request) ⇒ Array<Array<String>>
Handles the get_parameter request.
194 195 196 197 198 199 |
# File 'lib/rtsp/server.rb', line 194 def get_parameter(request) RTSP::Server.log "Received GET_PARAMETER request from #{request.remote_host}" " Pending Implementation" [[]] end |
#options(request) ⇒ Array<Array<String>>
Handles the options request.
123 124 125 126 127 128 129 130 |
# File 'lib/rtsp/server.rb', line 123 def (request) RTSP::Server.log "Received OPTIONS request from #{request.remote_host}" response = [] response << "Public: #{OPTIONS_LIST.join ','}" response << "\r\n" [response] end |
#pause(request) ⇒ Array<Array<String>>
Handles a pause request.
239 240 241 242 243 244 245 246 247 |
# File 'lib/rtsp/server.rb', line 239 def pause(request) RTSP::Server.log "Received PAUSE request from #{request.remote_host}" response = [] sid = request.session[:session_id] response << "Session: #{sid}" @stream_server.disconnect sid [response] end |
#play(request) ⇒ Array<Array<String>>
Handles the play request.
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 |
# File 'lib/rtsp/server.rb', line 173 def play(request) RTSP::Server.log "Received PLAY request from #{request.remote_host}" sid = request.session[:session_id] response = [] response << "Session: #{sid}" response << "Range: #{request.range}" index = request.stream_index - 1 rtp_sequence, = @stream_server.parse_sequence_number( @stream_server.source_ip[index], @stream_server.source_port[index]) @stream_server.start_streaming sid response << "RTP-Info: url=#{request.url}/track1;" + "seq=#{rtp_sequence + 6} ;rtptime=#{rtp_timestamp}" response << "\r\n" [response] end |
#process_request(request_str, io) ⇒ String
Process an RTSP request
109 110 111 112 113 114 115 116 117 |
# File 'lib/rtsp/server.rb', line 109 def process_request(request_str, io) remote_address = io.remote_address.ip_address /(?<action>.*) rtsp:\/\// =~ request_str request = RTSP::Request.new(request_str, remote_address) @agent[io] = request.user_agent response, body = send(action.downcase.to_sym, request) add_headers(request, response, body) end |
#redirect(request) ⇒ Array<Array<String>>
Handles the redirect request.
216 217 218 219 220 221 |
# File 'lib/rtsp/server.rb', line 216 def redirect(request) RTSP::Server.log "Received REDIRECT request from #{request.remote_host}" " Pending Implementation" [[]] end |
#serve(io) ⇒ Object
Serves a client request.
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/rtsp/server.rb', line 87 def serve io request_str = "" count = 0 begin request_str << io.read_nonblock(500) rescue Errno::EAGAIN return -1 if count > 50 count += 1 sleep 0.01 retry end response = process_request(request_str, io) io.send(response, 0) end |
#set_parameter(request) ⇒ Array<Array<String>>
Handles the set_parameter request.
205 206 207 208 209 210 |
# File 'lib/rtsp/server.rb', line 205 def set_parameter(request) RTSP::Server.log "Received SET_PARAMETER request from #{request.remote_host}" " Pending Implementation" [[]] end |
#setup(request) ⇒ Array<Array<String>>
Handles the setup request.
155 156 157 158 159 160 161 162 163 164 165 166 167 |
# File 'lib/rtsp/server.rb', line 155 def setup(request) RTSP::Server.log "Received SETUP request from #{request.remote_host}" @session = @session.next server_port = @stream_server.setup_streamer(@session, request.transport_url, request.stream_index) response = [] transport = generate_transport(request, server_port) response << "Transport: #{transport.join}" response << "Session: #{@session}" response << "\r\n" [response] end |
#start ⇒ Object
Starts accepting TCP connections
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/rtsp/server.rb', line 57 def start Thread.start { udp_listen } loop do client = @tcp_server.accept Thread.start do begin loop { break if serve(client) == -1 } rescue EOFError # do nothing ensure client.close unless @agent[client].include? "QuickTime" end end end end |
#teardown(request) ⇒ Array<Array<String>>
Handles the teardown request.
227 228 229 230 231 232 233 |
# File 'lib/rtsp/server.rb', line 227 def teardown(request) RTSP::Server.log "Received TEARDOWN request from #{request.remote_host}" sid = request.session[:session_id] @stream_server.stop_streaming sid [[]] end |
#udp_listen ⇒ Object
Listens on the UDP socket for RTSP requests.
76 77 78 79 80 81 82 |
# File 'lib/rtsp/server.rb', line 76 def udp_listen loop do data, sender = @udp_server.recvfrom(500) response = process_request(data, sender[3]) @udp_server.send(response, 0, sender[3], sender[1]) end end |