📄 mediamanager.java
字号:
remoteTransmisionDetails.put("video", sessionRemoteAddress);
}
ArrayList ports = new ArrayList();
ArrayList formatSets = new ArrayList();
ArrayList contents = new ArrayList();
ArrayList localPorts = new ArrayList();
for (int i = 0; i < mediaDescriptions.size(); i++) {
MediaDescription mediaDescription = (MediaDescription) mediaDescriptions.get(i);
Media media = mediaDescription.getMedia();
//Media Type
String mediaType = null;
try {
mediaType = media.getMediaType();
}
catch (SdpParseException ex) {
fireNonFatalMediaError(new MediaException(
"Failed to extract the media type for one of the provided media descriptions!\n"
+ "Ignoring description!",
ex
));
continue;
}
//Find ports
try {
mediaPort = media.getMediaPort();
}
catch (SdpParseException ex) {
fireNonFatalMediaError(new MediaException(
"Failed to extract port for media type ["
+ mediaType + "]. Ignoring description!",
ex
));
continue;
}
//Find formats
Vector sdpFormats = null;
try {
sdpFormats = media.getMediaFormats(true);
}
catch (SdpParseException ex) {
fireNonFatalMediaError(new MediaException(
"Failed to extract media formats for media type ["
+ mediaType + "]. Ignoring description!",
ex
));
continue;
}
Connection mediaConnection = mediaDescription.getConnection();
String mediaRemoteAddress = null;
if (mediaConnection == null) {
if(sessionConnection == null) {
throw new MediaException(
"A connection parameter was not present in provided session/media description");
} else {
mediaRemoteAddress = sessionRemoteAddress;
}
} else {
try {
mediaRemoteAddress = mediaConnection.getAddress();
}
catch (SdpParseException ex) {
throw new MediaException(
"Failed to extract the connection address parameter"
+ "from privided media description", ex);
}
}
//update the remote address for the current media type in case
//it is specific for this media (i.e. differs from the main
//connection address)
remoteTransmisionDetails.put(mediaType, mediaRemoteAddress);
//START TRANSMISSION
try {
if (isMediaTransmittable(mediaType)) {
remoteAddresses.add(mediaRemoteAddress);
ports.add(new Integer(mediaPort));
contents.add(mediaType);
// Selecting local ports for NAT
if(mediaType.trim().equals("video"))
localPorts.add(new Integer(videoPort));
else if(mediaType.trim().equals("audio"))
localPorts.add(new Integer(audioPort));
else
localPorts.add(new Integer(mediaPort));
formatSets.add(extractTransmittableJmfFormats(
sdpFormats));
}
else{
//nothing to transmit here so skip setting the flag
//bug report and fix - Gary M. Levin - Telecordia
continue;
}
}
catch (MediaException ex) {
fireNonFatalMediaError(new MediaException(
"Could not start a transmitter for media type ["
+ mediaType + "]\nIgnoring media [" + mediaType + "]!",
ex
));
continue;
}
atLeastOneTransmitterStarted = true;
}
if (!atLeastOneTransmitterStarted) {
throw new MediaException(
"Todos as tentativas de conex鉶 com dispositivos de som falharam!");
}
else {
startTransmitter(
remoteAddresses,
ports,
formatSets,
contents,
localPorts);
}
//We should be able to receive even if we don't transmit so get this
//out of the above if clause
startReceiver(remoteTransmisionDetails);
}
finally {
}
}
protected void closeProcessor() throws MediaException
{
try {
if(processor != null)
{
processor.stop();
processor.close();
}
if(avDataSource!=null)
avDataSource.disconnect();
}
finally {
}
}
public void stop() throws MediaException
{
try {
closeStreams();
closeProcessor();
}
finally {
}
}
public void closeStreams()
{
try {
removeAllRtpManagers();
stopTransmitters();
stopReceiver();
firePlayerStopped();
}
finally {
}
}
protected void startTransmitter(ArrayList destHosts,
ArrayList ports,
ArrayList formatSets,
ArrayList contents,
ArrayList localPorts) throws MediaException
{
try {
if (avDataSource != null) {
AVTransmitter transmitter =
new AVTransmitter(processor,
destHosts,
ports,
formatSets,
contents,
localPorts);
transmitter.setMediaManagerCallback(this);
avTransmitters.add(transmitter);
transmitter.start();
}
}
finally {
}
}
protected void stopTransmitters()
{
try {
for (int i = avTransmitters.size() - 1; i >= 0; i--) {
try {
( (AVTransmitter) avTransmitters.elementAt(i)).stop();
avTransmitters.removeElementAt(i);
} //Catch everything that comes out as we wouldn't want
//Some null pointer prevent us from closing a device and thus
//render it unusable
catch (Exception exc) {
}
}
}
finally {
}
}
public void setMute(boolean b){
mute=b;
}
public void setMute(){
for(int i=0;i<avTransmitters.size();i++){
AVTransmitter avt=(AVTransmitter)avTransmitters.get(i);
for(int j=0;j<avt.sendStreams.size();j++){
SendStream sS=(SendStream)avt.sendStreams.get(j);
try{
if(avt.contents.get(j).equals("audio")){
if(!mute){
sS.stop();
}else{
sS.start();
}
mute=!mute;
}
}catch(IOException e){
}
}
}
}
public void startVideo(){
for(int i=0;i<avTransmitters.size();i++){
AVTransmitter avt=(AVTransmitter)avTransmitters.get(i);
avt.setTrack(true);
}
}
public void stopVideo(){
for(int i=0;i<avTransmitters.size();i++){
AVTransmitter avt=(AVTransmitter)avTransmitters.get(i);
avt.setTrack(false);
}
}
protected void startReceiver(Hashtable remoteTransmissionDetails)
{
try {
ArrayList sessions = new ArrayList();
String mediaType = null;
AVTransmitter at = (AVTransmitter)this.avTransmitters.get(0);
int remoteAudio = at.findPortForLocal(Integer.parseInt(getAudioPort()));
int remoteVideo = at.findPortForLocal(Integer.parseInt(getVideoPort()));
if(remoteAudio==-1)
remoteAudio=Integer.parseInt(getAudioPort());
if(remoteVideo==-1)
remoteVideo=Integer.parseInt(getVideoPort());
if(remoteTransmissionDetails.get("audio") != null&&false)
sessions.add((String)remoteTransmissionDetails.get("audio")
+ "/" + /* audioPort */ getAudioPort() + "/" + remoteAudio + "/1/audio");
if(remoteTransmissionDetails.get("video") != null&&false)
sessions.add((String)remoteTransmissionDetails.get("video")
+ "/" + /*videoPort*/ getVideoPort() + "/" + remoteVideo + "/1/video");
// avReceiver = new AVReceiver(sessions);
// avReceiver.setMediaManager(this);
// avReceiver.initialize();
}
finally {
}
}
protected void stopReceiver()
{
try {
/* if (avReceiver != null) {
avReceiver.close();
avReceiver = null;
}*/
}
finally {
}
}
/**
* Only stops the receiver without deleting it. After calling this method
* one can call softStartReceiver to relauch reception.
*/
public void softStopReceiver()
{
try {
/* if (avReceiver != null) {
// avReceiver.close();
// this.firePlayerStopped();
}
else
console.debug(
"Attempt to soft stop reception for a null avReceiver");
*/
}
finally
{
}
}
/**
* Starts a receiver that has been stopped using softStopReceiver().
*/
public void softStartReceiver()
{
try
{
/* if (avReceiver != null) {
avReceiver.initialize();
}
else
console.error(
"acReceiver is null. Use softStartReceiver only for receivers "
+"that had been stopped using softStopReceiver()");
*/
}finally
{
}
}
void firePlayerStarting(Player player)
{
try {
MediaEvent evt = new MediaEvent(player);
for (int i = listeners.size() - 1; i >= 0; i--) {
( (MediaListener) listeners.get(i)).playerStarting(evt);
}
}
finally {
}
}
void firePlayerStopped()
{
try {
for (int i = listeners.size() - 1; i >= 0; i--) {
( (MediaListener) listeners.get(i)).playerStopped();
}
}
finally {
}
}
void fireNonFatalMediaError(Throwable cause)
{
try {
MediaErrorEvent evt = new MediaErrorEvent(cause);
for (int i = listeners.size() - 1; i >= 0; i--) {
( (MediaListener) listeners.get(i)).nonFatalMediaErrorOccurred(
evt);
}
}
finally {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -