问题
Here is code:
import java.awt.*;
import java.util.*;
import javax.media.*;
import javax.media.protocol.*;
import javax.media.control.*;
import javax.media.format.*;
public class jmfcam05v
{
DataSource dataSource;
PushBufferStream pbs;
Vector camImgSize = new Vector();
Vector camCapDevice = new Vector();
Vector camCapFormat = new Vector();
int camFPS;
int camImgSel;
Processor processor = null;
DataSink datasink = null;
public static void main(String[] args)
{
jmfcam05v jmfcam = new jmfcam05v();
}
public jmfcam05v()
{
fetchDeviceFormats();
camFPS = 30; // framerate
fetchDeviceDataSource();
createPBDSource();
createProcessor(dataSource);
startCapture();
try{Thread.sleep(20000);}catch(Exception e){} // 20 seconds
stopCapture();
}
boolean fetchDeviceFormats()
{
Vector deviceList = CaptureDeviceManager.getDeviceList(new VideoFormat(null));
CaptureDeviceInfo CapDevice = null;
Format CapFormat = null;
String type = "N/A";
CaptureDeviceInfo deviceInfo=null;boolean VideoFormatMatch=false;
for(int i=0;i<deviceList.size();i++)
{
// search for video device
deviceInfo = (CaptureDeviceInfo)deviceList.elementAt(i);
if(deviceInfo.getName().indexOf("vfw:")<0)continue;
Format deviceFormat[] = deviceInfo.getFormats();
for (int f=0;f<deviceFormat.length;f++)
{
if(deviceFormat[f] instanceof RGBFormat)type="RGB";
if(deviceFormat[f] instanceof YUVFormat)type="YUV";
if(deviceFormat[f] instanceof JPEGFormat)type="JPG";
Dimension size = ((VideoFormat)deviceFormat[f]).getSize();
camImgSize.addElement(type+" "+size.width+"x"+size.height);
CapDevice = deviceInfo;
camCapDevice.addElement(CapDevice);
//System.out.println("Video device = " + deviceInfo.getName());
CapFormat = (VideoFormat)deviceFormat[f];
camCapFormat.addElement(CapFormat);
//System.out.println("Video format = " + deviceFormat[f].toString());
VideoFormatMatch=true; // at least one
}
}
if(VideoFormatMatch==false)
{
if(deviceInfo!=null)System.out.println(deviceInfo);
System.out.println("Video Format not found");
return false;
}
return true;
}
void fetchDeviceDataSource()
{
CaptureDeviceInfo CapDevice =
(CaptureDeviceInfo)camCapDevice.elementAt(camImgSel);
System.out.println("Video device = " + CapDevice.getName());
Format CapFormat = (Format)camCapFormat.elementAt(camImgSel);
System.out.println("Video format = " + CapFormat.toString());
MediaLocator loc = CapDevice.getLocator();
try
{
dataSource = Manager.createDataSource(loc);
}
catch(Exception e){}
try
{
FormatControl formCont=((CaptureDevice)dataSource).getFormatControls()[0];
VideoFormat formatVideoNew = new
VideoFormat(null,null,-1,null,(float)camFPS);
formCont.setFormat(CapFormat.intersects(formatVideoNew));
}
catch(Exception e){}
}
void createPBDSource()
{
try
{
pbs=((PushBufferDataSource)dataSource).getStreams()[0];
}
catch(Exception e){}
}
public void createProcessor(DataSource datasource)
{
FileTypeDescriptor ftd = new FileTypeDescriptor(FileTypeDescriptor.MSVIDEO);
Format[] formats = new Format[] {new VideoFormat(VideoFormat.INDEO50)};
ProcessorModel pm = new ProcessorModel(datasource, formats, ftd);
try
{
processor = Manager.createRealizedProcessor(pm);
}
catch(Exception me)
{
System.out.println(me);
// Make sure the capture devices are released
datasource.disconnect();
return;
}
}
private void startCapture()
{
// Get the processor's output, create a DataSink and connect the two.
DataSource outputDS = processor.getDataOutput();
try
{
MediaLocator ml = new MediaLocator("file:capture.mpg");
datasink = Manager.createDataSink(outputDS, ml);
datasink.open();
datasink.start();
}catch (Exception e)
{
System.out.println(e);
}
processor.start();
System.out.println("Started saving...");
}
private void pauseCapture()
{
processor.stop();
}
private void resumeCapture()
{
processor.start();
}
private void stopCapture()
{
// Stop the capture and the file writer (DataSink)
processor.stop();
processor.close();
datasink.close();
processor = null;
System.out.println("Done saving.");
}
}
Error:
run:
Video device = vfw:Microsoft WDM Image Capture (Win32):0 Video format = YUV Video Format: Size = java.awt.Dimension[width=640,height=480] MaxDataLength = 614400 DataType = class [B yuvType = 32 StrideY = 1280 StrideUV = 1280 OffsetY = 0 OffsetU = 1 OffsetV = 3 javax.media.CannotRealizeException: Unable to provide all requested tracks Exception in thread "main" java.lang.NullPointerException at jmfcam05v.startCapture(jmfcam05v.java:202) at jmfcam05v.(jmfcam05v.java:82) at jmfcam05v.main(jmfcam05v.java:64)
please help me with this error.i am using windows vista OS.
can anyone suggest me how to store files in .3gp format?please help
回答1:
Exception in thread "main" java.lang.NullPointerException at jmfcam05v.startCapture(jmfcam05v.java:202)
Some object reference at line 202 of jmfcam05v.java
, inside the startCapture()
method, is null
while the code is trying to access/invoke it using the dot .
operator.
E.g.
SomeObject someObject = null;
someObject.doSomething(); // NullPointerException.
The solution is actually easy. Just make sure that it's not null by either instantiating it:
if (someObject == null) {
someObject = new SomeObject();
}
someObject.doSomething(); // No NPE more!
... or by simply doing a nullcheck before accessing/invoking:
if (someObject != null) {
someObject.doSomething(); // No NPE more!
}
回答2:
The NPE is easy. One of the lines
MediaLocator ml = new MediaLocator("file:capture.mpg");
datasink = Manager.createDataSink(outputDS, ml);
in method startCapture throws a CannotRealizeException
. So datasink
is not initialized and if you try to close it later in stopCapture
, it's still null
and that causes the NPE.
To avoid the NPE: test, if datasink
isn't null before calling a method on it.
EDIT
and could you PLEASE remove the application logic from the constructor and move it to the main method. A constructor is for constructing an object, mainly for initializing class members and nothing else. And Java classes should start with a capital letter, that helps people (and us) understanding the code.
回答3:
Poor exception handling is to blame here.
Most likely, the processor
member isn't getting initialized. If there isn't a processor, it looks like you can't do anything useful. So let the exception fly, terminating your doomed program at that point, instead of "swallowing" it and blithely continuing on.
Also, if you are going to eat exceptions and soldier on, at least print them properly: ex.printStackTrace()
, instead of System.out.println(ex)
.
But it would be much better to add throws
clauses to your methods, and not catch any exceptions, since you cannot recover from them.
Perhaps the Indeo codec was present on your Windows XP box, but isn't available on your Vista machine. (Update: In fact, Indeo is not supported and not compatible with Vista.) That prevents the processor
from being created successfully, and your program is doomed from that point. Is there a way to test whether a particular FileTypeDescriptor
or VideoFormat
is valid at runtime?
回答4:
It looks as though this line:
processor = Manager.createRealizedProcessor(pm);
Throws a CannotRealizeException
, causing processor
to be null and leading to the NPE later on. As for what that exception is thrown, that seems to have to do with your data and use of the JMF.
Generally, it's bad to use System.out.println()
on exceptions because then you lose the stack trace, which is often the most important information for debugging. Instead. use exception.printStackTrace();
回答5:
datasink is never being initialized.
When you try to call
datasink.close();
Its saying that datasink is null.
Make sure that your code is actually getting to and processing line #176
datasink = Manager.createDataSink(outputDS, ml);
回答6:
By looking at the private void startCapture()
method I guess the processor
variable is NULL
as this is the only stuff that is not in a try-catch
block.
回答7:
Remove this :
Processor processor = null;
DataSink datasink = null;
and replace with this :
Processor processor;
DataSink datasink;
回答8:
This is because of createRealizedProcessor is not able to work on VedioCapture device. Issue is with Microsoft WDM Image device.
来源:https://stackoverflow.com/questions/2140959/java-error-exception-in-thread-main-java-lang-nullpointerexception