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.


