Iray Programmer's Manual

RTMP client

The RTMP server supports any RTMP client, the industry standard being the one integrated into Adobe Flash/Flex. The method of connecting to and displaying an RTMP stream from neuray is identical to connecting to any other RTMP server. Adobe Flex 3 will be the example platform used; however, the concepts will transfer to any other platform.

The most convenient way to integrate RTMP stream into a Flex application is to create a new UIComponent which can simply be placed onto your Flex application canvas. This component will need instances of the three standard classes required to stream RTMP video: NetConnection, NetStream and Video.

public class Rs_rtmp_video extends UIComponent { 
  private var m_connection:NetConnection = null; 
  private var m_video:Video = null;
  private var m_stream:NetStream = null; 
  ... 
}

The first thing that is required is to create a connection to the neuray RTMP server in an init() function.

public function init(url:String):void 
{ 
    m_connection = new NetConnection();
    m_connection.addEventListener(NetStatusEvent.NET_STATUS, net_status_handler); 
    m_connection.connect(url); 
}

When the connection is complete (or fails), Flex will call the net_status_handler listener registered in the init() call. This handler can then create the NetStream object and begin displaying the video.

private function net_status_handler(event:NetStatusEvent):void 
{ 
  if (event.info) {
    switch (event.info.code) { 
      case "NetConnection.Connect.Success":
           m_stream = new NetStream(m_connection); 
           m_video = new Video(this.width,this.height); 
           m_video.attachNetStream(m_stream);
           addChild(m_video); 
           m_stream.play("rs_stream"); 
           break; 
      case "NetConnection.Connect.Failed": 
           break; 
    } 
  } 
}

The above implements a fully functional RTMP video streaming client. However, it is not particularly useful as it provides no interaction with neuray. For this we need to use the NetConnection::call interface to call registered RTMP call command message handlers.

The registered call handler is then called via the NetConnection call mechanism:

protected function move_camera(pan_x:Number, pan_y:Number):void 
{ 
     var arguments:Object = new Object();
     arguments["pan_x"] = pan_x; 
     arguments["pan_y"] = pan_y;
     m_connection.call("move_camera",null,arguments); 
}

The move_camera function would typically be called in reaction to mouse movement events.

The server side C++ application handler code for the above command call would look something like the code snippet below and would be registered on the server side as a call command handler using the Iray API method mi::rtmp::IConnection::register_remote_call_handler() on the mi::rtmp::IConnection interface.

class Call_event_handler : public
    mi::base::Interface_implement<mi::rtmp::ICall_event_handler>
{ 
public: 
    bool handle( 
        const char* procedure_name, 
        const mi::IData* command_arguments, 
        const mi::IData* user_arguments, 
        mi::IData** response_arguments) 
    { 
        // Get the x and y coordinates from the user_argument and 
        // reposition the camera. 
        ... 
        return true; 
    } 
};

The examples included in the distribution include a complete flash client implementation with commented source code. This, together with the example RTMP application server source code provides a great start for building video streaming solutions.

Note: Some older Adobe Flash clients on Linux, for example 9.0.124, cannot show the delivered video frames fast enough which severely degrades the interactivity. The client version is provided as a command argument to the connect event handler in the field flashVer and it is recommended to check this variable and either lower the frame rate or recommend an Adobe Flash client upgrade to users with old Flash clients.