Проблема с JMF для захвата видео с веб-камеры - PullRequest
1 голос
/ 16 мая 2011

Я пытаюсь снять видео с моей веб-камеры уже около 2 месяцев, и я обнаружил, что JMF может это сделать, и я получил много кодов, но ничего не работает.и форматы. Приведенный ниже код дает исключение нулевого указателя при возврате видео- и аудиоустройств, хотя устройства обнаруживаются реестром 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);
  }

}

Ответы [ 4 ]

3 голосов
/ 13 ноября 2011

Это потому, что ваш код не обнаруживает веб-камеру

вы должны скопировать файл jmf.properties в тот же каталог, где находится исполняемый файл jar

вы найдете файл jmf.properties в папке lib вашей установки jmf.

Для меня это был C: \ Program Files \ JMF2.1.1e \ lib \ jmf.properties

1 голос
/ 26 июня 2012

Если вы используете 64-битный процессор, удалите jmf. Переустановите jmf, но на этот раз на диск C:, а не в программные файлы: например. C:/jmf 2.1.1e.

1 голос
/ 16 декабря 2011

Если у вас есть проблема с видеоформатом, я думаю, вы должны указать следующий формат:

CaptureDeviceManager.getDeviceList(new YUVFormat());

Это работает для меня.

1 голос
/ 26 июля 2011

Я думаю, у меня была похожая проблема.JMStudio находил мою веб-камеру, но моего кода Java не было.Проблема для меня была с форматом устройства.CaptureDeviceManager.getDeviceList( VideoFormat ) требует VideoFormat в качестве параметра.я знаю только два: rgb и yuv.

Попробуйте позвонить одному из:

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

Ваша веб-камера должна отображаться в одном или другом списке.

...