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

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

Сообщение Anonymous »

Я использую Java для записи экрана и сохранить его в качестве файла MP4, но выходное видео играет намного быстрее, чем в режиме реального времени. Мне нужно видео, чтобы воспроизводить синхронизацию с фактическими событиями, происходящими на экране (то есть 1 секунда записи должна соответствовать 1 секунду в видео). < /P>
Вот краткое описание моего Подход: < /p>
Я использую java.awt.robot для захвата кадров экрана в определенном интервале. их в файл MP4.
Проблема в том, что видео воспроизводится слишком быстро. Кажется, что частота кадров слишком высока, или время между кадрами не регулируется, что вызывает быстрое воспроизведение. < /P>
Что мне нужно: < /p>
способ обеспечить обработку захваченных рам Правильная скорость (1 секунда видео должна равняться 1 секунду фактического времени).
кто -нибудь столкнулся с этой проблемой и нашел способ исправить ее в Java? < /p>
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»