# Fehlende Video Codecs bei Opencv



## Kristian (12. Mai 2016)

Hallo zusammen,

ich versuche mit Hilve von OpenCV 3.1 das Video einer Webcam ab zu speichern. Das Programm funktioniert auch. Das Problem ist jedoch der Videocodec. Nur wenn ich MJPG nutze wird tatsächlich das Video abgespeichert, bei allen anderen Codecs bleibt die Datei leer.
Wenn ich bei der Erzeugung des VideoWriters als fourcc - Code "-1" mitgebe öffnet sich zur Laufzeit ein Fenster aus dem ich den zu verwendenden Codec auswählen kann. Hier stehen mir aber nur fünf Formate zur Auswahl. Auch hier funktioniert nur die Auswahl Volle Einzelbilder. Leider haben jedoch viele Player Probleme damit diese Dateien zu öffnen. 



Außerdem scheint es sich um ein unkomprimiertes Format zu handeln. Die Datei wird also ziemlich groß.

Hier ist mein Code:


```
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.VideoWriter;
import org.opencv.videoio.Videoio;

public class KriPanel extends JPanel implements Runnable {

    private int count = 0;
    private VideoCapture camSource = null;
    private Mat frame;
    private MatOfByte mem;
    private VideoWriter oVideoWriter;
    private int cameraID;
    private String cameraIP;
    private Boolean run = false;

    public KriPanel(int cameraID, String cameraIP) {
          System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // load native library of opencv
        this.setSize(105, 160);
        this.setVisible(true);
        initComponents();
        this.cameraID = cameraID;
        this.cameraIP = cameraIP;
        this.cameraID = 1;
        frame = new Mat();
        mem = new MatOfByte();
    }

    @Override
    public void run() {
        System.out.println("Run");
        synchronized (this) {
            while (true) {
                if (camSource.grab()) {
                    try {
                        camSource.retrieve(frame);
                        Imgcodecs.imencode(".bmp", frame, mem);
                        Image im = ImageIO.read(new ByteArrayInputStream(mem.toArray()));
                        BufferedImage buff = (BufferedImage) im;
                        // Image jPanel1;
                        Graphics g = this.getGraphics();
                        System.out.println("Graphics: " +g);
                        oVideoWriter.write(frame);
                        if (g.drawImage(buff, 0, 0, 160, 110, 0, 0, 640, 480, null))
                            ;
                        /*
                         * if (g.drawImage(buff, 0, 0, getWidth(), getHeight() -
                         * 150, 0, 0, buff.getWidth(), buff.getHeight(), null))
                         */
                    } catch (Exception ex) {
                        System.out.println("Error");
                    }
                }
            }
        }
    }

    private void initComponents() {
        if (cameraID != 42) {
            camSource = new VideoCapture(cameraID);
        } else {
            camSource = new VideoCapture(cameraIP);
        }
        if (!camSource.isOpened()) {
            System.out.println("Camera Error");
        } else {
            System.out.println("Camera OK");
        }

        Size frameSize = new Size((int) camSource.get(Videoio.CAP_PROP_FRAME_WIDTH),
                (int) camSource.get(Videoio.CAP_PROP_FRAME_HEIGHT));
        String filename = "./Test.avi";
        FourCC fourCC = new FourCC("MJPG");
        System.out.println(frameSize);
        //oVideoWriter = new VideoWriter(filename, fourCC.toInt(), 20, frameSize, true);
        oVideoWriter = new VideoWriter(filename, -1, 20, frameSize, true);
    }

}
```

Ich benutze Windows 7 und Eclipse.

Hat jemand eine Idee wie ich an weitere Codecs kommen kann?


----------

