package org.red5.client;
import java.util.Map;
import org.red5.client.net.rtmp.ClientExceptionHandler;
import org.red5.client.net.rtmp.RTMPClient;
import org.red5.client.util.PropertiesReader;
import org.red5.io.utils.ObjectMap;
import org.red5.server.api.event.IEvent;
import org.red5.server.api.event.IEventDispatcher;
import org.red5.server.api.service.IPendingServiceCall;
import org.red5.server.api.service.IPendingServiceCallback;
import org.red5.server.net.rtmp.Channel;
import org.red5.server.net.rtmp.RTMPConnection;
import org.red5.server.net.rtmp.event.Notify;
import org.red5.server.net.rtmp.event.Ping;
import org.red5.server.net.rtmp.message.Header;
import org.red5.server.net.rtmp.status.StatusCodes;
public class ClientTest extends RTMPClient {
private static boolean finished = false;
public static void main(String[] args) throws InterruptedException {
final ClientTest player = new ClientTest();
player.setConnectionClosedHandler(new Runnable() {
@Override
public void run() {
System.out.println("Connection closed");
}
});
// decide whether or not the source is live or vod
//player.setLive(true);
// connect
player.connect();
do {
Thread.sleep(1000L);
} while (!finished);
System.out.println("Ended");
}
public void connect() {
setExceptionHandler(new ClientExceptionHandler() {
@Override
public void handleException(Throwable throwable) {
throwable.printStackTrace();
}
});
setStreamEventDispatcher(streamEventDispatcher);
connect(PropertiesReader.getProperty("server"), Integer.valueOf(PropertiesReader.getProperty("port")), PropertiesReader.getProperty("app"), connectCallback);
}
private IEventDispatcher streamEventDispatcher = new IEventDispatcher() {
@Override
public void dispatchEvent(IEvent event) {
System.out.println("ClientStream.dispachEvent()" + event.toString());
}
};
private IPendingServiceCallback methodCallCallback = new IPendingServiceCallback() {
@Override
public void resultReceived(IPendingServiceCall call) {
System.out.println("methodCallCallback");
Map<?, ?> map = (Map<?, ?>) call.getResult();
System.out.printf("Response %s\n", map);
}
};
private IPendingServiceCallback connectCallback = new IPendingServiceCallback() {
@Override
public void resultReceived(IPendingServiceCall call) {
System.out.println("connectCallback");
ObjectMap<?, ?> map = (ObjectMap<?, ?>) call.getResult();
String code = (String) map.get("code");
System.out.printf("Response code: %s\n", code);
if ("NetConnection.Connect.Rejected".equals(code)) {
System.out.printf("Rejected: %s\n", map.get("description"));
disconnect();
finished = true;
} else if ("NetConnection.Connect.Success".equals(code)) {
invoke("demoService.getListOfAvailableFLVs", new Object[] {}, methodCallCallback);
createStream(createStreamCallback);
}
}
};
private IPendingServiceCallback createStreamCallback = new IPendingServiceCallback() {
@Override
public void resultReceived(IPendingServiceCall call) {
Number streamId = (Number) call.getResult();
// live buffer 0.5s / vod buffer 4s
if (Boolean.valueOf(PropertiesReader.getProperty("live"))) {
conn.ping(new Ping(Ping.CLIENT_BUFFER, streamId, 500));
play(streamId, PropertiesReader.getProperty("name"), -1, -1);
} else {
conn.ping(new Ping(Ping.CLIENT_BUFFER, streamId, 4000));
play(streamId, PropertiesReader.getProperty("name"), 0, -1);
}
}
};
@SuppressWarnings("unchecked")
protected void onCommand(RTMPConnection conn, Channel channel, Header header, Notify notify) {
super.onCommand(conn, channel, header, notify);
System.out.println("onInvoke - header: " + header.toString() + " notify: " + notify.toString());
Object obj = notify.getCall().getArguments().length > 0 ? notify.getCall().getArguments()[0] : null;
if (obj instanceof Map) {
Map<String, String> map = (Map<String, String>) obj;
String code = map.get("code");
if (StatusCodes.NS_PLAY_STOP.equals(code)) {
finished = true;
disconnect();
System.out.println("Disconnected");
}
}
}
}