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

📄 traandrec.java

📁 java语音聊天系统 分为服务器端 客户端 连接之后 既可以相互通信 包括语音 摄像头
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package Video;

/*
 * TranAndRec.java	21/06/07
 * author: Max
 * MSN: zengfc@21cn.com
 * QQ: 22291911
 * Email: zengfc@21cn.com
 *
 */

import java.awt.*;
import java.io.IOException;
import java.net.*;
import java.util.Vector;

import javax.media.*;
import javax.media.control.QualityControl;
import javax.media.control.TrackControl;
import javax.media.format.VideoFormat;
import javax.media.protocol.ContentDescriptor;
import javax.media.protocol.DataSource;
import javax.media.rtp.*;
import javax.media.rtp.event.*;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TraAndRec implements ReceiveStreamListener, SessionListener,
        ControllerListener {

    String ipAddress;
    String serverAddr;
    String name;
    int serverPort;
    int localPort;
    int destCtrlPort;
    int destAudioDataPort;
    int destAudioCtrlPort;
    int destVideoDataPort;
    int destVideoCtrlPort;
    int ttl;
    boolean isMulticastAddress = false;
    boolean hasServer = false;

    MediaLocator audioCapDevLoc;
    MediaLocator videoCapDevLoc;
    Processor audioProcessor = null;
    Processor videoProcessor = null;
    DataSource audioDataOutput = null;
    DataSource videoDataOutput = null;
    RTPManager audioRTPMgr;
    RTPManager videoRTPMgr;
    TrackControl audioTracks[] = null;
    TrackControl videoTracks[] = null;
    boolean initAudioProcessorOK = false;
    boolean initVideoProcessorOK = false;

    DatagramSocket managerSock;
    DatagramSocket audioDataSock;
    DatagramSocket audioCtrlSock;
    DatagramSocket videoDataSock;
    DatagramSocket videoCtrlSock;

    ChatFrame chatFrame;
    Vector playerWindows = null;

    boolean dataReceived = false;
    Object dataSync = new Object();

    public TraAndRec(MediaLocator audioCapDevLoc, MediaLocator videoCapDevLoc,
                     String name, boolean hasServer, String serverAddr,
                     int serverPort,
                     ChatFrame chatFrame) throws SocketException {

        this.audioCapDevLoc = audioCapDevLoc;
        this.videoCapDevLoc = videoCapDevLoc;
        this.name = name;
        this.hasServer = hasServer;
        this.serverAddr = serverAddr;
        this.serverPort = serverPort;
        this.localPort = 23432;
        this.chatFrame = chatFrame;

        playerWindows = new Vector();
        UDPConnect();
    }

    public void setDestAddressAndPort(String ipAddress, int destCtrlPort,
                                      int destAudioDataPort,
                                      int destAudioCtrlPort,
                                      int destVideoDataPort,
                                      int destVideoCtrlPort) {
        this.ipAddress = ipAddress;
        this.destCtrlPort = destCtrlPort;
        this.destAudioDataPort = destAudioDataPort;
        this.destAudioCtrlPort = destAudioCtrlPort;
        this.destVideoDataPort = destVideoDataPort;
        this.destVideoCtrlPort = destVideoCtrlPort;
    }

    public void setMulticastAndTTL(int ttl) {
        this.isMulticastAddress = true;
        this.ttl = ttl;
    }

    public void UDPConnect() throws SocketException {

        managerSock = new DatagramSocket(localPort);
        audioDataSock = new DatagramSocket();
        audioCtrlSock = new DatagramSocket();
        videoDataSock = new DatagramSocket();
        videoCtrlSock = new DatagramSocket();

        if (hasServer) {//如果需要服务器
            new UDPTransmit(managerSock, "1 " + name, serverAddr, serverPort, false).
                    start();
            new UDPTransmit(audioDataSock, "2 " + name, serverAddr, serverPort, false).
                    start();
            new UDPTransmit(audioCtrlSock, "3 " + name, serverAddr, serverPort, false).
                    start();
            new UDPTransmit(videoDataSock, "4 " + name, serverAddr, serverPort, false).
                    start();
            new UDPTransmit(videoCtrlSock, "5 " + name, serverAddr, serverPort, false).
                    start();

            new UDPTransmit(managerSock, "7 " + name, serverAddr, serverPort, true).
                    start();
            new UDPTransmit(audioDataSock, "7 " + name, serverAddr, serverPort, true).
                    start();
            new UDPTransmit(audioCtrlSock, "7 " + name, serverAddr, serverPort, true).
                    start();
            new UDPTransmit(videoDataSock, "7 " + name, serverAddr, serverPort, true).
                    start();
            new UDPTransmit(videoCtrlSock, "7 " + name, serverAddr, serverPort, true).
                    start();

            new UDPReceive(managerSock, chatFrame).start();

        } else {//如果不需要服务器
            String msg = name + ":" + getLocalAddress() + ":" +
                         managerSock.getLocalPort() + ":" +
                         audioDataSock.getLocalPort() + ":" +
                         audioCtrlSock.getLocalPort() + ":" +
                         videoDataSock.getLocalPort() + ":" +
                         videoCtrlSock.getLocalPort();
            new UDPTransmit(managerSock, "0 " + msg, "255.255.255.255",
                            managerSock.getLocalPort(), false).start();
            new UDPReceive(managerSock, chatFrame, msg).start();
        }
    }

    public void needConnect(String msg) {
        new UDPTransmit(managerSock, "2 " + msg, ipAddress, destCtrlPort, false).
                start();
    }

    public void sayBye() {
        if (hasServer) {
            new UDPTransmit(managerSock, "6 " + name, serverAddr, serverPort, false).
                    start();
        } else {
            new UDPTransmit(managerSock, "6 " + name + ":" + getLocalAddress(),
                            "255.255.255.255", localPort, false).start();
        }
    }

    public synchronized String startAudioTransmit() {
        System.err.println("  - Open audio RTP session for: addr: " + ipAddress +
                           " localPort: " + audioDataSock.getLocalPort() +
                           " destPort: " + destAudioDataPort);

        String result;
        result = createAudioDataOutput();
        if (result != null) {
            System.out.println(result);
        }

        result = createAudioRTPMgrs();
        if (result != null) {
            return result;
        }
        if (audioProcessor != null) {

            audioProcessor.start();
        }
        return null;
    }

    public synchronized String startVideoTransmit() {
        System.err.println("  - Open video RTP session for: addr: " + ipAddress +
                           " localPort: " + videoDataSock.getLocalPort() +
                           " destPort: " + destVideoDataPort);

        String result;
        result = createVideoDataOutput();
        if (result != null) {
            System.out.println(result);
        }

        result = createVideoRTPMgrs();
        if (result != null) {
            return result;
        }
        if (videoProcessor != null) {

            videoProcessor.start();
        }
        return null;
    }

    public void closeTransmit() {
        synchronized (this) {
            if (audioProcessor != null) {
                audioProcessor.stop();
                audioRTPMgr.removeSessionListener(this);
                audioRTPMgr.removeReceiveStreamListener(this);
                audioRTPMgr.removeTargets("Session ended.");
            }
            if (videoProcessor != null) {
                videoProcessor.stop();
                if (videoRTPMgr != null) {
                    videoRTPMgr.removeSessionListener(this);
                    videoRTPMgr.removeReceiveStreamListener(this);
                    videoRTPMgr.removeTargets("Session ended.");
                }
            }
            for (int i = 0; i < playerWindows.size(); i++) {
                try {
                    ((PlayerWindow) playerWindows.elementAt(i)).close();
                } catch (Exception e) {}
            }
            playerWindows.removeAllElements();
        }
    }

    public void closeVideoTransmit() {
        synchronized (this) {
            if (videoProcessor != null) {
                videoProcessor.stop();
                videoRTPMgr.removeSessionListener(this);
                videoRTPMgr.removeReceiveStreamListener(this);
                videoRTPMgr.removeTargets("Session ended.");
            }
        }
    }

    public String initAudioProcessor() {
        if (audioCapDevLoc == null) {
            return "Audio capture device locator is null";
        }

        DataSource ds;
        try {
            ds = Manager.createDataSource(audioCapDevLoc);
        } catch (Exception e) {
            return "Couldn't create DataSource";
        }

        try {
            audioProcessor = Manager.createProcessor(ds);
        } catch (NoProcessorException npe) {
            return "Couldn't create processor";
        } catch (IOException ioe) {
            return "IOException creating processor";
        }

        boolean result = waitForState(audioProcessor, Processor.Configured);
        if (result == false) {
            return "Couldn't configure processor";
        }

        audioProcessor.setContentDescriptor(new ContentDescriptor(
                ContentDescriptor.RAW_RTP));

        audioTracks = audioProcessor.getTrackControls();
        if (audioTracks == null || audioTracks.length < 1) {
            return "Couldn't find tracks in processor";
        }

        Format supported[];

        if (audioTracks[0].isEnabled()) {

            supported = audioTracks[0].getSupportedFormats();

            for (int j = 0; j < supported.length; j++) {
                chatFrame.audioQualityComboBox.addItem(supported[j]);
            }

            if (supported.length > 0) {
                audioTracks[0].setFormat(supported[0]); //默认选择第一个格式
            } else {
                audioTracks[0].setEnabled(false);
            }

        } else {
            audioTracks[0].setEnabled(false);
        }

        initAudioProcessorOK = true;

        return null;
    }

    public String initVideoProcessor() {

        if (videoCapDevLoc == null) {
            return "Video captue device locator is null";
        }

        DataSource ds;
        try {
            ds = Manager.createDataSource(videoCapDevLoc);
        } catch (Exception e) {
            return "Couldn't create DataSource";
        }

        try {
            videoProcessor = Manager.createProcessor(ds);
        } catch (NoProcessorException npe) {
            return "Couldn't create processor";
        } catch (IOException ioe) {
            return "IOException creating processor";
        }

        boolean result = waitForState(videoProcessor, Processor.Configured);
        if (result == false) {
            return "Couldn't configure processor";
        }

        videoTracks = videoProcessor.getTrackControls();
        if (videoTracks == null || videoTracks.length < 1) {
            return "Couldn't find tracks in processor";
        }

        videoProcessor.setContentDescriptor(new ContentDescriptor(
                ContentDescriptor.RAW_RTP));

        Format supported[];
        Format chosen;
        boolean atLeastOneTrack = false;

        if (videoTracks[0].isEnabled()) {

            supported = videoTracks[0].getSupportedFormats();

            for (int j = 0; j < supported.length; j++) {
                chatFrame.videoQualityComboBox.addItem(supported[j]);
            }

            if (supported.length > 0) {
                chosen = checkForVideoSizes(videoTracks[0].getFormat(),
                                            supported[0]); //默认选择第一个格式
                videoTracks[0].setFormat(chosen);
                atLeastOneTrack = true;
            } else {
                videoTracks[0].setEnabled(false);
            }
        } else {
            videoTracks[0].setEnabled(false);
        }

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

        initVideoProcessorOK = true;

        return null;
    }

    public void setAudioFormat(int index) {
        audioTracks[0].setFormat(audioTracks[0].getSupportedFormats()[index]);
    }

    public void setVideoFormat(int index) {
        Format fmt = videoTracks[0].getSupportedFormats()[index];
        Format fmt2 = checkForVideoSizes(videoTracks[0].getFormat(), fmt);
        videoTracks[0].setFormat(fmt2);
    }

    public String createAudioDataOutput() {
        if (initAudioProcessorOK != true) {
            return "Couldn't init audio processor";
        }

        boolean result = waitForState(audioProcessor, Controller.Realized);
        if (result == false) {
            return "Couldn't realize processor";
        }

        audioDataOutput = audioProcessor.getDataOutput();

        return null;
    }

    public String createVideoDataOutput() {
        if (initVideoProcessorOK != true) {
            return "Couldn't init video processor";
        }

        boolean result = waitForState(videoProcessor, Controller.Realized);
        if (result == false) {
            return "Couldn't realize processor";
        }

        // Set the JPEG quality to .5.
        setJPEGQuality(videoProcessor, 0.5f);

        videoDataOutput = videoProcessor.getDataOutput();

        return null;
    }

    public String createAudioRTPMgrs() {

        InetAddress ipAddr;
        SendStream sendStream;

        try {
            if(audioRTPMgr == null){
                audioRTPMgr = RTPManager.newInstance();
            }
            audioRTPMgr.addSessionListener(this);
            audioRTPMgr.addReceiveStreamListener(this);

⌨️ 快捷键说明

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