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