2016-07-15 64 views
9

我试图使用jxcapture捕捉视频。我设法这样做了一次,但当我试图在同一个节目中第二次获取视频时,我陷入了麻烦。我的代码如下:系统资源不足,从网络摄像头捕捉视频java

public VideoCapture videoCapture = VideoCapture.create(VideoFormat.WMV); 
public CaptureVideoFromWebCamera(){} 

public void start(String filename){ 


    List<VideoSource> availableVideoSources = VideoSource.getAvailable(); 
    System.out.println("availableVideoSources = " + availableVideoSources); 

    if (availableVideoSources.isEmpty()) { 
     throw new IllegalStateException("No external video sources available"); 
    } 
    VideoSource webCamera = availableVideoSources.get(0); 
    System.out.println("webCamera = " + webCamera); 

    videoCapture.setVideoSource(webCamera); 

    java.util.List<Codec> videoCodecs = videoCapture.getVideoCodecs(); 
    System.out.println("videoCodecs = " + videoCodecs); 
    if (videoCodecs.isEmpty()) { 
     throw new IllegalStateException("No video codecs available"); 
    } 

    Codec videoCodec = videoCodecs.get(2); 
    System.out.println("videoCodec = " + videoCodec); 

    EncodingParameters encodingParameters = new EncodingParameters(new File("WebCamera.wmv")); 
    encodingParameters.setBitrate(500000); 
    encodingParameters.setFramerate(10); 
    encodingParameters.setKeyFrameInterval(1); 
    encodingParameters.setCodec(videoCodec); 

    videoCapture.setEncodingParameters(encodingParameters); 
    videoCapture.start(); 
    System.out.println("Recording started. Press 'Enter' to terminate."); 

} 

public void stop(String filename) throws IOException{ 
System.in.read(); 
videoCapture.stop(); 
} 


public static void main(String[] args) throws Throwable { 

    CaptureVideoFromWebCamera obj = new CaptureVideoFromWebCamera(); 
    obj.start(""); 
    obj.stop(""); 

    CaptureVideoFromWebCamera obj1 = new CaptureVideoFromWebCamera();  
    obj1.start(""); 
    obj1.stop(""); 

} 

}

当我试图这样做,我reveiving以下错误(存在不足的系统资源来完成所要求的服务网络摄像头):

异常在线程 “主” 了java.lang.RuntimeException:在com.teamdev.jxcapture.video.win.BaseDirectShowCapture.doStart java.lang.reflect.InvocationTargetException (的SourceFile:103) 在com.teamdev.jxcapture。 VideoCapture.start(SourceFile:146) 在capturer.CaptureVideoFromWebCamera.start(CaptureVideoFromWebCamera.java:58) 在capturer.CaptureVideoFromWebCamera.main(CaptureVideoFromWebCamera.java:76) 产生的原因:在com.teamdev.jxdesktop.win32.g java.lang.reflect.InvocationTargetException .doInvokeAndWait(Unknown Source) at com.teamdev.jxcapture.video.win.BaseDirectShowCapture.doStart(SourceFile:97) ... 3更多 引起:com.teamdev.jxdesktop.win32.com.ComException:COM对象方法返回错误代码:0x800705AA;系统资源不足以完成请求的服务。

EDIT2:我试着做一些线程睡眠添加到代码,以等待第二次捕捉过程。

CaptureVideoFromWebCamera obj = new CaptureVideoFromWebCamera(); 
    obj.start("1.wmv"); 
    obj.stop(""); 
    Thread.sleep(5000); 
    CaptureVideoFromWebCamera obj1 = new CaptureVideoFromWebCamera();  
    obj1.start("2.wmv"); 
    obj1.stop(""); 

我得到了同样的错误。

EDIT3:当我试图使用相同的对象,因为我得到了以下信息捕获:螺纹

异常“主”了java.lang.RuntimeException:java.lang.relfect包。的InvocationTargetException 在com.teamdev.jxcapture.video.win.BaseDirectShowCapture.doStart(的SourceFile:103) 在com.teamdev.jxcapture.VideoCapture.start(的SourceFile:146) 在CaptureVideoFromWebCamera.start(CaptureVideoFromWebCamera.java:47)/ /videoCapture.start(); CaptureVideoFromWebCamera.main(CaptureVideoFromWebCamera.java:64)/obj.start("2.wmv“); 产生的原因:在com.teamdev.jxcapture.video.win.BaseDirectShowCapture.doStart(的SourceFile:97)在com.teamdev.jxdesktop.win32.g.doInvokeAndWait(未知来源) java.lang.reflect.InvocationTargetException 。 .. 3更多

+1

尝试在再次调用相机之前添加一些睡眠时间。当您尝试第二次启动相机时,停止操作可能没有完成。或者更好的是,使用GUI进行测试,您必须按下按钮才能启动和停止相机。 – Olantobi

+0

我尝试了他们两个仍然我有同样的问题! –

+0

看来,videoStop停止捕获,但相机的资源仍然保持从java的使用,所以我不能再次初始化捕获。该程序停止捕捉,但相机仍然打开,我必须关闭程序,以便我的carmera关闭。 –

回答

1

实际上,您正在收到错误消息,因为您的资源已被另一个线程锁定,并且在尝试从另一个线程使用相同资源时未释放该锁。

在这里,你必须做两两件事:

第1步: 在你的程序中,你已经安装Thread.Sleep(5000);但它实际上暂停线程,而不是和你没有设置任何语句来释放资源。因此,请尝试在finally声明中重置相机套接字和关闭对象。

步骤2: 尝试Synchronized线程改为使用普通线程,因为只有一个进程可以一次使用您的资源。

1

它可以帮助你吗?我认为在第一次捕捉到下一个捕捉过程可以自由采用之后,您需要释放资源。

private VideoSource webCamera; // make it as object field accessible both start and stop methods 

public void start(String file name) { 
    ... 
    webCamera = availableVideoSources.get(0); 
    ... 
    } 

public void stop(String filename) throws IOException{ 
    System.in.read(); 
    videoCapture.stop(); 
    webCamera.release(); 
} 
1

尝试重新洗牌代码一点点,所以你不要两次初始化视频系统:

public VideoCapture videoCapture = VideoCapture.create(VideoFormat.WMV); 

public void init() { 

    List<VideoSource> availableVideoSources = VideoSource.getAvailable(); 
    System.out.println("availableVideoSources = " + availableVideoSources); 

    if (availableVideoSources.isEmpty()) { 
     throw new IllegalStateException("No external video sources available"); 
    } 
    VideoSource webCamera = availableVideoSources.get(0); 
    System.out.println("webCamera = " + webCamera); 

    videoCapture.setVideoSource(webCamera); 

    java.util.List<Codec> videoCodecs = videoCapture.getVideoCodecs(); 
    System.out.println("videoCodecs = " + videoCodecs); 
    if (videoCodecs.isEmpty()) { 
     throw new IllegalStateException("No video codecs available"); 
    } 

    Codec videoCodec = videoCodecs.get(2); 
    System.out.println("videoCodec = " + videoCodec); 
} 

public void start(String fileName) { 
    EncodingParameters encodingParameters = new EncodingParameters(new File(fileName)); 
    encodingParameters.setBitrate(500000); 
    encodingParameters.setFramerate(10); 
    encodingParameters.setKeyFrameInterval(1); 
    encodingParameters.setCodec(videoCodec); 

    videoCapture.setEncodingParameters(encodingParameters); 
    videoCapture.start(); 
    System.out.println("Recording started. Press 'Enter' to terminate."); 

} 

public void stop() throws IOException{ 
    System.in.read(); 
    videoCapture.stop(); 
} 


public static void main(String[] args) throws Throwable { 

    CaptureVideoFromWebCamera videoCapture = new CaptureVideoFromWebCamera(); 
    videoCapture.init(); 
    videoCapture.start("video1.wmv"); 
    videoCapture.stop(); 

    Thread.sleep(5000); 

    videoCapture.start("viedo2.wmv"); 
    videoCapture.stop(""); 
} 

我希望这可以帮助,我没有JxCapture执照(也不网络凸轮:))来检查这一点。