2012-04-12 71 views
2

以前我使用過JMF,但需要安裝JMF,但我不想增加這種開銷。這就是爲什麼我想轉移到FMJ。 FMJ是開源的。 :)在FMJ中找不到捕獲設備

有一些示例與FMJ源給出的例子。還有一個FMJStudio,我可以在其中運行並傳輸從麥克風捕獲的RTP音頻。

但是,當我想傳輸RTP,使用下面的來源,它找不到任何捕獲設備。 fmj-20070928-0938_2.zipFMJ 而這個源類的類名是SimpleVoiceTransmiter

的完整源上可以找到。

//final String urlStr = URLUtils.createUrlStr(new File("samplemedia/gulp2.wav"));//"file://samplemedia/gulp2.wav"; 
    Format format; 

    format = new AudioFormat(AudioFormat.ULAW_RTP, 8000, 8, 1); 
    //format = new AudioFormat(AudioFormat.ULAW_RTP, 8000.0, 8, 1, AudioFormat.LITTLE_ENDIAN, AudioFormat.SIGNED); 
    //format = new AudioFormat(BonusAudioFormatEncodings.ALAW_RTP, 8000, 8, 1); 
    //format = new AudioFormat(BonusAudioFormatEncodings.SPEEX_RTP, 8000, 8, 1, -1, AudioFormat.SIGNED); 
    //format = new AudioFormat(BonusAudioFormatEncodings.ILBC_RTP, 8000.0, 16, 1, AudioFormat.LITTLE_ENDIAN, AudioFormat.SIGNED); 

    CaptureDeviceInfo di = null; 
      //Set to true if you want to transmit audio from capture device, like microphone. 
    if (true) 
    { 
     // First find a capture device that will capture linear audio 
     // data at 8bit 8Khz 
     AudioFormat captureFormat = new AudioFormat(AudioFormat.LINEAR, 8000, 8, 1); 

     Vector devices = CaptureDeviceManager.getDeviceList(captureFormat); 



     if (devices.size() > 0) 
     { 
      di = (CaptureDeviceInfo) devices.elementAt(0); 
     } else 
     { 
      System.err.println("No capture devices"); 
      // 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(new MediaLocator(urlStr)); 
        processor = Manager.createProcessor(di.getLocator()); 
    } catch (IOException e) 
    { 
     e.printStackTrace(); 
     System.exit(-1); 
    } catch (NoProcessorException e) 
    { 
     e.printStackTrace(); 
     System.exit(-1); 
    } 

    // configure the processor 
    processor.configure(); 

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

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

    TrackControl track[] = processor.getTrackControls(); 

    boolean encodingOk = false; 

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

    for (int i = 0; i < track.length; i++) 
    { 
     if (!encodingOk && track[i] instanceof FormatControl) 
     { 
      if (((FormatControl) track[i]).setFormat(format) == null) 
      { 

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

    // At this point, we have determined where we can send out 
    // g.711 data or not. 
    // realize the processor 
    if (encodingOk) 
    { 
     if (!new net.sf.fmj.ejmf.toolkit.util.StateWaiter(processor).blockingRealize()) 
     { 
      System.err.println("Failed to realize"); 
      return; 
     } 

     // get the output datasource of the processor and exit 
     // if we fail 
     DataSource ds = null; 

     try 
     { 
      ds = processor.getDataOutput(); 
     } catch (NotRealizedError e) 
     { 
      e.printStackTrace(); 
      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.99:49150/audio/1"; 

      MediaLocator m = new MediaLocator(url); 

      DataSink d = Manager.createDataSink(ds, m); 
      d.open(); 
      d.start(); 

      System.out.println("Starting processor"); 
      processor.start(); 
      Thread.sleep(30000); 
     } catch (Exception e) 
     { 
      e.printStackTrace(); 
      System.exit(-1); 
     } 
    } 

當我運行這個源,輸出爲:沒有捕獲設備

可能是什麼問題? :-(

編輯:我卸載了JMF從我的系統

回答

1

好,後兩天半的時間,卡在中間的地方,我指出了自己的問題

的。問題是,當我卸載JMF它不是從CLASSPATH用戶變量去除有somethinng像:

"C:\PROGRA~1\JMF21~1.1E\lib\sound.jar;C:\PROGRA~1\JMF21~1.1E\lib\jmf.jar;C:\PROGRA~1\JMF21~1.1E\lib;" 

,當我刪除它們,並重新啓動我的電腦。然後賓果。代碼運行沒有任何問題。 :)