2011-04-30 30 views
0

以下是捕获屏幕并使用xuggler制作视频的代码,它工作正常,但生成的视频中没有鼠标光标。我也想捕获鼠标指针来显示鼠标的活动。使用xuggler捕获带鼠标指针的屏幕

有人能指导我做到这一点。

package com.test.video; 

import java.awt.AWTException; 
import java.awt.Dimension; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.MouseInfo; 
import java.awt.Rectangle; 
import java.awt.Robot; 
import java.awt.Toolkit; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.util.concurrent.TimeUnit; 

import javax.imageio.ImageIO; 


import com.xuggle.mediatool.IMediaWriter; 
import com.xuggle.mediatool.ToolFactory; 
import com.xuggle.xuggler.ICodec; 

public class ScreenRecordingExample { 

    private static final double FRAME_RATE = 5; 

    private static final int SECONDS_TO_RUN_FOR = 120; 

    private static final String outputFilename = "c:/mydesktop.mp4"; 

    private static Dimension screenBounds; 

    private static Graphics2D imageGraphics; 

    public static Image m_MouseIcon = null; 

    public static void main(String[] args) { 

     // let's make a IMediaWriter to write the file. 
     final IMediaWriter writer = ToolFactory.makeWriter(outputFilename); 

     screenBounds = Toolkit.getDefaultToolkit().getScreenSize(); 

     // 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, ICodec.ID.CODEC_ID_MPEG4, screenBounds.width/2, screenBounds.height/2); 

     long startTime = System.nanoTime(); 

     try { 
      m_MouseIcon = ImageIO.read(ScreenRecordingExample.class.getResource("resource/captionMouseIcon.png")); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

     for (int index = 0; index < SECONDS_TO_RUN_FOR * FRAME_RATE; index++) { 

      // take the screen shot 
      BufferedImage screen = getDesktopScreenshot(); 

      // convert to the right image type 
      BufferedImage bgrScreen = convertToType(screen, BufferedImage.TYPE_3BYTE_BGR); 

      // encode the image to stream #0 
      writer.encodeVideo(0, bgrScreen, System.nanoTime() - startTime, TimeUnit.NANOSECONDS); 

      // sleep for frame rate milliseconds 
      try { 
       Thread.sleep((long) (1000/FRAME_RATE)); 
      } 
      catch (InterruptedException e) { 
       // ignore 
      } 

     } 

     // tell the writer to close and write the trailer if needed 
     writer.close(); 

    } 

    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; 

    } 

    private static BufferedImage getDesktopScreenshot() { 
     try { 
      Robot robot = new Robot(); 
      Rectangle captureSize = new Rectangle(screenBounds); 
      return robot.createScreenCapture(captureSize); 
     } 
     catch (AWTException e) { 
      e.printStackTrace(); 
      return null; 
     } 

    } 

} 

谢谢,

+0

下面是示例代码。 http://stackoverflow.com/questions/2962271/how-to-capture-screen-image-with-mouse-pointer-on-it-in-java/2962377#2962377 – 2011-07-03 05:36:09

回答

0

使用MouseInfo.getPointerInfo().getLocation()获取指针的当前位置。画一个'接近传真'(1)上的指针BufferedImage


1)对于Screenshooter,我使用指针的GIF图像。

+1

这将不会给动态游标类型,而采取截图。 – 2012-12-11 20:56:25

0

您可以使用Java Native Access(JNA)实时检索特定于操作系统的鼠标光标类型,然后从系统文件(windows中的user32.dll)中提取其图像并将其叠加在屏幕截图上。

+0

你能解决这个问题的地方?你能否给我们提供关于解决方案的更多细节? – 2013-08-19 06:29:51