У меня есть код, который записывает видео со сжатием H.264 (MPEG-4), но я хочу использовать MJPEG - PullRequest
1 голос

Я разрабатываю программу, которая делает изображения с камеры, компилирует видео и сохраняет его в указанном каталоге.Я буду использовать готовый код для реализации функции сохранения видео.В этом примере используется сжатие H.264.Но я хочу, чтобы видео записывалось в формате MJPEG .Как я могу это сделать?

У меня есть следующий рабочий код:

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;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Runner implements Runnable {
private static final String PATH = "C:\\temp\\video";
private static final DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH_mm_ss");
private static final String videoFormat = "mp4";
private static final int COUNT_FRAME = 100;
private Webcam webcam;

@Override
public void run() {
    webcam = Webcam.getDefault();
    webcam.setViewSize(WebcamResolution.VGA.getSize());
    webcam.open();

    LocalDateTime now = LocalDateTime.now();
    File saveVideo = new File(PATH, String.format("%s - %s.%s", now.format(format), webcam.getName(), videoFormat));

    IMediaWriter writer = ToolFactory.makeWriter(saveVideo.getAbsolutePath());
    Dimension size = webcam.getViewSize();
    writer.addVideoStream(0, 0, ICodec.ID.CODEC_ID_MJPEG, size.width, size.height);
    long start = System.currentTimeMillis();

    for (int i = 0; i < COUNT_FRAME; i++) {
        System.out.println(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);

        try {
            Thread.sleep(20);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

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

public static void main(String[] args) {
    new Thread(new Runner()).start();
}
}

Я пытался использовать ICodec.ID.CODEC_ID_MJPEG и videoFormat = "avi" вместо ICodec.ID.CODEC_ID_H264 и videoFormat = "mp4", но яполучить следующую ошибку:

Exception in thread "Thread-0" java.lang.RuntimeException: could not open stream 
 com.xuggle.xuggler.IStream@358368560[index:0;id:0;streamcoder:com.xuggle.xuggler.IStreamCoder@358414416[codec=com.xuggle.xuggler.ICodec@358354608[type=CODEC_TYPE_VIDEO;id=CODEC_ID_MJPEG;name=mjpeg;];time base=1/1000000;frame rate=0/0;pixel type=YUV420P;width=640;height=480;];framerate:0/0;timebase:1/90000;direction:OUTBOUND;]: Operation not permitted
    at com.xuggle.mediatool.MediaWriter.openStream(MediaWriter.java:1192)
    at com.xuggle.mediatool.MediaWriter.getStream(MediaWriter.java:1052)
    at com.xuggle.mediatool.MediaWriter.encodeVideo(MediaWriter.java:742)
    at com.xuggle.mediatool.MediaWriter.encodeVideo(MediaWriter.java:783)
    at by.zaharik.Runner.run(Runner.java:48)
    at java.lang.Thread.run(Thread.java:748)

У меня есть файл pom.xml:

    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>by.zaharik</groupId>
    <artifactId>UseBarCamera</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>com.github.sarxos</groupId>
            <artifactId>webcam-capture</artifactId>
            <version>0.3.12</version>
        </dependency>
        <dependency>
            <groupId>com.github.sarxos</groupId>
            <artifactId>webcam-capture-driver-ipcam</artifactId>
            <version>0.3.12</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.26</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/xuggle/xuggle-xuggler -->
        <dependency>
            <groupId>xuggle</groupId>
            <artifactId>xuggle-xuggler</artifactId>
            <version>5.4</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
...