J'ai une application pour capturer la vidéo de l'écran et enregistrer dans un fichier. Je donne à l'utilisateur la possibilité de choisir entre 480, 720, et les tailles de vidéo "Plein écran". Un 480 enregistrera dans une petite case sur l'écran, 720 enregistrera dans une plus grande boîte, et bien sûr, "Full Screen" enregistrera dans une boîte encore plus grande. Cependant, cette boîte en plein écran n'est PAS la résolution d'écran réelle. C'est la taille de la fenêtre de l'application, qui se situe autour de 1700x800. L'outil vidéo fonctionne parfaitement pour les options 480 et 720, et fonctionnera également si "Plein écran" est écrasé pour être l'écran entier de 1920x1080.Cropping BufferedImage Pour une utilisation dans Xuggle encodeVideo
Ma question: Certaines tailles sont-elles autorisées? Est-ce que cela doit correspondre à un certain format ou être une résolution "acceptable"? Mon code, ci-dessous, est modifié à partir du fichier CaptureScreenToFile.java de xuggle (l'emplacement du problème est noté par les commentaires):
public void run() {
try {
String parent = "Videos";
String outFile = parent + "example" + ".mp4";
file = new File(outFile);
// This is the robot for taking a snapshot of the screen. It's part of Java AWT
final Robot robot = new Robot();
final Rectangle customResolution = where; //defined resolution (custom record size - in this case, 1696x813)
final Toolkit toolkit = Toolkit.getDefaultToolkit();
final Rectangle fullResolution = new Rectangle(toolkit.getScreenSize()); //full resolution (1920x1080)
// First, let's make a IMediaWriter to write the file.
final IMediaWriter writer = ToolFactory.makeWriter(outFile);
writer.setForceInterleave(false);
// We tell it we're going to add one video stream, with id 0,
// at position 0, and that it will have a fixed frame rate of
// FRAME_RATE.
writer.addVideoStream(0, 0, FRAME_RATE, customResolution.width, customResolution.height); //if I use fullResolution, it works just fine - but captures more of the screen than I want.
// Now, we're going to loop
long startTime = System.nanoTime();
while (recording) {
// take the screen shot
BufferedImage screen = robot.createScreenCapture(fullResolution); //tried capturing using customResolution, but did not work. Instead, this captures full screen, then tries to trim it below (also does not work).
// convert to the right image type
BufferedImage bgrScreen = convertToType(screen, BufferedImage.TYPE_3BYTE_BGR); //Do I need to convert after trimming?
BufferedImage trimmedScreen = bgrScreen.getSubimage((int)customResolution.getX(), (int)customResolution.getY(), (int)customResolution.getWidth(), (int)customResolution.getHeight());
// encode the image
try{
//~~~~Problem is this line of code!~~~~ Error noted below.
writer.encodeVideo(0, trimmedScreen, System.nanoTime() - startTime, TimeUnit.NANOSECONDS); //tried using trimmedScreen and bgrScreen
} catch (Exception e) {
e.printStackTrace();
}
// sleep for framerate milliseconds
Thread.sleep((long) (1000/FRAME_RATE.getDouble()));
}
// Finally we tell the writer to close and write the trailer if
// needed
writer.close();
} catch (Throwable e) {
System.err.println("an error occurred: " + e.getMessage());
}
}
public static BufferedImage convertToType(BufferedImage sourceImage, int targetType) {
BufferedImage image;
// if the source image is already the target type, return the source image
if (sourceImage.getType() == targetType)
image = sourceImage;
// otherwise create a new image of the target type and draw the new image
else {
image = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), targetType);
image.getGraphics().drawImage(sourceImage, 0, 0, null);
}
return image;
}
Erreur: java.lang.RuntimeException: ne pouvait pas flux ouvert com.xuggle. [email protected] [index: 0; id: 0; streamcoder: [email protected] [codec = [email protected] [type = CODEC_TYPE_VIDEO; id = CODEC_ID_H264; nom = libx264; ]; base de temps = 1/50; fréquence d'image = 0/0; type de pixel = YUV420P; largeur = 1696; hauteur = 813;]; framerate: 0/0; base de temps: 1/90000; direction: OUTBOUND;]: Opération non autorisé
Remarque: Le fichier a été créé avec succès, mais sa taille est zéro et ne peut pas être ouvert par Windows Media. a Player, avec le texte d'erreur suivant: Windows Media Player ne peut pas lire le fichier. Le lecteur peut ne pas prendre en charge le type de fichier ou ne pas prendre en charge le codec utilisé pour compresser le fichier.
Désolé pour la question verbeuse. Je suis intéressé à apprendre QUOI et POURQUOI, pas seulement une solution. Donc, si quelqu'un peut expliquer pourquoi cela ne fonctionne pas, ou me diriger vers du matériel pour aider, je l'apprécierais. Merci!
essayer d'avoir la dimension même nombre 1696x812 – gpasch
Wow, il est vraiment simple. Donc apparemment tout fonctionnait bien, il fallait juste de la logique pour éviter les nombres impairs dans les dimensions. Merci pour votre aide, si vous le mettez comme une réponse, je vais le marquer pour vous. – Tarm