2011-05-15 6 views
1

J'ai essayé de capturer une vidéo de ma webcam pendant environ 2 mois maintenant et j'ai trouvé que JMF pourrait et j'ai eu beaucoup de codes mais rien ne fonctionne. Le studio de JMF et le registre de JMF sont fonctionne correctement et je peux connaître les périphériques et les formats. Le code ci-dessous donne une exception null pointeur dans le renvoi des périphériques vidéo et audio, bien que les périphériques sont détectés par le registre jmf.Peut-on m'aider s'il vous plaît à ce sujet? Je l'apprécierais vraiment. Merci d'avance.Problème avec JMF pour capturer la vidéo de la webcam

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

Je connais un utilisateur qui peut répondre à cette question mais je ne sais pas comment lui envoyer un message ou lui envoyer un lien vers la question. –

Répondre

1

Je pense que j'ai eu un problème similaire. JMStudio trouvait ma webcam mais mon code Java ne l'était pas. Le problème pour moi était avec le format de l'appareil. le CaptureDeviceManager.getDeviceList(VideoFormat) nécessite un VideoFormat en tant que paramètre. les deux que je connais sont rgb et yuv.

Essayez d'appeler l'un des:

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

Votre webcam devrait apparaître dans une liste ou l'autre.

3

En effet, votre code ne détecte pas la webcam

vous devez copier le fichier jmf.properties dans le même répertoire que votre pot exécutable

vous trouverez le fichier jmf.properties int le dossier lib de votre installation jmf.

Pour moi, il était C: \ Program Files \ JMF2.1.1e \ lib \ jmf.properties

1

Si vous avez un problème avec le format vidéo, je pense que vous devriez donner le format comme celui-ci:

CaptureDeviceManager.getDeviceList(new YUVFormat()); 

Ça marche pour moi.

1

Si vous utilisez un processeur 64 bits, désinstallez le fichier jmf. Réinstallez le jmf mais cette fois sur le lecteur C: et pas de programmer des fichiers: p ex. C:/jmf 2.1.1e.

Questions connexes