RTMP java Client for video publishing
Hi all,
I'm trying to write a simple java client to publish a video.
This is my simple class:
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 MyRTMPClientUploader extends RTMPClient implements INetStreamEventHandler, IPendingServiceCallback, IEventDispatcher
{
private static final Logger logger = LoggerFactory.getLogger(MyRTMPClientUploader.class);
private int streamId;
String host = "localhost";
String app = "oflaDemo";
int port = 1935;
public MyRTMPClientUploader() {
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:/Sviluppo/Workspace/MMAWeb/teststreams/earth.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("\nEND!!!!!!!!!!");
disconnect();
//deleteStream(streamId, this);
//unpublish(streamId);
} catch (Exception ex) {
log.error(ex.getCause().toString());
}
}
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, "testgio2", "live", this);
log.debug("published stream: " + streamId);
} else {
log.debug("DISCONNECT!!!!!");
disconnect();
}
}
}
}
/**
* MAIN
* @param args
*/
public static void main(String[] args) {
new MyRTMPClientUploader();
}
}
It seems to do somethings and seems end without errors but i can't find any video if I open ofla_demo application.
Can someone help me?
Thanks
Giovanni