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

📄 transmit.java

📁 It is Java for SIP phone
💻 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 + -