Crtmpserver

From Alessandro's Wiki


going "on-air"

  • RTMP URL :
rtmp://[server address]/[application]/[streamName]

Mac/Win gui

Linux gui's

  • unknown...

FFMPEG

ffmpeg -re -i myfile -f flv rtmp://myserver/live/mystream
  • play the stream:
ffplay "rtmp://myserver/live/mystream live=1"
-f mpegts udp://127.0.0.1:10000?pkt_size=1316
-f flv rtmp://127.0.0.1/live/myStream
ffmpeg -i /home/mediacluster/mediaroot/video/269_5.mp4 -re -vcodec flv -b:v 500k -s 320x200 -strict experimental -g 25  -me_method zero          -acodec aac -ab 128k -ar 48000 -ac 2 -f flv "rtmp://127.0.0.1/live/video_stream1"
  • FPS="15" # target FPS
  • URL="rtmp://live.justin.tv/app/livestream" #flashver=FMLE/3.0\20(compatible;\20FMSc/1.0)"
ffmpeg -f x11grab -s 720x576 -r "$FPS" -i :0.0  -ab 96k \
   -f alsa -ac 2 -i pulse -vcodec libx264 -crf 30 -preset fast -s "320x200" \
   -acodec libmp3lame -ar 44100 -threads 0 \
   -f flv "$URL"
ffmpeg -re -i /home/mediacluster/mediaroot/video/269_2.flv -f flv -metadata streamName="video_stream1" "tcp://localhost:6666"
ffmpeg  -f video4linux2 -s 720x576 -i /dev/video2  -f flv -metadata streamName="video_stream2" "tcp://localhost:6666"
ffmpeg  -f video4linux2 -r 10 -s 640x360 -i /dev/video0  -f flv -metadata streamName="video_stream3" "tcp://localhost:6666"
ffmpeg  -f video4linux2 -r 10 -s 640x360 -i /dev/video1  -f flv -metadata streamName="video_stream4" "tcp://localhost:6666"
  • ffmpeg
Capture from composite or S-video
ffmpeg -async 12 -vd /dev/video -ad /dev/dsp -f avi -r 25 -s 720x576 -croptop 8 -cropbottom 8 -cropleft 8 \
-cropright 8 -sameq -aspect 4:3 -acodec mp2 -ac 2 -ab 224k -ar 48000 -y -t 04:30:00 outfile.avi


ffmpeg -threads 2 -vd /dev/video$DEV -r 29.97 -b 800 -s 640x480 -vcodec h264 -qmax 51 \
-me epzs -deinterlace -g 300 -async 1 -ac 2 -acodec mp3 -ab 96 -ar 32000 \
-ad /dev/dsp$DEV -t $TIM -f avi -y $DIR/$FIL.avi

Mplayer/Mencoder

    • socks=host:port
    • app=name
    • tcUrl=url
    • pageUrl=url
    • swfUrl=url
    • flashVer=version
    • conn=type:data
      • Append arbitrary AMF data to the Connect message. The type must be B for Boolean, N for number, S for string, O for object, or Z for null. For Booleans the data must be either 0 or 1 for FALSE or TRUE, respectively. Likewise for Objects the data must be 0 or 1 to end or begin an object, respectively. Data items in subobjects may be named, by prefixing the type with 'N' and specifying the name before the value, e.g. NB:myFlag:1. This option may be used multiple times to construct arbitrary AMF sequences. E.g.
    • conn=B:1 conn=S:authMe conn=O:1 conn=NN:code:1.23 conn=NS:flag:ok conn=O:0
    session
    • playpath=path
    • playlist=0|1
    • live=0|1
       Specify that the media is a live stream. No resuming or seeking in live streams is possible. 
    • subscribe=path
    • start=num
    • stop=num
    • buffer=num
    • timeout=num
mencoder -tv driver=v4l2:device=/dev/video$DEV:fps=30000/1001:chanlist=us-bcast:\
audiorate=32000:adevice=/dev/dsp$DEV:input=0:amode=1:normid=4:width=512:height=384 \
-ovc x264 -x264encopts threads=2:bitrate=800:subq=2:me=2:frameref=4:8x8dct \
-oac mp3lame -lameopts cbr:br=96 -endpos $TIM -o $DIR/$FIL.avi tv:// > /dev/null


VLC

  • rtmp server
vlc input.flv --sout '#transcode{vcodec=FLV1,acodec=mp3}:std{access=rtmp,mux=ffmpeg{mux=flv},dst=localhost:1936/live/video_stream1}'
  • UDP multicast
vlc input.mp4 --sout="#std{access=udp,mux=ts,dst=239.255.0.1:1234}" :sout-all
  • something...
vlc -I dummy -vvv rtsp://<RTSP Stream of CRTMP server> vlc://quit --sout=#duplicate{dst=std{access=livehttp{seglen=10,delsegs=true,numsegs=5,index=c:/nginx-1.0.3/html/live/mystream.m3u8,index-url=http://<IP of Webserver>/live/mystream-########.ts},mux=ts{use-key-frames},dst=c:/nginx-1.0.3/html/live/mystream-########.ts},dst=std{access=http,mux=ts,dst=:8090/video.mp4}}


JWplayer

  • some may need this declarations in the .htaccess file:
AddType video/ogg .ogv
AddType video/mp4 .mp4
AddType video/webm .webm

installation

Linux

  • I will build the software in /opt/crtmpserver and install it in /server
  • download source (UPDATE 11/2015, server is down)
svn co --username anonymous https://svn.rtmpd.com/crtmpserver/branches/1.0 crtmpserver
  • some dependencies:
yum install cmake openssl-devel
apt-get install subversion libssl-dev cmake g++ libtinyxml-dev libtinyxml2-dev libsslcommon2-dev
  • do compile the source specifying the prefix you want, /usr/local is the default
cd builders/cmake
cmake -DCRTMPSERVER_INSTALL_PREFIX=/usr/local .
make install
  • now let's go in /usr/local/etc/ and use crtmpserver.lua.sample to generate your crtmpserver.lua changing the rootDirectory=" variable in applications= { /usr/local/lib/crtmpserver/applications
  • install the certificates:
cp /opt/crtmpserver/builders/cmake/applications/appselector/server.* /usr/local/lib/crtmpserver/applications/appselector/
  • link your own media directory (in this case I'm linking the Videos directory located in my home) to the player application media foder:
ln -s ~/Videos /usr/local/lib/crtmpserver/applications/flvplayback/mediaFolder
cp /opt/crtmpserver/builders/cmake/applications/flvplayback/users.lua /usr/local/lib/crtmpserver/applications/flvplayback/


  • it should be possible now to execute the compiled and configured program
  • UPDATE 11/ 2015 (GCC > 4.6)
  • needed to do this sloppy-job to be able to compile, but I'm sure there's a cleaner way.
ln -s /usr/lib/i386-linux-gnu/libssl.so /usr/lib/
ln -s /usr/lib/i386-linux-gnu/libcrypto.so /usr/lib/
ln -s /usr/lib/i386-linux-gnu/libdl.so /usr/lib/

configuration

  • /opt/crtpmserver/configs
all.debug.lua
flvplayback.lua
run.bat
run.sh
users.lua

apps

  • flash streamer application
/opt/crtpmserver/configs/flvplayback.lua


Problems

  • sometimes the server gets stuck and when one tries to start the streaming it fails with a server error (even though the connection to the server works)
1448549708:3:/opt/crtmpserver/sources/thelib/src/application/baseclientapplication.cpp:227:SignalStreamRegistered:Stream NR(76) with name `` registered to application `flvplayback` from protocol IR(75)
1448549708:2:/opt/crtmpserver/sources/thelib/src/protocols/rtmp/basertmpappprotocolhandler.cpp:776:ProcessInvokePublish:Stream name livestream?videoKeyframeFrequency=5&totalDatarate=746 already occupied and application doesn't allow duplicated inbound network streams
1448549708:3:/opt/crtmpserver/sources/thelib/src/application/baseclientapplication.cpp:238:SignalStreamUnRegistered:Stream NR(76) with name `` unregistered from application `flvplayback` from protocol IR(75)

firewall

  • deamon opens the following sockets:
netstat -putan|grep crtmp
tcp        0      0 0.0.0.0:6665                0.0.0.0:*                   LISTEN      13841/crtmpserver   
tcp        0      0 0.0.0.0:6666                0.0.0.0:*                   LISTEN      13841/crtmpserver   
tcp        0      0 0.0.0.0:9999                0.0.0.0:*                   LISTEN      13841/crtmpserver   
tcp        0      0 0.0.0.0:1935                0.0.0.0:*                   LISTEN      13841/crtmpserver   
tcp        0      0 0.0.0.0:8080                0.0.0.0:*                   LISTEN      13841/crtmpserver   
tcp        0      0 0.0.0.0:8081                0.0.0.0:*                   LISTEN      13841/crtmpserver   
tcp        0      0 0.0.0.0:1111                0.0.0.0:*                   LISTEN      13841/crtmpserver   
tcp        0      0 0.0.0.0:1112                0.0.0.0:*                   LISTEN      13841/crtmpserver   
tcp        0      0 0.0.0.0:8988                0.0.0.0:*                   LISTEN      13841/crtmpserver   
tcp        0      0 0.0.0.0:8989                0.0.0.0:*                   LISTEN      13841/crtmpserver  
  • so a generic iptables configuration could be this:
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1935 -j ACCEPT 
-A INPUT -p udp -m state --state NEW -m tcp --dport 8080 -j ACCEPT 

applications

  • application files:
/usr/local/lib64/crtmpserver/applications/admin
/usr/local/lib64/crtmpserver/applications/applestreamingclient
/usr/local/lib64/crtmpserver/applications/appselector
/usr/local/lib64/crtmpserver/applications/flvplayback
/usr/local/lib64/crtmpserver/applications/proxypublish
/usr/local/lib64/crtmpserver/applications/samplefactory
/usr/local/lib64/crtmpserver/applications/stresstest
/usr/local/lib64/crtmpserver/applications/vptests
/usr/local/lib64/crtmpserver/applications/admin/libadmin.so
/usr/local/lib64/crtmpserver/applications/applestreamingclient/libapplestreamingclient.so
/usr/local/lib64/crtmpserver/applications/appselector/libappselector.so
/usr/local/lib64/crtmpserver/applications/appselector/server.crt
/usr/local/lib64/crtmpserver/applications/appselector/server.key
/usr/local/lib64/crtmpserver/applications/flvplayback/libflvplayback.so
/usr/local/lib64/crtmpserver/applications/flvplayback/mediaFolder
/usr/local/lib64/crtmpserver/applications/flvplayback/users.lua
/usr/local/lib64/crtmpserver/applications/proxypublish/libproxypublish.so
/usr/local/lib64/crtmpserver/applications/samplefactory/libsamplefactory.so
/usr/local/lib64/crtmpserver/applications/stresstest/libstresstest.so
/usr/local/lib64/crtmpserver/applications/vptests/libvptests.so

client side

<!DOCTYPE html>
<html>
<head>
  <script>
    function init() {
      enableVideoClicks();
    }

    function enableVideoClicks() {
      var videos = document.getElementsByTagName('video') || [];
      for (var i = 0; i < videos.length; i++) {
        // TODO: use attachEvent in IE
        videos[i].addEventListener('click', function(videoNode) {
          return function() {
            videoNode.play();
          };
        }(videos[i]));
      }
    }
  </script>
</head>
 <body onload="init()" style="margin:0px;position:relative;" >

        <video width=320 height=200 controls  preload="none" autobuffer poster="ColorBarsTT.jpg" >
        Your browser does not support the VIDEO tag and/or RTP streams.
<!--            <source src="http://galalex.org:81/pr7.webm" type='video/webm; codecs="vp8, vorbis"'> -->
                <source src="http://galalex.org:81/743_7.webm" >
                <!-- <source src="http://galalex.org:81/963_1.mp4"  type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'> -->
                <!-- <source src="pr6.ogv"  type='video/ogg; codecs="theora, vorbis"'>  -->
        </video>

  <script type='text/javascript' src='jwplayer.js'></script>
  <script type='text/javascript' >

        jwplayer("video_src1").setup({
        file:   "video_stream1",
        width:  320,
        height: 200,
        streamer:  "rtmp://galalex.org/live",
        provider:"rtmp",
        allowscriptaccess:"always",
        autostart:      'true',
        stretching:     "fill",
        provider:       "rtmp" ,
        image:          "ColorBarsTT.jpg",
        repeat:         'always',
        events:{'onIdle': function(event) {      jwplayer("video_src1").play();}},
        flashplayer:"player.swf",
        });
  </script>
 </body>
</html>

references

  • installing on Gentoo

http://foxpa.ws/2011/10/26/installing-c-rtmp-server-rtmpd-crtmpdserver-on-gentoo/

  • using it

http://wiki.rtmpd.com/tutorial_live_stream_file

  • documentation

http://wiki.rtmpd.com/documentation