Как захватить изображение с веб-камеры, пока она уже транслируется с веб-камеры с помощью Java Gstreamer?

Я использую библиотеку gstreamer для проекта Java, который должен быть в состоянии захватить изображение с веб-камеры.

У меня уже есть код, который отображает поток веб-камеры, я просто не могу понять, как сделать снимок нажатием кнопки рядом с ним.

Я искал в Интернете, но мог найти только фрагменты кода, которые показывают либо поток, либо захват изображения, но ни один из них не иллюстрировал оба... Я пытался объединить эти фрагменты кода, но это не сработало для меня или.

Что я должен сделать, чтобы заставить это работать?

public class WebcamPanel extends JPanel {

    private static Pipeline pipe; 

    public WebcamPanel(){

        String[] args = {};
        args = Gst.init("Webcam", args); 

        pipe = new Pipeline("pipeline");

        final Element videosrc = ElementFactory.make("dshowvideosrc", "source"); 
        final Element videofilter = ElementFactory.make("capsfilter", "flt"); 
        videofilter.setCaps(Caps.fromString("video/x-raw-yuv, width=320, height=240")); 

        setLayout(new GridBagLayout());
        final GridBagConstraints c = new GridBagConstraints();

        JButton takePic = new JButton();
        takePic.setPreferredSize(new Dimension(50,50));

        c.gridx = 0;
        c.insets = new Insets(0,10,0,0);
        add(takePic,c);

        c.gridx = 2;
        c.gridwidth = GridBagConstraints.REMAINDER;
        c.insets = new Insets(0,40,0,0);

        SwingUtilities.invokeLater(new Runnable() { 
            public void run() { 
                VideoComponent videoComponent = new VideoComponent(); 
                Element videosink = videoComponent.getElement(); 
                // This gives 2nd window with stream from webcam 
                // Element videosink = ElementFactory.make("xvimagesink", "sink"); 
                pipe.addMany(videosrc, videofilter, videosink); 
                Element.linkMany(videosrc, videofilter, videosink); 

                videoComponent.setPreferredSize(new Dimension(320, 240)); 
                add(videoComponent,c);
                videoComponent.setVisible(true);
                // Start the pipeline processing 
                pipe.setState(State.PLAYING); 
            }
        });

    }
}

1 ответ

Вы взглянули на camerabin2? Это позволит реализовать весь рабочий процесс камеры (видоискатель, захват изображения, захват видео, эффекты, ...). Основной подход заключается в том, чтобы либо отвести второй поток и захватить с него выбранные изображения (например, использовать вентиль! Jpegenc! Multifilesink и открыть клапан для выбранных изображений), либо использовать селектор вывода для канала для сохранения изображений или использовать буферный зонд (хакерский).

Другие вопросы по тегам