2013-03-16 6 views
0

Добрый вечер, я реализую проект JMF, который выполняет 2 rtp-сессии на одном компьютере. Сеанс rtp может быть инициализирован и запущен, но как я могу прерывать один из них. Вместо того, чтобы не запускать сеанс 2 rtp на том же компьютере, есть ли способ, чтобы JMF прерывал/удерживал сессию rtp? Для информации есть некоторые коды.Как прерывать сеанс аудио rtp в JMF?

Передающий и передающий Б - это почти тот же код, который получает звук LINEAR с локального компьютера и преобразует их в GSM_RTP или ULAW_RTP, только порт для передачи - это не то же самое. Наконец, datasink для mediaLocator для другого компьютера.

Thread transmitA = new Thread() { 
     public void run() { 

      transmitA(); 
     } 
    }; 

     Thread transmitB = new Thread() { 
     public void run() { 

      transmitB(); 
     } 
    }; 

условия для прерывания

transmitA.start(); 
trasmitB.start(); 

while (...) { 

     if (...) { 

      //interrupt transmitA 
      transmitA.interrupt(); 
      transmitA.stop(); 

      } /*else if (...) { 
         //interrupt transmitB 
         transmitB.interrupt(); 
         transmitB.stop(); 
        }*/      
      }//notation end here 

Ну, прерывают нити не то же самое, как прервать Rtp сеанс. Как прервать или просто сделать один сеанс rtp для передачи на другой компьютер? Я собираюсь что-то сделать на трассе? или процессор?

transmitA()

public void transmitA(){ 

     // First find a capture device that will capture linear audio 
     // data at 8bit 8Khz 
     AudioFormat format= new AudioFormat(AudioFormat.LINEAR, 
              8000, 
              8, 
              1); 

     Vector devices= CaptureDeviceManager.getDeviceList(format); 

     CaptureDeviceInfo di= null; 

     if (devices.size() > 0) { 
      di = (CaptureDeviceInfo) devices.elementAt(0); 
     } 
     else { 
      // exit if we could not find the relevant capturedevice. 
      System.exit(-1); 
     } 

     // Create a processor for this capturedevice & exit if we 
     // cannot create it 
     Processor processor = null; 
     try { 
       processor = Manager.createProcessor(di.getLocator()); 
     } catch (IOException e) { 
      System.exit(-1); 
     } catch (NoProcessorException e) { 
      System.exit(-1); 
     } 

     // configure the processor 
     processor.configure(); 

     while (processor.getState() != Processor.Configured){ 
      try { 
        Thread.sleep(100); 
      } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
      } 
     } 

     processor.setContentDescriptor( 
      new ContentDescriptor(ContentDescriptor.RAW)); 

     TrackControl track[] = processor.getTrackControls(); 

     boolean encodingOk = false; 

     // Go through the tracks and try to program one of them to 
     // output gsm data. 

     for (int i = 0; i < track.length; i++) { 
      if (!encodingOk && track[i] instanceof FormatControl) { 
       if (((FormatControl)track[i]). 
        setFormat(new AudioFormat(AudioFormat.GSM_RTP, 
               8000, 
               8, 
               1)) == null) { 

        track[i].setEnabled(false); 
       } 
       else { 
        encodingOk = true; 
       } 
      } else { 
       // we could not set this track to gsm, so disable it 
       track[i].setEnabled(false); 
      } 
     } 

     // At this point, we have determined where we can send out 
     // gsm data or not. 
     // realize the processor 
     if (encodingOk) { 
      processor.realize(); 
      while (processor.getState() != Processor.Realized){ 
        try { 
          Thread.sleep(100); 
        } catch (InterruptedException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
        } 
      } 
      // get the output datasource of the processor and exit 
      // if we fail 
      DataSource ds = null; 

      try { 
       ds = processor.getDataOutput(); 
      } catch (NotRealizedError e) { 
       System.exit(-1); 
      } 

      // hand this datasource to manager for creating an RTP 
      // datasink our RTP datasink will multicast the audio 
      try { 
       String url= "rtp://192.168.1.3:22222/audio/16"; 
       //String url= "rtp://224.0.0.1:22224/audio/16"; 
       MediaLocator m = new MediaLocator(url); 

       DataSink d = Manager.createDataSink(ds, m); 
       d.open(); 
       d.start(); 
       processor.start(); 
      } catch (Exception e) { 
       System.out.println("cannot find the receiver address!!!"); 
       System.exit(-1); 
      }  
     } 
    } 

нужны некоторые подсказки и руководящие принципы, спасибо передовой ^^»

ответ

0

После попытки и попытки, я наконец-то сделал это ... Просто удалили нить и прямое использование метода, я не знаю, является ли это хорошей практикой программирования или нет, но хорошо любое предложение будет действительно оценено ...

private DataSink d = null; 
private Processor processor = null; 

while (...) { 
    if (...) { 

     //interrupt transmitA 
     processor.stop(); 
     processor.close(); 
     processor.deallocate(); 
     processor = null; 
     d.close(); 
     d = null; 
     transmitA(); 

     } /*else if (...) { 
        //interrupt transmitB 
        processor.stop(); 
        processor.close(); 
        processor.deallocate(); 
        processor = null; 
        d.close(); 
        d = null; 
        transmitB.stop(); 
       }*/      
     }//notation end here 
+0

Я действительно не очень хорош в программировании JMF, но я собираюсь изучить его. Его полезный ответ, любое лучшее предложение ответа оценено. Благодарю. –

Смежные вопросы