我一直试图从我的网络摄像头捕获视频大约2个月了,我发现JMF可以,我有很多代码但没有任何作用.JMF工作室和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);
}
}
答案 0 :(得分:3)
这是因为您的代码未检测到网络摄像头
您必须将jmf.properties文件复制到与可执行jar
相同的目录中你会在你的jmf安装的lib文件夹中找到jmf.properties文件。
对我来说是C:\ Program Files \ JMF2.1.1e \ lib \ jmf.properties
答案 1 :(得分:1)
我想我遇到了类似的问题。 JMStudio找到我的网络摄像头,但我的java代码不是。我的问题是设备格式。 CaptureDeviceManager.getDeviceList( VideoFormat )
需要VideoFormat
作为参数。我所知道的两个是rgb
和yuv
。
尝试拨打以下其中一项:
CaptureDeviceManager.getDeviceList(new VideoFormat("rgb"))
CaptureDeviceManager.getDeviceList(new VideoFormat("yuv"))
。您的网络摄像头应显示在一个列表或另一个列表中。
答案 2 :(得分:1)
如果您对视频格式有疑问,我认为您应该提供如下格式:
CaptureDeviceManager.getDeviceList(new YUVFormat());
这对我有用。
答案 3 :(得分:1)
如果您使用的是64位处理器,请卸载jmf。重新安装jmf但这次是驱动器C:
而不是程序文件:例如。 C:/jmf 2.1.1e
。