msgbartop
Various ramblings-on, mostly about Red5
msgbarbottom

07 Apr 09 On-demand room / scope creation

I am not sure how or if FMS provides a means for dynamic rooms, but Red5 does and I will try to explain how to use it below. For the following example, you should expect the following url – rtmp://localhost/myapp/room is being used. The method below is an overridden super class method from the Red5 application adapter. The example places a client into an id based “chat” room; the id algorithm could be anything you desire and is not fixed. I have used this block in a couple projects, one of which used an encrypted room and id portion and its url looked similar to this – rtmp://localhost/myapp/29c8109abd29e

	@Override
	public boolean roomJoin(IClient client, IScope scope) {
		log.debug("roomJoin - client id: {} scope: {}", client.getId(), scope);
		
		IConnection conn = Red5.getConnectionLocal();

		String scopeName = scope.getName();
		log.debug("Scope name: {}", scopeName);
		
		//check for "application" scope
		if ("myapp".equals(scopeName)) {
			log.debug("Connection already connected to app scope");
		} else if (conn.hasAttribute("in.room")) {
			//client is already in a room
			log.debug("Connection already connected to room scope");
		} else {
			//the room name
			String roomName = scopeName;						
			//set flag
			conn.setAttribute("in.room", true);
			//get app scope
			IScope appScope = scope.getParent();
			//handle at room level
			if ("room".equals(roomName)) {
				//lookup room (top level)
				IScope roomScope = ScopeUtils.resolveScope(appScope, roomName);
				if (roomScope == null) {
					if (appScope.createChildScope(roomName)) {
						log.debug("Room {} created", roomName);
						roomScope = appScope.getScope(roomName);
					} else {
						log.warn("Room {} was not created", roomName);
					}
				} else {
					log.debug("Room scope {} was found", roomName);
				}				
				//get the next room identifier
				String chatId = getNextChatId();
				//room for chat id
				IScope chatScope = ScopeUtils.resolveScope(roomScope, chatId);
				if (chatScope == null) {
					if (roomScope.createChildScope(chatId)) {
						log.debug("Chat scope {} created", chatId);
						chatScope = roomScope.getScope(chatId);
					} else {
						log.warn("Chat scope {} was not created", chatId);
					}
				} else {
					log.debug("Chat scope {} was found", chatId);
				}				
				   								
				//send the actual join
				return roomJoin(client, chatScope);
			} else {
				return false;
			}
		}
		
		return super.roomJoin(client, scope);
	}

After this block is executed, your client would be connected to something like this – rtmp://localhost/myapp/room/1001 without having to create any additional NetConnections. The method “getNextChatId()” is meant to provide a chat room id, based on whatever criteria you would like.

Tags: , , , , , ,


Fatal error: Call to undefined function akismet_counter() in C:\xampp\htdocs\paulgregoireblog\wp-content\themes\googlechrome\footer.php on line 9