2

VLCj を使用して Web カメラにアクセスしようとしています。私はこのコードを使用しています:

public static void main(String[] args) {
    // Create player.
    MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory();
    DirectMediaPlayer mediaPlayer = mediaPlayerFactory.newDirectMediaPlayer(
            320, 240, 
            new RenderCallback() {
                @Override
                public void display(Memory arg0) {
                    // Do nothing.
                }
         });

    // Options setup.
    String[] options = new String[]{};
    String mrl = "v4l2:///dev/video0"; // Linux

    // Start preocessing.
    mediaPlayer.startMedia(mrl, options);

    BufferedImage bufImg;
    for (int i = 0; i < 1000; ++i) {
        bufImg = mediaPlayer.getSnapshot();

        // Do something with BufferedImage...
        // ...
    }

    // Stop precessing.
    mediaPlayer.stop();
    mediaPlayer = null;

    System.out.println("Finish!");
}

そして、このコードは部分的に機能します- を取得して操作することはできますがBufferedImage

  • 出力にエラーが発生しました[0x7f0a4c001268] main vout display error: Failed to set on top
  • メイン ループが終了し、カメラが無効になったとき、プログラムは終了しません。メッセージが表示Finish!されますが、プログラムは制御を IDE またはコンソールに返しません。

UPD: openSUSE 12.2 x64、VLC 2.0.3 がインストールされており、すべてのビデオ ファイル、ライブラリ VLCj 2.1.0 に対して適切に動作しています。

4

2 に答える 2

3

このコードは正しく動作しています:

public static void main(String[] args) {
    // Configure player factory.
    String[] VLC_ARGS = {
            "--intf", "dummy",          // no interface
            "--vout", "dummy",          // we don't want video (output)
            "--no-audio",               // we don't want audio (decoding)
            "--no-video-title-show",    // nor the filename displayed
            "--no-stats",               // no stats
            "--no-sub-autodetect-file", // we don't want subtitles
            "--no-inhibit",             // we don't want interfaces
            "--no-disable-screensaver", // we don't want interfaces
            "--no-snapshot-preview",    // no blending in dummy vout
    };
    MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory(VLC_ARGS);

    // Create player.
    HeadlessMediaPlayer mediaPlayer = mediaPlayerFactory.newHeadlessMediaPlayer();

    // Select input device.
    String mrl = "v4l2:///dev/video0";  // Linux

    // Start processing.
    mediaPlayer.startMedia(mrl);

    BufferedImage bufImg;
    for (int i = 0; i < 1000; ++i) {
        bufImg = mediaPlayer.getSnapshot();

        // Do something with BufferedImage...
        // ...
    }

    // Stop processing.
    mediaPlayer.stop();

    // Finish program.
    mediaPlayer.release();
    mediaPlayerFactory.release();
}
于 2012-10-05T23:35:19.807 に答える
2

ネイティブウィンドウについて:VLCjは、VLCライブラリへの共有インスタンスを開きます。

ヘッドレスメディアパイヤーは、ビデオまたはオーディオ出力を目的としていません。

実際、再生するものが必要な場合(他の場所にストリーミングしない場合)は、出力ウィンドウを作成するか、ダイレクトメディアプレーヤーを使用する必要があります(はるかに複雑な場合があります)。したがって、ヘッドレスプレーヤーで何かを再生する必要がある場合は、再生を実行するためのネイティブウィンドウを開きます!

ソース:http ://www.capricasoftware.co.uk/wiki/index.php?title = Vlcj_Media_Players

エラーについて:ビデオ表示コンポーネントは、パネル、ウィンドウ、または追加された場所の最上位コンポーネントである必要があります。そうしないと、エラーがスローされます

メインvout表示エラー:上に設定できませんでした

さらに、コンポーネントの上に何かを置くと、ビデオ出力が破壊され、機能しなくなります。

とにかく、DirectMediaPlayerがどのように機能するかは詳しくわかりませんが、VLCjには奇妙な動作があります...getSnapshot()ビデオ表示コンポーネントが必要かもしれませんが、よくわかりません。

まだ終わっていないプログラムについて:あなたは自分のスレッドを終えるために参加します。待機している他のスレッドが終了するまでスレッドが「スリープ」するため、これは機能しませんが、これは独自のスレッドであるため、「スリープ」して終了しません。この動作は、mainメソッドの次の短いコードでテストできます。

System.out.println("Test start");
Thread.currentThread().join();
System.out.println("Test stop");

「テスト停止」ステートメントに到達することはありません。

于 2012-10-04T21:41:47.390 に答える