2011-05-15 74 views
1

我一直在努力,现在捕捉从我的摄像头2个月左右的视频捕捉视频和我发现,JMF可以说,我得到了许多代码,但没有works.The JMF工作室和JMF注册表中正常工作,我可以知道设备与格式如下.The代码给出虽然设备由JMF检测registry.Could请人帮我关于返回视频和音频设备一个空指针异常?我真的很感激它。提前感谢。问题与JMF从摄像头

package JMF;import java.awt.*;import java.awt.event.*;import java.util.Vector;import javax.media.*;import javax.media.format.*;import javax.media.protocol.DataSource; 
    public class CaptureDeviceDialog extends Dialog implements ActionListener, ItemListener { 
     boolean configurationChanged = false;Vector devices;Vector audioDevices;VectorvideoDevices;Vector audioFormats;Vector videoFormats;Choice audioDeviceCombo;Choice videoDeviceCombo;Choice audioFormatCombo;Choice videoFormatCombo; 
     public CaptureDeviceDialog(Frame parent, String title, boolean mode) { 
     super(parent, title, mode); 
     init(); 
     } 

     private void init() { 
     setSize(450, 180); 
     Panel p = new Panel(); 
     p.setLayout(null); 

    Label l1 = new Label("Audio Device(s)"); 
    Label l2 = new Label("Video Device(s)"); 
    Label l3 = new Label("Audio Format(s)"); 
    Label l4 = new Label("Video Format(s)"); 
    audioDeviceCombo = new Choice(); 
    videoDeviceCombo = new Choice(); 
    audioFormatCombo = new Choice(); 
    videoFormatCombo = new Choice(); 

    Button OKbutton = new Button("OK"); 
    Button cancelButton = new Button("Cancel"); 


    p.add(l1); 
    l1.setBounds(5, 5, 100, 20); 
    p.add(audioDeviceCombo); 
    audioDeviceCombo.setBounds(115, 5, 300, 20); 
    p.add(l3); 
    l3.setBounds(5, 30, 100,20); 
    p.add(audioFormatCombo); 
    audioFormatCombo.setBounds(115, 30, 300,20); 
    p.add(l2); 
    l2.setBounds(5, 55, 100, 20); 
    p.add(videoDeviceCombo); 
    videoDeviceCombo.setBounds(115, 55, 300, 20); 
    p.add(l4); 
    l4.setBounds(5, 80, 100, 20); 
    p.add(videoFormatCombo); 
    videoFormatCombo.setBounds(115, 80, 300, 20); 
    p.add(OKbutton); 
    OKbutton.setBounds(280, 115, 60, 25); 
    p.add(cancelButton); 
    cancelButton.setBounds(355, 115, 60, 25); 

    add(p, "Center"); 
    audioDeviceCombo.addItemListener(this); 
    videoDeviceCombo.addItemListener(this); 
    OKbutton.addActionListener(this); 
    cancelButton.addActionListener(this); 

    //get all the capture devices 
    devices = CaptureDeviceManager.getDeviceList (null); 
    CaptureDeviceInfo cdi; 
    if (devices!=null && devices.size()>0) { 
     int deviceCount = devices.size(); 
     audioDevices = new Vector(); 
     videoDevices = new Vector(); 

     Format[] formats; 
     for (int i = 0; i < deviceCount; i++) { 
     cdi = (CaptureDeviceInfo) devices.elementAt (i); 
     formats = cdi.getFormats(); 
     for (int j=0; j<formats.length; j++) { 
      if (formats[j] instanceof AudioFormat) { 
      audioDevices.addElement(cdi); 
      break; 
      } 
      else if (formats[j] instanceof VideoFormat) { 
      videoDevices.addElement(cdi); 
      break; 
      } 
     } 
     } 

     //populate the choices for audio 
     for (int i=0; i<audioDevices.size(); i++) { 
     cdi = (CaptureDeviceInfo) audioDevices.elementAt(i); 
     audioDeviceCombo.addItem(cdi.getName()); 
     } 

     //populate the choices for video 
     for (int i=0; i<videoDevices.size(); i++) { 
     cdi = (CaptureDeviceInfo) videoDevices.elementAt(i); 
     videoDeviceCombo.addItem(cdi.getName()); 
     } 

     displayAudioFormats(); 
     displayVideoFormats(); 

    } // end if devices!=null && devices.size>0 
    else { 
     //no devices found or something bad happened. 
    } 
    } 

    void displayAudioFormats() { 
    //get audio formats of the selected audio device and repopulate the audio format combo 
    CaptureDeviceInfo cdi; 
    audioFormatCombo.removeAll(); 

    int i = audioDeviceCombo.getSelectedIndex(); 
    //i = -1 --> no selected index 

    if (i!=-1) { 
     cdi = (CaptureDeviceInfo) audioDevices.elementAt(i); 
     if (cdi!=null) { 
     Format[] formats = cdi.getFormats(); 
     audioFormats = new Vector(); 
     for (int j=0; j<formats.length; j++) { 
      audioFormatCombo.add(formats[j].toString()); 
      audioFormats.addElement(formats[j]); 
     } 
     } 
    } 
    } 

    void displayVideoFormats() { 
    //get audio formats of the selected audio device and repopulate the audio format combo 
    CaptureDeviceInfo cdi; 
    videoFormatCombo.removeAll(); 

    int i = videoDeviceCombo.getSelectedIndex(); 
    //i = -1 --> no selected index 

    if (i!=-1) { 
     cdi = (CaptureDeviceInfo) videoDevices.elementAt(i); 
     if (cdi!=null) { 
     Format[] formats = cdi.getFormats(); 
     videoFormats = new Vector(); 
     for (int j=0; j<formats.length; j++) { 
      videoFormatCombo.add(formats[j].toString()); 
      videoFormats.addElement(formats[j]); 
     } 
     } 
    } 
    } 


    public CaptureDeviceInfo getVideoDevice() { 
    CaptureDeviceInfo cdi = null; 
    if (videoDeviceCombo!=null) { 
     int i = videoDeviceCombo.getSelectedIndex(); 
     cdi = (CaptureDeviceInfo) videoDevices.elementAt(i); 
     System.out.println("videoDeviceCombo!=null"); 
     if(videoDevices.elementAt(i)!=null) 
     System.out.println("element at videoDeviceCombo!=null"); 
    } 
    return cdi; 
    } 

    public CaptureDeviceInfo getAudioDevice() { 
    CaptureDeviceInfo cdi = null; 
    //System.out.println("audioDeviceCombo!=null"); 
    if (audioDeviceCombo!=null) { 
     int i = audioDeviceCombo.getSelectedIndex(); 
     cdi = (CaptureDeviceInfo) audioDevices.elementAt(i); 
    if(audioDevices.elementAt(i)!=null) 
     System.out.println("eleme"); 

    } 
    return cdi; 
    } 


    public Format getAudioFormat() { 
    Format format = null; 
    if (audioFormatCombo!=null) { 
     int i = audioFormatCombo.getSelectedIndex(); 
     format = (Format) audioFormats.elementAt(i); 
    } 
    return format; 
    } 

    public Format getVideoFormat() { 
    Format format = null; 
    if (videoFormatCombo!=null) { 
     int i = videoFormatCombo.getSelectedIndex(); 
     format = (Format) videoFormats.elementAt(i); 
    } 
    return format; 
    } 

    public boolean hasConfigurationChanged() { 
    return configurationChanged; 
    } 

    public void actionPerformed(ActionEvent ae) { 
    String command = ae.getActionCommand().toString(); 
    if (command.equals("OK")) { 
     configurationChanged = true; 
    } 
    dispose(); 
    }public void itemStateChanged(ItemEvent ie) { 
    System.out.println(ie.getSource().toString()); 
    if (ie.getSource().equals(audioDeviceCombo)) 
     displayAudioFormats(); 
    else 
     displayVideoFormats(); 

    } 
} 

` 

package JMF; 

import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 

import javax.media.*; 
import javax.media.format.*; 
import javax.media.protocol.*; 

import java.awt.*; 
import java.awt.event.*; 
import java.util.Vector; 
import javax.media.*; 
import javax.media.format.*; 
import javax.media.protocol.DataSource; 


public class JMF extends Frame implements ActionListener, ItemListener, WindowListener, 
    ControllerListener { 

    CaptureDeviceInfo audioCDI = null; 
    CaptureDeviceInfo videoCDI = null; 
    String audioDeviceName = null; 
    String videoDeviceName = null; 
    Player videoPlayer; 
    Player audioPlayer; 
    Format videoFormat; 
    Format audioFormat; 
    Player dualPlayer; //for merging audio and video data sources 

    DataSource dataSource; //of the capture devices 

    public JMF(String title) { 
    super(title); 
    addWindowListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent we) { 
     dispose(); 
     } 
    }); 
    MenuBar mb = new MenuBar(); 
    setMenuBar(mb); 
    Menu menuConfigure = new Menu("Configure"); 
    mb.add(menuConfigure); 

    Menu menuAction = new Menu("Action"); 
    mb.add(menuAction); 

    /* menu items for Configure */ 
    MenuItem menuItemSetting = new MenuItem("Capture Device"); 
    menuItemSetting.addActionListener(this); 
    menuConfigure.add(menuItemSetting); 

    /* menu items for Action */ 

    MenuItem a1 = new MenuItem("Capture"); 
    a1.addActionListener(this); 
    menuAction.add(a1); 
    MenuItem a2 = new MenuItem("Play"); 
    a2.addActionListener(this); 
    menuAction.add(a2); 
    MenuItem a3 = new MenuItem("Stop"); 
    a3.addActionListener(this); 
    menuAction.add(a3); 

    } 

    public void actionPerformed(ActionEvent ae) { 
    String command = ae.getActionCommand().toString(); 
    if (command.equals("Capture Device")) { 
     registerDevices(); 
    } 
    else if (command.equals("Play")) { 
     play(); 
    } 
    else if (command.equals("Capture")) { 
     capture(); 
    } 
    else if (command.equals("Stop")) { 
     stop(); 
    } 
    } 

    void registerDevices() { 
    CaptureDeviceDialog cdDialog = new 
     CaptureDeviceDialog(this, "Capture Device", true); 
    cdDialog.show(); 
    if (!cdDialog.hasConfigurationChanged()) 
     return; 

    //configuration has changed, update variables. 
    audioCDI = cdDialog.getAudioDevice(); 
    if (audioCDI!=null) { 
     audioDeviceName = audioCDI.getName(); 
     System.out.println("Audio Device Name: " + audioDeviceName); 
    } 

    videoCDI = cdDialog.getVideoDevice(); 
    if (videoCDI!=null) { 
     videoDeviceName = videoCDI.getName(); 
     System.out.println("Video Device Name: " + videoDeviceName); 
    } 

    //Get formats selected, to be used for creating DataSource 
    videoFormat = cdDialog.getVideoFormat(); 
    audioFormat = cdDialog.getAudioFormat(); 
    } 

    void capture() { 
    if (audioCDI==null && videoCDI==null) 
     registerDevices(); 

    try { 
     if (!(audioCDI==null && videoCDI==null)) { 

    /* This works, but now we end up having 2 players 

     videoPlayer = Manager.createPlayer(videoCDI.getLocator()); 
     audioPlayer = Manager.createPlayer(audioCDI.getLocator()); 
     videoPlayer.addControllerListener(this); 
     videoPlayer.start(); 
     audioPlayer.start(); 
    */ 
     DataSource[] dataSources = new DataSource[2]; 
     System.out.println("Creating data sources."); 

     dataSources[0] = Manager.createDataSource(new MediaLocator("dsound://")); 
     dataSources[1] = Manager.createDataSource(new MediaLocator("vfw://0")); 
     DataSource ds = Manager.createMergingDataSource(dataSources); 
     dualPlayer = Manager.createPlayer(ds); 
     dualPlayer.addControllerListener(this); 
     dualPlayer.start(); 
     } 
     else 
     System.out.println("CDI not found."); 
    } 
    catch (Exception e) { 
     System.out.println(e.toString()); 
    } 
    } 

    void play() { 
    try { 
     FileDialog fd = new FileDialog(this, "Select File", FileDialog.LOAD); 
     fd.show(); 
     String filename = fd.getDirectory() + fd.getFile(); 
     dualPlayer = Manager.createPlayer(new MediaLocator("file:///" + filename)); 

     System.out.println("Adding controller listener"); 
     dualPlayer.addControllerListener(this); 

     System.out.println("Starting player ..."); 
     dualPlayer.start(); 
    } 
    catch (Exception e) { 
     System.out.println(e.toString()); 
    } 
    } 

    void stop() { 
    if (dualPlayer!=null) { 
     dualPlayer.stop(); 
     dualPlayer.deallocate(); 
    } 
    } 

public synchronized void controllerUpdate(ControllerEvent event) { 
    System.out.println(event.toString()); 

    if (event instanceof RealizeCompleteEvent) { 
     Component comp; 

     System.out.println("Adding visual component"); 
     if ((comp = dualPlayer.getVisualComponent()) != null) 
     add ("Center", comp); 
     System.out.println("Adding control panel"); 
     if ((comp = dualPlayer.getControlPanelComponent()) != null) 
     add("South", comp); 
     validate(); 
    } 
    } 

    public void itemStateChanged(ItemEvent ie) {} 
    public void windowActivated(WindowEvent we) {} 
    public void windowClosed(WindowEvent we) {} 
    public void windowClosing(WindowEvent we) {} 
    public void windowDeactivated(WindowEvent we) {} 
    public void windowDeiconified(WindowEvent we) {} 
    public void windowIconified(WindowEvent we) {} 
    public void windowOpened(WindowEvent we) {} 



    public static void main(String[] args) { 
    JMF myFrame = new JMF("Java Media Framework Project"); 
    myFrame.show(); 
    myFrame.setSize(300, 300); 
    } 

} 
+0

我在这里认识了用户谁可以回答这个问题,但我不'吨知道如何给他发送邮件,或向其发送有关链接question.Any暗示? – 2011-05-16 12:45:59

回答

1

我想我有类似的问题。 JMStudio找到我的摄像头,但我的java代码不是。我的问题是设备格式。在CaptureDeviceManager.getDeviceList(VideoFormat)需要VideoFormat作为参数。这两个我所知道的是rgbyuv

尝试调用之一:

  • CaptureDeviceManager.getDeviceList(new VideoFormat("rgb"))
  • CaptureDeviceManager.getDeviceList(new VideoFormat("yuv"))

你的摄像头应该在一个列表或其他显示。

3

这是因为你的代码没有检测到摄像头

你必须复制jmf.properties文件到相同的目录中可执行的JAR

你会发现jmf.properties文件INT lib文件夹你的jmf安装。

对我来说是C:\ Program Files文件\ JMF2.1.1e \ LIB \ jmf.properties

1

如果您有与视频格式的问题,我觉得你应该给这样的格式:

CaptureDeviceManager.getDeviceList(new YUVFormat()); 

它为我工作。

1

如果使用64位处理器,卸载JMF。重新安装JMF但这次的驱动C:,而不是程序文件:如。 C:/jmf 2.1.1e