java error: Exception in thread “main” java.lang.N

2019-02-21 06:22发布

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

标签: java jmf
8条回答
淡お忘
2楼-- · 2019-02-21 07:17

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.

查看更多
萌系小妹纸
3楼-- · 2019-02-21 07:20

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();

查看更多
登录 后发表回答