[Red5] java - Simulate live streaming from file

gio2375 gio2375 at hotmail.com
Fri Dec 19 10:52:44 PST 2008


Hi all,

I need to simulate a live streming channel using a flv file. The following
code is my first atempt.
To test it I run the code and with red5 "Simple Subscriber" demo I connected
to rtmp://localhost/oflaDemo (default address) while code is running but,
nothing appears. It is correct, or I have to indicate in the url, in some
way, the stream name ("red5SreamDemo" in my case)?

I know the code is wrong. Probably, since the event must be 'live', I need a
way to send the stream respetting the timing (and then live video). Besides,
would be nice to repeat the video when the end is reached.

Thnaks
Giovanni


import java.io.File;

import org.red5.io.ITagReader;
import org.red5.io.flv.IFLV;
import org.red5.io.flv.impl.FLVService;
import org.red5.io.object.Deserializer;
import org.red5.io.object.Serializer;
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.cache.NoCacheImpl;
import org.red5.server.net.rtmp.RTMPClient;
import org.red5.server.net.rtmp.RTMPConnection;
import org.red5.server.net.rtmp.RTMPClient.INetStreamEventHandler;
import org.red5.server.net.rtmp.codec.RTMP;
import org.red5.server.net.rtmp.event.IRTMPEvent;
import org.red5.server.net.rtmp.event.Notify;
import org.red5.server.net.rtmp.status.StatusCodes;
import org.red5.server.stream.FileStreamSource;
import org.red5.server.stream.message.RTMPMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class MyRTMPClientLive extends RTMPClient implements
INetStreamEventHandler, IPendingServiceCallback, IEventDispatcher
{

	private static final Logger logger =
LoggerFactory.getLogger(MyRTMPClientUploader.class);

	private int streamId;
	String host = "localhost";
	//String host = "192.168.1.169";
	String app = "oflaDemo";
	int port = 1935;


	public MyRTMPClientLive() {
		super();

		logger.debug("connecting, host: " + host + ", app: " + app + ", port: " +
port);
		connect(host, port, app, this);
		logger.debug("done.");
	}

	@Override
	public void connectionClosed(RTMPConnection conn, RTMP state) {
		logger.debug("connection closed");
		super.connectionClosed(conn, state);
		System.exit(0);
	}

	@Override
	public void createStream(IPendingServiceCallback callback) {
		super.createStream(callback);
		logger.debug("create stream");
		//invoke("createStream", this);
	}


	@Override
	public void dispatchEvent(IEvent eve) {
		logger.debug("dispatchEvent : " + eve);

	}



	@Override
	public void onStreamEvent(Notify notify) {
		logger.debug("onStreamEvent - " + notify);



		if (notify.getCall().getServiceMethodName().equals("onStatus")) {

			ObjectMap<String, String> map = (ObjectMap)
notify.getCall().getArguments()[0];
			String code = (String) map.get("code");
			String description = (String) map.get("description");
			String details = (String) map.get("details");


			if (StatusCodes.NS_PUBLISH_START.equals(code)) {
				log.debug("{} for {}", new Object[]{code,details});

				FLVService service = new FLVService();
				service.setSerializer(new Serializer());
				service.setDeserializer(new Deserializer());

				log.info("Started Publishing");

			    // Read In File And Publish The Data !!
				try {
						//File f = new File("C:/dev/workspace/MMAWeb/teststreams/earth.flv");
						File f = new File("C:/dev/workspace/MMAWeb/teststreams/video.flv");
						log.debug("test: {}", f);

						IFLV flv = (IFLV) service.getStreamableFile(f);
						flv.setCache(NoCacheImpl.getInstance());

						ITagReader reader = flv.getReader();

						FileStreamSource src = new FileStreamSource(reader);

						while (src.hasMore())
						{
							IRTMPEvent event = src.dequeue();
							RTMPMessage rtmpMsg = new RTMPMessage();
					        rtmpMsg.setBody(event);

					        publishStreamData(streamId, rtmpMsg);
						}
									
						System.out.println("\n\nEnd!!!!!!!!!!");

						
						//disconnect();
						//deleteStream(streamId, this);
						//unpublish(streamId);

				} catch (Exception ex) {
					log.error(ex.getCause().toString());
					ex.printStackTrace();
				}
			}

			if (StatusCodes.NS_PLAY_STOP.equals(code)) {
				logger.debug("onStatus code == NetStream.Play.Stop, disconnecting");
				disconnect();
			}
		}

	}




	@Override
	synchronized public void resultReceived(IPendingServiceCall call) {
		logger.debug("service call result: " + call);

		Object result = call.getResult();

		if (result instanceof ObjectMap) {
			if ("connect".equals(call.getServiceMethodName())) {
				log.info("Connected");
				createStream(this);
			}
		}
		else {
			if ("createStream".equals(call.getServiceMethodName())) {
				if (result instanceof Integer) {
					Integer streamIdInt = (Integer) result;
					streamId = streamIdInt.intValue();
					log.debug("createStream result stream id: " + streamId);
					publish(streamId, "red5SreamDemo", "live", this);
					log.debug("live stream: " + streamId);
				} else {
					log.debug("DISCONNECT!!!!!");
					disconnect();
				}
			}
		}
	}





	/**
	 * MAIN
	 * @param args
	 */
	public static void main(String[] args) {

		new MyRTMPClientUploader();

	}


}

-- 
View this message in context: http://www.nabble.com/java---Simulate-live-streaming-from-file-tp21096515p21096515.html
Sent from the Red5 - English mailing list archive at Nabble.com.




More information about the Red5 mailing list