java - 将屏幕和网络摄像头录制到视频文件

标签 java webcam jmf video-recording screen-recording

我正在尝试创建一个应用程序来录制用户屏幕或网络摄像头屏幕并保存到视频文件中。

我尝试使用 Java Media Framework 使其工作,但在 Windows 64 位中失败。 我发现 Java Media Framework 相当旧,现在不支持它:(

我的问题是: 还有其他库可以帮助我们录制网络摄像头的屏幕和视频吗? 如果不支持 Java,什么语言可以提供帮助?

我发现一些应用程序具有相同的功能: + http://www.screencast-o-matic.com/ + http://www.apowersoft.com/free-online-screen-recorder 这是一个java小程序,用户可以从服务器下载而无需安装。

提前谢谢您!

更新: 我正在 HTML5 中寻找另一种解决方案

更新:2013/07/05** 我发现WebRTC 1.0可以达到解决方案,但Google Chrome尚未支持Media Stream Recorder。

最佳答案

我有一个使用 com.xuggle 包录制屏幕的示例代码

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.util.concurrent.TimeUnit;

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

public class ScreenRecordingExample {

    private static final double FRAME_RATE = 50;

private static final int SECONDS_TO_RUN_FOR = 20;

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

    private static Dimension screenBounds;

    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();

        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;
        }

    }

}

关于java - 将屏幕和网络摄像头录制到视频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17438874/

相关文章:

java - 对使用包编译基本的java测试程序感到困惑

java - Java和Dart之间如何通过Socket进行通信

c++ - DirectShow:如何将视频捕获设备的流时间同步到系统时间

android - 是否可以在 Android 中使用 JMF?

java - 如何使用 SWT 访问网络摄像头

java - 包含多个图像的幻灯片放映?

c++ - 两个过滤器之间是否自动添加了解码器?

python - 将 RTSP 流转发到远程套接字(RTSP 代理?)

java - 找不到设备

java - toString 方法中应该包含什么,不应该包含什么?