Почему запись экрана Java воспроизводится быстрее, чем в реальном времени, и как это исправить?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему запись экрана Java воспроизводится быстрее, чем в реальном времени, и как это исправить?

Сообщение Anonymous »

Я использую Java для записи экрана и сохранения его в виде файла MP4, но выходное видео воспроизводится намного быстрее, чем в реальном времени. Мне нужно, чтобы видео воспроизводилось синхронно с реальными событиями, происходящими на экране (т. е. 1 секунда записи должна соответствовать 1 секунде видео).
Вот краткое описание моего подход:
Я использую java.awt.Robot для захвата кадров экрана через определенный интервал.
Я сохраняю захваченные кадры с помощью библиотеки (например, Xuggler или JCodec) и компилирую их в файл MP4.
Проблема в том, что видео воспроизводится слишком быстро. Кажется, частота кадров слишком высока или время между кадрами настроено неправильно, что приводит к быстрому воспроизведению.
Что мне нужно:
Способ гарантировать, что захваченные кадры обрабатываются с правильной скоростью и поддерживать скорость воспроизведения в реальном времени.
Как настроить частоту кадров или время при сохранении видео, чтобы обеспечить его воспроизведение с высокой скоростью. правильная скорость (1 секунда видео должна равняться 1 секунде реального времени).
Кто-нибудь столкнулись с этой проблемой и нашли способ исправить ее в Java?
import com.xuggle.mediatool.IMediaWriter;
import com.xuggle.mediatool.ToolFactory;
import com.xuggle.xuggler.ICodec;
import com.xuggle.xuggler.IRational;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.concurrent.TimeUnit;

public class ScreenRecorder {
private static final int FRAME_RATE = 30; // Frames per second
private static final int SECONDS_TO_RUN = 10; // Duration of the recording
private static final String OUTPUT_FILE = "output.mp4";

public static void main(String[] args) {
try {
// Get screen dimensions
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
int width = screenSize.width;
int height = screenSize.height;

// Create media writer using Xuggler
IMediaWriter writer = ToolFactory.makeWriter(OUTPUT_FILE);
IRational frameRate = IRational.make(FRAME_RATE, 1);

// Add a video stream to the writer
writer.addVideoStream(0, 0, ICodec.ID.CODEC_ID_H264, frameRate, width, height);

// Set up the screen capture
Robot robot = new Robot();
Rectangle captureArea = new Rectangle(screenSize);

System.out.println("Recording started...");
long startTime = System.nanoTime();

// Capture frames for the specified duration
for (int i = 0; i < SECONDS_TO_RUN * FRAME_RATE; i++) {
// Capture screen as BufferedImage
BufferedImage screenCapture = robot.createScreenCapture(captureArea);

// Convert BufferedImage to type BGR_24 for Xuggler
BufferedImage bgrScreen = convertToType(screenCapture, BufferedImage.TYPE_3BYTE_BGR);

// Encode frame into video
writer.encodeVideo(0, bgrScreen, System.nanoTime() - startTime, TimeUnit.NANOSECONDS);

// Sleep to maintain frame rate
Thread.sleep(1000 / FRAME_RATE);
}

// Close the writer
writer.close();
System.out.println("Recording saved to " + OUTPUT_FILE);

} catch (Exception e) {
e.printStackTrace();
}
}

/**
* Converts a BufferedImage to a specific type.
*
* @param sourceImage the image to convert
* @param targetType the desired BufferedImage type
* @return the converted BufferedImage
*/
private static BufferedImage convertToType(BufferedImage sourceImage, int targetType) {
if (sourceImage.getType() == targetType) {
return sourceImage;
}

BufferedImage image = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), targetType);
Graphics2D g = image.createGraphics();
g.drawImage(sourceImage, 0, 0, null);
g.dispose();

return image;
}
}



Подробнее здесь: https://stackoverflow.com/questions/793 ... and-how-ca
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»