« Return to Thread: RTMP java Client for video publishing

RTMP java Client for video publishing

by gio2375 :: Rate this Message:

| View in Thread

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

 « Return to Thread: RTMP java Client for video publishing