diff --git a/README.md b/README.md
index 8103ea1b7..733f7f0cd 100755
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@ step 1: build srs
tar xf simple-rtmp-server-*.*.tar.gz cd simple-rtmp-server-*.*/trunk -./configure --with-ssl --with-hls --with-ffmpeg +./configure --with-ssl --with-hls --with-ffmpeg --with-http makestep 2: start srs
sudo ./objs/nginx/sbin/nginx+step 5(optional): start http hooks for srs callback
+python ./research/api-server/server.py 8085 +step 5: publish live stream
FMS URL: rtmp://127.0.0.1:1935/live diff --git a/trunk/conf/srs.conf b/trunk/conf/srs.conf index f3ff06a39..0bccae544 100755 --- a/trunk/conf/srs.conf +++ b/trunk/conf/srs.conf @@ -87,6 +87,12 @@ vhost dev { hls_window 30; #forward 127.0.0.1:19350; #forward 127.0.0.1:1936; + on_connect http://127.0.0.1:8085/api/v1/clients; + on_close http://127.0.0.1:8085/api/v1/clients; + on_publish http://127.0.0.1:8085/api/v1/streams; + on_unpublish http://127.0.0.1:8085/api/v1/streams; + on_play http://127.0.0.1:8085/api/v1/sessions; + on_stop http://127.0.0.1:8085/api/v1/sessions; transcode { enabled off; ffmpeg ./objs/ffmpeg/bin/ffmpeg; diff --git a/trunk/configure b/trunk/configure index 310e2a53b..187f9f652 100755 --- a/trunk/configure +++ b/trunk/configure @@ -174,4 +174,7 @@ fi if [ $SRS_FFMPEG = YES ]; then echo -e "\" ./objs/ffmpeg/bin/ffmpeg \" is used for live stream transcoding" fi +if [ $SRS_HTTP = YES ]; then + echo -e "\" python ./research/api-server/server.py 8085 \" to start the api-server" +fi echo "\" ./objs/simple_rtmp_server -c conf/srs.conf \" to start the srs live server" diff --git a/trunk/research/api-server/server.py b/trunk/research/api-server/server.py new file mode 100755 index 000000000..a6b61acc0 --- /dev/null +++ b/trunk/research/api-server/server.py @@ -0,0 +1,90 @@ +#!/usr/bin/python +''' +The MIT License (MIT) + +Copyright (c) 2013 winlin + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +''' + +""" +the api-server is a default demo server for srs to call +when srs get some event, for example, when client connect +to srs, srs can invoke the http api of the api-server +""" + +import sys; +# reload sys model to enable the getdefaultencoding method. +reload(sys); +# set the default encoding to utf-8 +# using exec to set the encoding, to avoid error in IDE. +exec("sys.setdefaultencoding('utf-8')"); +assert sys.getdefaultencoding().lower() == "utf-8"; + +if __name__ != "__main__": + raise Exception("embed not support"); + +if len(sys.argv) <= 1: + print "SRS api callback server, Copyright (c) 2013 winlin" + print "Usage: python %s"%(sys.argv[0]) + print " port: the port to listen at." + print "For example:" + print " python %s 8085"%(sys.argv[0]) + print "" + print "See also: https://github.com/winlinvip/simple-rtmp-server" + sys.exit(1) + +import datetime, cherrypy + +def trace(msg): + date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + print "[%s][trace] %s"%(date, msg) + +class RESTClients(object): + pass; + +class Root(object): + def __init__(self): + self.api = Api() + +class Api(object): + def __init__(self): + self.v1 = V1() + +class V1(object): + def __init__(self): + self.clients = RESTClients() + +port = int(sys.argv[1]) +trace("api server listen at port: %s"%(port)) + +conf = { + 'global': { + 'server.shutdown_timeout': 1, + 'server.socket_host': '0.0.0.0', + 'server.socket_port': port, + 'tools.encode.on': True, + 'tools.encode.encoding': "utf-8" + }, + '/': { + 'request.dispatch': cherrypy.dispatch.MethodDispatcher() + } +} + +trace("start cherrypy server") +cherrypy.quickstart(Root(), '/', conf)