Я разрабатываю программу, которая делает изображения с камеры, компилирует видео и сохраняет его в указанном каталоге.Я буду использовать готовый код для реализации функции сохранения видео.В этом примере используется сжатие 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>