package org.red5.client.net.rtmp; import java.util.concurrent.atomic.AtomicBoolean; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.red5.io.utils.ObjectMap; import org.red5.server.api.Red5; 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.RTMPConnection; import org.red5.server.net.rtmp.event.Notify; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Tests for connecting to servers. * <pre> * rtmpdump -V -z -r "rtmp://a.rtmp.youtube.com/live2" -a "live2" -y "<your stream name here>" -v -f "WIN 11,2,202,235" * </pre> * * @author Paul Gregoire (mondain@gmail.com) */ public class YouTubeConnectTest { private Logger log = LoggerFactory.getLogger(YouTubeConnectTest.class); private AtomicBoolean finished = new AtomicBoolean(false); @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } @Test public void testYouTubePublish() throws InterruptedException { log.info("\ntestYouTubePublish"); String youtubeHost = "a.rtmp.youtube.com"; int youtubePort = 1935; String youtubeApp = "live2"; final String youtubePublishName = "dybx-y3ph-uqzx-30vx"; //System.getProperty("youtube.streamname"); log.info("youtubePublishName: {}", youtubePublishName); // if (youtubePublishName == null) { // log.info("You forgot to set a 'youtube.streamname' system property"); // return; // } final RTMPClient client = new RTMPClient(); client.setConnectionClosedHandler(new Runnable() { @Override public void run() { log.info("Test - exit"); } }); client.setExceptionHandler(new ClientExceptionHandler() { @Override public void handleException(Throwable throwable) { throwable.printStackTrace(); } }); client.setStreamEventDispatcher(new IEventDispatcher() { @Override public void dispatchEvent(IEvent event) { log.info("ClientStream.dispachEvent: {}", event); } }); final INetStreamEventHandler netStreamEventHandler = new INetStreamEventHandler() { @Override public void onStreamEvent(Notify notify) { log.info("ClientStream.onStreamEvent: {}", notify); } }; client.setStreamEventHandler(netStreamEventHandler); IPendingServiceCallback connectCallback = new IPendingServiceCallback() { @Override public void resultReceived(IPendingServiceCall call) { log.info("connectCallback"); ObjectMap<?, ?> map = (ObjectMap<?, ?>) call.getResult(); String code = (String) map.get("code"); log.info("Response code: {}", code); if ("NetConnection.Connect.Rejected".equals(code)) { System.out.printf("Rejected: %s\n", map.get("description")); client.disconnect(); finished.set(true); } else if ("NetConnection.Connect.Success".equals(code)) { client.createStream(new IPendingServiceCallback() { @Override public void resultReceived(IPendingServiceCall call) { double streamId = (Double) call.getResult(); // live buffer 0.5s @SuppressWarnings("unused") RTMPConnection conn = (RTMPConnection) Red5.getConnectionLocal(); //conn.ping(new Ping(Ping.CLIENT_BUFFER, streamId, 500)); //client.play(streamId, youtubePublishName, -1, -1); client.publish(streamId, youtubePublishName, "live", netStreamEventHandler); } }); // push data out for the publish //test(); } } }; // connect client.connect(youtubeHost, youtubePort, youtubeApp, connectCallback); Thread.currentThread().join(30000L); client.disconnect(); log.info("Test - end"); } //@Test public void testLocalhostRed5Publish() throws InterruptedException { log.info("\ntestLocalhostRed5Publish"); String host = "localhost"; int port = 1935; // check to see if a server is listening on 1935 before proceeding String app = "live"; final String publishName = "test"; final RTMPClient client = new RTMPClient(); client.setConnectionClosedHandler(new Runnable() { @Override public void run() { log.info("Test - exit"); } }); client.setExceptionHandler(new ClientExceptionHandler() { @Override public void handleException(Throwable throwable) { throwable.printStackTrace(); } }); client.setStreamEventDispatcher(new IEventDispatcher() { @Override public void dispatchEvent(IEvent event) { log.info("ClientStream.dispachEvent() {}", event); } }); final INetStreamEventHandler netStreamEventHandler = new INetStreamEventHandler() { @Override public void onStreamEvent(Notify notify) { log.info("ClientStream.dispachEvent() {}", notify); } }; client.setStreamEventHandler(netStreamEventHandler); IPendingServiceCallback connectCallback = new IPendingServiceCallback() { @Override public void resultReceived(IPendingServiceCall call) { log.info("connectCallback"); ObjectMap<?, ?> map = (ObjectMap<?, ?>) call.getResult(); String code = (String) map.get("code"); log.info("Response code: {}", code); if ("NetConnection.Connect.Rejected".equals(code)) { System.out.printf("Rejected: %s\n", map.get("description")); client.disconnect(); finished.set(true); } else if ("NetConnection.Connect.Success".equals(code)) { client.createStream(new IPendingServiceCallback() { @Override public void resultReceived(IPendingServiceCall call) { int streamId = (Integer) call.getResult(); // live buffer 0.5s @SuppressWarnings("unused") RTMPConnection conn = (RTMPConnection) Red5.getConnectionLocal(); //conn.ping(new Ping(Ping.CLIENT_BUFFER, streamId, 500)); //client.play(streamId, youtubePublishName, -1, -1); client.publish(streamId, publishName, "live", netStreamEventHandler); } }); // push data out for the publish //test(); } } }; // connect client.connect(host, port, app, connectCallback); Thread.currentThread().join(30000L); client.disconnect(); log.info("Test - end"); } }