?? traandrec.java
字號(hào):
/*
* 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) {//如果需要服務(wù)器
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 {//如果不需要服務(wù)器
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]); //默認(rèn)選擇第一個(gè)格式
} 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]); //默認(rèn)選擇第一個(gè)格式
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);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -