⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 transmit.java

📁 是一个用java实现的
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
                        }
                    }
                    if(chosen!=null){
                        tracks[i].setFormat(chosen);                
                        System.err.println("Track " + i + " is set to transmit as:");
                        System.err.println("  " + chosen);
                        atLeastOneTrack = true;
                    }
                } else
                    tracks[i].setEnabled(false);
            } else
                tracks[i].setEnabled(false);
        }

        if (!atLeastOneTrack)
            return "Couldn't set any of the tracks to a valid RTP format";

        // Realize the processor. This will internally create a flow
        // graph and attempt to create an output datasource for JPEG/RTP
        // audio frames.
        result = stateListener.waitForState(processor, Controller.Realized);
        if (result == false)
            return "Couldn't realize processor";

        // Set the JPEG quality to .5.
        setJPEGQuality(processor, 0.25f);

        // Get the output data source of the processor
        dataOutput = processor.getDataOutput();

        return null;
    }


    /**
     * Use the RTPManager API to create sessions for each media 
     * track of the processor.
     */
    private String createTransmitter(String localIpAddress) {

        // Cheated.  Should have checked the type.
        PushBufferDataSource pbds = (PushBufferDataSource)dataOutput;
        PushBufferStream pbss[] = pbds.getStreams();

        rtpMgrs = new RTPManager[pbss.length];
        SessionAddress localAddr, destAddr;
        InetAddress ipAddr;
        SendStream sendStream;
        int localPort;
        int destPort;
        SourceDescription srcDesList[];

        for (int i = 0; i < pbss.length; i++) {
            try {
                //New instance of RTPManager
                //to handle the RTP and RTCP transmission
                rtpMgrs[i] = RTPManager.newInstance();	                    

                destPort = sessionDescription.getDestinationPort() + 2*i;
                ipAddr = InetAddress.getByName(sessionDescription.getAddress());
                destAddr = new SessionAddress( ipAddr, destPort);

                localPort = sessionDescription.getLocalPort() + 2*i;
                localAddr = new SessionAddress( 
                	InetAddress.getByName(localIpAddress),
                    localPort);
                //Establishing the connection with the remote host 
                //with the chosen underlying protocol to RTP (either UDP or TCP)
                if(sessionDescription.getTransportProtocol().toLowerCase().equals("tcp")){
                    if(receiver==null){
                        boolean connected=false;
                        System.out.println("Trying to connect to "+ipAddr+"/"+destPort);
                        //Trying to connect to the TCP Port of the remote host to establish a RTP connection
                        while(!connected){
                            try{
                                socketRTPTransmit = new Socket(ipAddr,destPort);
                                System.out.println("Socket connected to "+ipAddr+
                                                    " on port "+destPort);
                                connected=true;
                            }
                            catch(IOException ioe){

                            }
                        }
                        connected=false;
                        int rtcpDestPort=destPort+1;
                        int rtcpLocalPort=localPort+1;
                        System.out.println("Trying to connect to "+ipAddr+"/"+rtcpDestPort);
                        //Trying to connect to the TCP Port of the remote host to establish a RTCP connection
                        while(!connected){
                            try{
                                socketRTCPTransmit = new Socket(ipAddr, rtcpDestPort);	    
                                System.out.println("Control Socket connected to "+ipAddr+
                                                    " on port "+rtcpDestPort);
                                connected=true;
                            }
                            catch(IOException ioe){

                            }
                        }                             
                    }
                    else{
                        socketRTPTransmit=receiver.getSocketRTPReceiver();
                        socketRTCPTransmit=receiver.getSocketRTCPReceiver();
                    }
                    rtpMgrs[i].initialize( new TCPSendAdapter(socketRTPTransmit,socketRTCPTransmit));
                }
                else{
					SessionAddress localAddress = new SessionAddress(
						InetAddress.getByName(localIpAddress),
						destPort);
					rtpMgrs[i].initialize(localAddress);
					SessionAddress destAddress = new SessionAddress(
							InetAddress.getByName(sessionDescription.getAddress()), 
							destPort);                
					rtpMgrs[i].addTarget(destAddress);																	                	
                }
                System.err.println( 
					"Created RTP session: " + 
					sessionDescription.getAddress()+ 
					" dest "+ 
					destPort);
                //Start the transmission with the remote host
                sendStream = rtpMgrs[i].createSendStream(dataOutput, i);		
                sendStream.start();

            } catch (Exception  e) {
                e.printStackTrace();
            }
        }

        return null;
    }


    /**
     * For JPEG and H263, we know that they only work for particular
     * sizes.  So we'll perform extra checking here to make sure they
     * are of the right sizes.
     */
    private Format checkForVideoSizes(Format original, Format supported) {

        int width, height;
        Dimension size = ((VideoFormat)original).getSize();
        Format jpegFmt = new Format(VideoFormat.JPEG_RTP);
        Format h263Fmt = new Format(VideoFormat.H263_RTP);

        if (supported.matches(jpegFmt)) {
            // For JPEG, make sure width and height are divisible by 8.
            width = (size.width % 8 == 0 ? size.width :
                            (int)(size.width / 8) * 8);
            height = (size.height % 8 == 0 ? size.height :
                            (int)(size.height / 8) * 8);
        } else if (supported.matches(h263Fmt)) {
            // For H.263, we only support some specific sizes.
            if (size.width < 128) {
            width = 128;
            height = 96;
            } else if (size.width < 176) {
            width = 176;
            height = 144;
            } else {
            width = 352;
            height = 288;
            }
        } else {
            // We don't know this particular format.  We'll just
            // leave it alone then.
            return supported;
        }

        return (new VideoFormat(null, 
                                new Dimension(width, height), 
                                Format.NOT_SPECIFIED,
                                null,
                                Format.NOT_SPECIFIED)).intersects(supported);
    }


    /**
     * Setting the encoding quality to the specified value on the JPEG encoder.
     * 0.5 is a good default.
     */
    void setJPEGQuality(Player p, float val) {

        Control cs[] = p.getControls();
        QualityControl qc = null;
        VideoFormat jpegFmt = new VideoFormat(VideoFormat.JPEG);


        // Loop through the controls to find the Quality control for
        // the JPEG encoder.
        for (int i = 0; i < cs.length; i++) {
            if (cs[i] instanceof QualityControl && cs[i] instanceof Owned) {
                Object owner = ((Owned)cs[i]).getOwner();

                // Check to see if the owner is a Codec.
                // Then check for the output format.
                if (owner instanceof Codec) {
                    Format fmts[] = ((Codec)owner).getSupportedOutputFormats(null);
                    for (int j = 0; j < fmts.length; j++) {
                    if (fmts[j].matches(jpegFmt)) {
                        qc = (QualityControl)cs[i];
                        qc.setQuality(val);
                        System.err.println("- Setting quality to " + 
                                val + " on " + qc);
                        break;
                    }
                }
            }
            if (qc != null)
                break;
            }
        }
    }
    /**
     * Start the RTP transmission
     */
    public void transmit(String localIpAddress){
        Format fmt = null;
        int i = 0;
		
        // Start the transmission
        String result = this.start(localIpAddress);

        // result will be non-null if there was an error. The return
        // value is a String describing the possible error. Print it.
        if (result != null) {
            System.err.println("Error : " + result);
            //System.exit(0);
        }

        System.err.println("Start transmission... ");
    }       
    
    public Socket getSocketRTPTransmit(){
        return socketRTPTransmit;
    }
    
    public Socket getSocketRTCPTransmit(){
        return socketRTCPTransmit;
    }
    /****************************************************************
     * Sample Usage for AVTransmit class                            *
     ****************************************************************/
    public static void main(String [] args) {
        if (args.length < 1) {
            prUsage();
        }

        // Create a transmit object with the specified params.
        Transmit transmit = new Transmit(args[0]);
        // Start the media transmission
        String result = transmit.start("127.0.0.1");

        // result will be non-null if there was an error. The return
        // value is a String describing the possible error. Print it.
        if (result != null) {
            System.err.println("Error : " + result);
            //System.exit(0);
        }

        System.err.println("Start transmission for 60 seconds...");

        // Transmit for 60 seconds and then close the processor
        // This is a safeguard when using a capture data source
        // so that the capture device will be properly released
        // before quitting.
        // The right thing to do would be to have a GUI with a
        // "Stop" button that would call stop on AVTransmit2
        try {
            Thread.sleep(60000);
        } catch (InterruptedException ie) {
            ie.printStackTrace();
        }

        // Stop the transmission
        transmit.stop();

        System.err.println("...transmission ended.");
    }


    static void prUsage() {
        System.err.println("Usage: AVTransmit <IPAddress>/<LocalPort>/<DestPort>");
        //System.exit(0);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -