2016-07-15 24 views
9

jxcaptureを使用してビデオをキャプチャしようとしています。私は一度だけそうすることができますが、同じ番組で2度目のビデオをキャプチャしようとしているときに、私はトラブルに陥りました。私のコードは以下の通りです:システムリソースが不足していて、Webカメラからビデオをキャプチャしています。

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

} 

}

私は、私は次のエラー(システムリソース不足は、要求されたサービスのWebカメラを完成するために存在する)reveivingてるやろうとしている:

をスレッド "メイン" java.lang.RuntimeExceptionに

例外:com.teamdev.jxcapture.video.win.BaseDirectShowCapture.doStartでにjava.lang.reflect.InvocationTargetException (SOURCEFILE:103)com.teamdev.jxcaptureで 。 VideoCapture.start(SourceFile:146)com.teamdev.jxdesktop.win32.g時にjava.lang.reflect.InvocationTargetException :によって引き起こさcapturer.CaptureVideoFromWebCamera.start(CaptureVideoFromWebCamera.java:58)capturer.CaptureVideoFromWebCamera.main(CaptureVideoFromWebCamera.java:76) で で.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.reflectは:スレッド「メイン」java.lang.RuntimeExceptionで

例外:私は、次のメッセージが表示されました捕捉するために同じオブジェクトを使用しようとしています。 CaptureVideoFromWebCamera.startで (CaptureVideoFromWebCamera.java:47)/:com.teamdev.jxcapture.VideoCapture.start(146 SOURCEFILE)で :com.teamdev.jxcapture.video.win.BaseDirectShowCapture.doStart(103 SOURCEFILE)でにInvocationTargetException /videoCapture.start(); CaptureVideoFromWebCamera.main(CaptureVideoFromWebCamera.java:64)の /obj.start('2.wmv "); によって引き起こさ: :com.teamdev.jxcapture.video.win.BaseDirectShowCapture.doStart(97 SOURCEFILE)でcom.teamdev.jxdesktop.win32.g.doInvokeAndWait(不明なソース) でにjava.lang.reflect.InvocationTargetException 。あなたのリソースがすでに別のスレッドによってロックされていて、あなたが別のスレッドから同じリソースを利用しようとしながら、ロックが解除されていないので... 3以上

+1

カメラをもう一度呼び出す前に、スリープ時間を追加してみます。 2回目にカメラを起動しようとすると、停止操作が完了していない可能性があります。または、カメラを起動および停止するためにボタンを押す必要があるGUIを使用してテストしてください。 – Olantobi

+0

私はそれらの両方を試しましたが、私は同じ問題を抱えています! –

+0

これはビデオストップがキャプチャを停止したようですが、カメラのリコースはまだJavaからの使用に残っているので、キャプチャをやり直すことはできません。しかし、プログラムのキャプチャはまだカメラが開いているので、私は閉じるために私のcarmeraをプログラムを閉じる必要があります。 –

答えて

1

は実際には、エラーメッセージを取得しています。あなたは、セットアップThread.Sleep(5000);を持っていますが、それは実際に代わりにあなたのスレッドを一時停止し、リソースを解放しないように設定任意の文を持って、あなたのプログラムで :

ステップ1:ここでは

は、次の2つの主なものをしなければなりません。したがって、finallyステートメントでカメラソケットとクローズオブジェクトをリセットしてみてください。

手順2: try Synchronized通常のプロセスを使用するスレッドではなく、1つのプロセスでリソースを一度に使用できるためです。

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免許(やウェブを持っていませんカム:))これを確認する。

関連する問題