=^.^=

Installing C++ RTMP Server (rtmpd, crtmpdserver) From Source on Gentoo

C++ RTMP Server is a lightweight streaming server that supports multiple streaming protocols and - most importantly - trans-coding between them. I stumbled upon it when I was looking for a solution that would trans-code an RTSP stream from an Axis webcam to a flash-playable RTMP stream. It can also be used as a drop-in replacement for some of Flash Media Server or Red5's basic stream publishing functions but does not provide support for Flex applications or tomcat servlets, for example.

Download the latest source release at the bottom of http://www.rtmpd.com/downloads/ and extract it in your /usr/src directory, or download a snapshot from SVN with a blank password:

$ svn co --username anonymous https://svn.rtmpd.com/crtmpserver/branches/1.0 crtmpserver

Now compile the source and install the binaries:

# cd builders/cmake
# cmake -DCRTMPSERVER_INSTALL_PREFIX=/usr/local .
# make install

Copy /usr/local/etc/crtmpserver.lua.sample to /usr/local/etc/crtmpserver.lua then edit it to reflect:

        -- this node holds all the RTMP applications
        applications=
        {
                -- this is the root directory of all applications
                -- usually this is relative to the binary execuable
                rootDirectory="/usr/local/lib/crtmpserver/applications",

Copy the SSL key and certificate:

# cp /usr/src/crtmpserver-690/builders/cmake/applications/appselector/server.* /usr/local/lib/crtmpserver/applications/appselector/

Create a media directory and link it in the flvplayback application's folder then copy users.lua:

# mkdir /var/crtmpserver
# mkdir /var/crtmpserver/media
# ln -s /var/crtmpserver/media/ /usr/local/lib/crtmpserver/applications/flvplayback/mediaFolder
# cp /usr/src/crtmpserver-690/builders/cmake/applications/flvplayback/users.lua /usr/local/lib/crtmpserver/applications/flvplayback/

You should now be able to run the binary:

# crtmpserver /usr/local/etc/crtmpserver.lua
/usr/src/crtmpserver-690/sources/crtmpserver/src/crtmpserver.cpp:203 Initialize I/O handlers manager: epoll
/usr/src/crtmpserver-690/sources/crtmpserver/src/crtmpserver.cpp:206 Configure modules
/usr/src/crtmpserver-690/sources/thelib/src/configuration/module.cpp:84 Module /usr/local/lib/crtmpserver/applications/appselector/libappselector.so loaded
/usr/src/crtmpserver-690/sources/thelib/src/configuration/module.cpp:84 Module /usr/local/lib/crtmpserver/applications/flvplayback/libflvplayback.so loaded
/usr/src/crtmpserver-690/sources/thelib/src/configuration/module.cpp:84 Module /usr/local/lib/crtmpserver/applications/samplefactory/libsamplefactory.so loaded
/usr/src/crtmpserver-690/sources/thelib/src/configuration/module.cpp:84 Module /usr/local/lib/crtmpserver/applications/vptests/libvptests.so loaded
/usr/src/crtmpserver-690/sources/thelib/src/configuration/module.cpp:84 Module /usr/local/lib/crtmpserver/applications/admin/libadmin.so loaded
/usr/src/crtmpserver-690/sources/thelib/src/configuration/module.cpp:84 Module /usr/local/lib/crtmpserver/applications/proxypublish/libproxypublish.so loaded
/usr/src/crtmpserver-690/sources/thelib/src/configuration/module.cpp:84 Module /usr/local/lib/crtmpserver/applications/stresstest/libstresstest.so loaded
/usr/src/crtmpserver-690/sources/thelib/src/configuration/module.cpp:84 Module /usr/local/lib/crtmpserver/applications/applestreamingclient/libapplestreamingclient.so loaded
/usr/src/crtmpserver-690/sources/crtmpserver/src/crtmpserver.cpp:212 Plug in the default protocol factory
/usr/src/crtmpserver-690/sources/crtmpserver/src/crtmpserver.cpp:219 Configure factories
/usr/src/crtmpserver-690/sources/thelib/src/configuration/module.cpp:97 Loaded factory from application samplefactory
/usr/src/crtmpserver-690/sources/crtmpserver/src/crtmpserver.cpp:225 Configure acceptors
/usr/src/crtmpserver-690/sources/thelib/src/netio/epoll/iohandlermanager.cpp:100 Handlers count changed: 0->1 IOHT_ACCEPTOR
/usr/src/crtmpserver-690/sources/thelib/src/netio/epoll/iohandlermanager.cpp:100 Handlers count changed: 1->2 IOHT_ACCEPTOR
/usr/src/crtmpserver-690/sources/thelib/src/netio/epoll/iohandlermanager.cpp:100 Handlers count changed: 2->3 IOHT_ACCEPTOR
/usr/src/crtmpserver-690/sources/thelib/src/netio/epoll/iohandlermanager.cpp:100 Handlers count changed: 3->4 IOHT_ACCEPTOR
/usr/src/crtmpserver-690/sources/thelib/src/netio/epoll/iohandlermanager.cpp:100 Handlers count changed: 4->5 IOHT_ACCEPTOR
/usr/src/crtmpserver-690/sources/thelib/src/netio/epoll/iohandlermanager.cpp:100 Handlers count changed: 5->6 IOHT_ACCEPTOR
/usr/src/crtmpserver-690/sources/thelib/src/netio/epoll/iohandlermanager.cpp:100 Handlers count changed: 6->7 IOHT_ACCEPTOR
/usr/src/crtmpserver-690/sources/thelib/src/netio/epoll/iohandlermanager.cpp:100 Handlers count changed: 7->8 IOHT_ACCEPTOR
/usr/src/crtmpserver-690/sources/thelib/src/netio/epoll/iohandlermanager.cpp:100 Handlers count changed: 8->9 IOHT_ACCEPTOR
/usr/src/crtmpserver-690/sources/thelib/src/netio/epoll/iohandlermanager.cpp:100 Handlers count changed: 9->10 IOHT_ACCEPTOR
/usr/src/crtmpserver-690/sources/crtmpserver/src/crtmpserver.cpp:231 Configure instances
/usr/src/crtmpserver-690/sources/crtmpserver/src/crtmpserver.cpp:237 Start I/O handlers manager: epoll
/usr/src/crtmpserver-690/sources/crtmpserver/src/crtmpserver.cpp:240 Configure applications
/usr/src/crtmpserver-690/sources/thelib/src/configuration/module.cpp:177 Application admin instantiated
/usr/src/crtmpserver-690/sources/thelib/src/configuration/module.cpp:177 Application applestreamingclient instantiated
/usr/src/crtmpserver-690/sources/thelib/src/configuration/module.cpp:177 Application appselector instantiated
/usr/src/crtmpserver-690/sources/thelib/src/configuration/module.cpp:177 Application flvplayback instantiated
/usr/src/crtmpserver-690/sources/thelib/src/configuration/module.cpp:177 Application proxypublish instantiated
/usr/src/crtmpserver-690/sources/thelib/src/netio/epoll/iohandlermanager.cpp:100 Handlers count changed: 10->11 IOHT_TIMER
/usr/src/crtmpserver-690/sources/thelib/src/configuration/module.cpp:177 Application samplefactory instantiated
/usr/src/crtmpserver-690/sources/thelib/src/configuration/module.cpp:177 Application stresstest instantiated
/usr/src/crtmpserver-690/sources/thelib/src/configuration/module.cpp:177 Application vptests instantiated
/usr/src/crtmpserver-690/sources/crtmpserver/src/crtmpserver.cpp:246 Install the quit signal
/usr/src/crtmpserver-690/sources/crtmpserver/src/crtmpserver.cpp:257
+-----------------------------------------------------------------------------+
|                                                                     Services|
+---+---------------+-----+-------------------------+-------------------------+
| c |      ip       | port|   protocol stack name   |     application name    |
+---+---------------+-----+-------------------------+-------------------------+
|tcp|        0.0.0.0| 1112|           inboundJsonCli|                    admin|
+---+---------------+-----+-------------------------+-------------------------+
|tcp|        0.0.0.0| 1935|              inboundRtmp|              appselector|
+---+---------------+-----+-------------------------+-------------------------+
|tcp|        0.0.0.0| 8081|             inboundRtmps|              appselector|
+---+---------------+-----+-------------------------+-------------------------+
|tcp|        0.0.0.0| 8080|             inboundRtmpt|              appselector|
+---+---------------+-----+-------------------------+-------------------------+
|tcp|        0.0.0.0| 6666|           inboundLiveFlv|              flvplayback|
+---+---------------+-----+-------------------------+-------------------------+
|tcp|        0.0.0.0| 9999|             inboundTcpTs|              flvplayback|
+---+---------------+-----+-------------------------+-------------------------+
|tcp|        0.0.0.0| 6665|           inboundLiveFlv|             proxypublish|
+---+---------------+-----+-------------------------+-------------------------+
|tcp|        0.0.0.0| 8989|         httpEchoProtocol|            samplefactory|
+---+---------------+-----+-------------------------+-------------------------+
|tcp|        0.0.0.0| 8988|             echoProtocol|            samplefactory|
+---+---------------+-----+-------------------------+-------------------------+
|tcp|        0.0.0.0| 1111|    inboundHttpXmlVariant|                  vptests|
+---+---------------+-----+-------------------------+-------------------------+
/usr/src/crtmpserver-690/sources/crtmpserver/src/crtmpserver.cpp:258 GO! GO! GO! (4108)

If it simply returns to the command line ensure you have not configured crtmpserver.lua to daemonize then run it with the following flags:

# crtmpserver --use-implicit-console-appender /usr/local/etc/crtmpserver.lua

Hit Control+C to terminate the process. Now we will create an unprivileged user account for the daemon to run under:

# useradd -d /usr/local -s /sbin/nologin -r rtmpd

Change the permissions of /var/crtmpserver:

# chown rtmpd: /var/crtmpserver -R

Edit /usr/local/etc/crtmpserver.lua to reflect:

configuration=
{
        -- if true, the server will run as a daemon.
        -- NOTE: all console appenders will be ignored if this is a daemon
        daemon=true,

Create a directory for the logs:

# mkdir /var/log/rtmpd
# chown rtmpd: /var/log/rtmpd

Edit /usr/local/etc/crtmpserver.lua to reflect:

                {
                        name="file appender",
                        type="file",
                        level=6,
                        -- the file where the log messages are going to land
                        fileName="/var/log/rtmpd/rtmpd.log",
                        --newLineCharacters="\r\n",
                        fileHistorySize=10,
                        fileLength=1024*256,
                        singleLine=true
                }

Now create the init script /etc/init.d/rtmpd:

#!/sbin/runscript
# Copyright (c) 2011 http://foxpa.ws
# All rights released

description="Runs C++ RTMP Server on Gentoo"

depend()
{
        need net
}

start()
{
        ebegin "Starting C++ RTMP Server"
        /usr/local/sbin/crtmpserver --daemon --gid=`id -g rtmpd` --uid=`id -u rtmpd` /usr/local/etc/crtmpserver.lua
        eend ${?}
}

stop()
{
        ebegin "Stopping C++ RTMP Server"
        killall crtmpserver
        eend ${?}
}

Make the script executable and add it to the default runlevel:

# chmod +x /etc/init.d/rtmpd
# rc-update add rtmpd default

You can now start the daemon by running:

# /etc/init.d/rtmpd start

Comments

• ben

@ospn2012
Hi,

Did you find a solution to run rtmpd on Axis camera ?

Thanks,
Ben

• AnShLv

Did like you wrote, perfect, just did all for CentOS6 so had to replace init.d script to one from here http://wiki.rtmpd.com/tutorial_full_centos_build
with altering DAEMON_ARGS="--daemon --gid=`id -u rtmpd` /usr/local/etc/crtmpserver.lua" to run from the name of user we just created.

ospn2012

Any luck with rtmpd on Axis Products running BSD?