[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