2

問題についてアドバイスを得ることができれば素晴らしいと思います。接続されているPCカメラのリストをユーザーに表示するアプリケーションを使用しています。たとえば、ノートブックを使用すると、1台の内蔵Webカメラと1台のUSBカメラがあります。アプリケーションを実行するとき、ユーザーは目的のデバイスを選択し、それを使用して写真を作成できる必要があります。

私はこの問題に数日間取り組み、次の既存のフレームワークを使用して調査しました:JMF、FMJ、VLCJ、Xuggler、JMyron、JavaFX、JavaCV。

それらのいくつかは非推奨になりました。その他の場合は、クライアントPCごとにSDKをインストールする必要があります。ただし、私のアプリケーションの主な要件は移植性です。そのため、外部SDKを使用することに慣れています。

Javaのみを使用してこのタスクを完了することは可能ですか?

今のところ、私のアプリケーションはWindowsOSでのみ動作するはずです。

それで、私の問題を解決する方法についてアドバイスをいただけますか?

よろしく、Evgeniy

4

1 に答える 1

0

早めに質問を投稿してすみません。この問題を解決しました。LTI-CIVILを使用しました。それは5年間更新されていません...とにかく、それは私のすべてのウェブカメラマンのためにうまく働きます。使用例の1つを少し変更して、既存のデバイスを切り替えました。これが私のコードです:

    public class CaptureFrame extends ImageFrame
{
private Map <String, String>cams = new HashMap<String, String>();
public static void main(String[] args) throws CaptureException
{
    new CaptureFrame(DefaultCaptureSystemFactorySingleton.instance()).run();
}

private CaptureSystem system;
private CaptureStream captureStream;
private final CaptureSystemFactory factory;
private volatile boolean disposing = false;

public CaptureFrame(CaptureSystemFactory factory)
{   
    super("LTI-CIVIL");
    this.factory = factory;
}

public void run() throws CaptureException
{
    initCapture();

    setLocation(200, 200);
    addWindowListener(new WindowAdapter()
    {
        public void windowClosing(WindowEvent e)
        {
            try
            {
                disposeCapture();
            } catch (CaptureException e1)
            {
                e1.printStackTrace();
            }
            System.exit(0);
        }
    });
    setVisible(true);
    pack();

    system = factory.createCaptureSystem();
    system.init();
    List <CaptureDeviceInfo>list = system.getCaptureDeviceInfoList();
    String[] possibilities = new String[list.size()];
    int i=0;
    for (CaptureDeviceInfo info : list){
        possibilities[i] = info.getDescription();
        cams.put(info.getDescription(), info.getDeviceID());
        i++;
    }
    String s = (String) JOptionPane.showInputDialog(
            this,
            "Please, choose needed web camera:\n",
            "Select one...",
            JOptionPane.PLAIN_MESSAGE,
            null,
            possibilities, null);
    captureStream = system.openCaptureDeviceStream(cams.get(s));
    captureStream.setObserver(new MyCaptureObserver());
    setSize(captureStream.getVideoFormat().getWidth(), captureStream.getVideoFormat().getHeight());
    startCapture();
}



public void initCapture() throws CaptureException
{
    system = factory.createCaptureSystem();
    system.init();
}

public void startCapture() throws CaptureException
{
    captureStream.start();
}

public void disposeCapture() throws CaptureException
{
    disposing = true;
    if (captureStream != null)
    {   System.out.println("disposeCapture: stopping capture stream...");
        captureStream.stop();
        System.out.println("disposeCapture: stopped capture stream.");
        captureStream.dispose();
        captureStream = null;
    }
    if (system != null)
        system.dispose();
    System.out.println("disposeCapture done.");
}

class MyCaptureObserver implements CaptureObserver
{
    public void onError(CaptureStream sender, CaptureException e)
    {   
        e.printStackTrace();
    }

    public void onNewImage(CaptureStream sender, com.lti.civil.Image image)
    {   
        if (disposing)
            return;
        try
        {
            setImage(AWTImageConverter.toBufferedImage(image));
        }
        catch (Throwable t)
        {   t.printStackTrace();
        }
    }
}
}

また、私のプロジェクトのサイズは、WindowsOS用のすべての.dllライブラリでわずか約3MBです。

それが誰かに役立つことを願っています。

よろしく、Evgeniy

于 2012-09-16T21:33:47.270 に答える