2012-04-12 36 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;" 

,当我删除它们,并重新启动我的电脑。然后宾果。代码运行没有任何问题。 :)