Xuggler не может сохранить видео внутри запускаемого метода - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть ImageView, который показывает веб-камеру на основе библиотеки веб-камеры Sarxos.Я отлично показываю трансляцию с веб-камеры. Я пытаюсь захватить видео с этой веб-камеры.

Я использовал пример на основе Encoder.java, который находится в папке webcam-capture-master \ webcam-capture-examples.

import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.io.File;

import com.github.sarxos.webcam.Webcam;
import com.github.sarxos.webcam.WebcamResolution;
import com.xuggle.mediatool.IMediaWriter;
import com.xuggle.mediatool.ToolFactory;
import com.xuggle.xuggler.ICodec;
import com.xuggle.xuggler.IPixelFormat;
import com.xuggle.xuggler.IVideoPicture;
import com.xuggle.xuggler.video.ConverterFactory;
import com.xuggle.xuggler.video.IConverter;


public class Encoder {

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

        File file = new File("output2.mp4");

        IMediaWriter writer = ToolFactory.makeWriter(file.getName());
        Dimension size = WebcamResolution.QVGA.getSize();

        writer.addVideoStream(0, 0, ICodec.ID.CODEC_ID_H264, size.width, size.height);

        Webcam webcam = Webcam.getDefault();
        webcam.setViewSize(size);
        webcam.open(true);

        long start = System.currentTimeMillis();

        for (int i = 0; i < 50; i++) {

            System.out.println("Capture frame " + i);

            BufferedImage image = ConverterFactory.convertToType(webcam.getImage(), BufferedImage.TYPE_3BYTE_BGR);
            IConverter converter = ConverterFactory.createConverter(image, IPixelFormat.Type.YUV420P);

            IVideoPicture frame = converter.toPicture(image, (System.currentTimeMillis() - start) * 1000);
            frame.setKeyFrame(i == 0);
            frame.setQuality(0);

            writer.encodeVideo(0, frame);

            // 10 FPS
            Thread.sleep(100);
        }

        writer.close();

        System.out.println("Video recorded in file: " + file.getAbsolutePath());
    }
}

Это сохраняет видео и показывает отлично. Для этого нужна библиотека Xugglerкак зависимость.Я использую версию 5.4 в качестве .jar, она отлично работает.

В моем реальном коде я хочу использовать захват с веб-камеры

protected void startWebCamStream() {
        File file = new File("output.mp4");
        // -> -> -> -> -> -> -> ->  > -> -> -> >


        if(file == null) {
            System.out.println("error");
            exit(2);
        }

       IMediaWriter writer = ToolFactory.makeWriter(file.getName());
        writer.setMaskLateStreamExceptions(true); // KAPATMIYOSA -->

       /* vidStop.setOnAction(new EventHandler<ActionEvent>() {
            @Override public void handle(ActionEvent e) {
                writer.close();
            }
        });
        */

       Dimension size = WebcamResolution.QQVGA.getSize(); // SUNA BAKMAM LAZIM KESIN YANLIS

        //Dimension size = new Dimension(190,290);

       writer.addVideoStream(0, 0, ICodec.ID.CODEC_ID_H264, size.width, size.height);




        stopCamera = false;
        Task<Void> task = new Task<Void>() {

            @Override
            protected Void call() throws Exception {
                //while(!stopcam)
                long start = System.currentTimeMillis();

                for(int i=0;!stopCamera;i++) {
                    try {
                            if ((grabbedImage = selWebCam.getImage()) != null) {

                            int finalI = i;

                            Platform.runLater(new Runnable() {

                                @Override
                                public void run() {

                                    BufferedImage image = ConverterFactory.convertToType(selWebCam.getImage(), BufferedImage.TYPE_3BYTE_BGR);
                                    IConverter converter = ConverterFactory.createConverter(image, IPixelFormat.Type.YUV420P);

                                    IVideoPicture frame = converter.toPicture(image,(System.currentTimeMillis() - start) * 1000);
                                    frame.setKeyFrame(finalI == 0);
                                    frame.setQuality(0);

                                    writer.encodeVideo(finalI, frame);


                                    final Image mainiamge = SwingFXUtils
                                            .toFXImage(grabbedImage, null);
                                    imageProperty.set(mainiamge);
                                    // BURAYI SILMEK GEREKIR MI BİLMIYOM
                                    try {
                                        sleep(30);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }

                                }
                            });

                            grabbedImage.flush();

                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                writer.setForceInterleave(false);
//                writer.setForceInterleave(false);



                return null;
            }

        };
        Thread th = new Thread(task);
        th.setDaemon(true);
        th.start();
        imgWebCamCapturedImage.imageProperty().bind(imageProperty);

    }

Этот код записывает видео не так корректно.(Он показывает веб-камеру по-прежнему отлично.) Сохраняет MP4 файл 1 КБ, который не работает.

В чем проблема?Мои предположения

-> Размер, не соответствующий фактическому размеру ImageView, вызвал много ошибок при попытке скомпилировать этот код.Я сильно изменился.Если я изменяю Размеры на другой, это дает ошибку / предупреждение.-> Подходящий метод вроде программы брокеров?Рабочая программа записи не имеет разницы

Пожалуйста, любая помощь приветствуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...