2011-04-30 32 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