Я использую 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
Почему вывод записи на экране Java играет быстрее, чем в режиме реального времени, и как я могу его исправить? ⇐ JAVA
Программисты JAVA общаются здесь
1737837577
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;
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79387488/why-is-my-java-screen-recording-output-playing-faster-than-real-time-and-how-ca[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия