如何使用JavaCV从网络摄像头捕获和录制视频

时间:2012-12-28 13:36:49

标签: video-capture javacv

我是JavaCV的新手,我很难找到关于我感兴趣的主题的不同问题的好教程。我已经成功实现了我网络摄像头的某种实时视频流,但问题是我使用这个在网上找到的代码片段:

@Override
    public void run() {

        FrameGrabber grabber = new VideoInputFrameGrabber(0); // 1 for next
                                                                // camera
        int i = 0;
        try {
            grabber.start();
            IplImage img;
            while (true) {
                img = grabber.grab();
                if (img != null) {
                    cvFlip(img, img, 1);// l-r = 90_degrees_steps_anti_clockwise
                    cvSaveImage((i++) + "-aa.jpg", img);
                    // show image on window
                    canvas.showImage(img);
                }

导致多个jpg文件。

我真正想要做的是捕获我的网络摄像头输入并显示它我想将其保存在正确的视频文件中。我发现了FFmpegFrameRecorder,但不知道如何实现它。另外我一直想知道视频文件格式有哪些不同的选项,因为flv对我来说可能更有用。

1 个答案:

答案 0 :(得分:4)

这是一段非常艰难的旅程。还有一些事情我不确定它们背后的含义是什么,但这是一个使用JavaCV从网络摄像头捕获和录制视频的工作示例:

import com.googlecode.javacv.CanvasFrame;
import com.googlecode.javacv.FFmpegFrameRecorder;
import com.googlecode.javacv.OpenCVFrameGrabber;
import com.googlecode.javacv.cpp.avutil;
import com.googlecode.javacv.cpp.opencv_core.IplImage;

public class CameraTest {

    public static final String FILENAME = "output.mp4";

    public static void main(String[] args) throws Exception {
        OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
        grabber.start();
        IplImage grabbedImage = grabber.grab();

        CanvasFrame canvasFrame = new CanvasFrame("Cam");
        canvasFrame.setCanvasSize(grabbedImage.width(), grabbedImage.height());

        System.out.println("framerate = " + grabber.getFrameRate());
        grabber.setFrameRate(grabber.getFrameRate());
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(FILENAME,  grabber.getImageWidth(),grabber.getImageHeight());

        recorder.setVideoCodec(13);
        recorder.setFormat("mp4");
        recorder.setPixelFormat(avutil.PIX_FMT_YUV420P);
        recorder.setFrameRate(30);
        recorder.setVideoBitrate(10 * 1024 * 1024);

        recorder.start();
        while (canvasFrame.isVisible() && (grabbedImage = grabber.grab()) != null) {
            canvasFrame.showImage(grabbedImage);
            recorder.record(grabbedImage);
        }
        recorder.stop();
        grabber.stop();
        canvasFrame.dispose();
    }
}

如果你按照官方指南关于如何在Windows 7 / 64bit上设置JavaCV并希望使用上面的代码捕获视频,那么除了那些可能有相同问题的工作之外,我有点难以完成这项工作。您应该在C:\C:\ffmpeg中创建一个新目录,并从官方指南中提示您下载的ffmped版本中提取文件。然后,您应该将C:\ffmpeg\bin添加到Enviorment variable PATH,这就是全部。关于此步骤,所有积分将转至karlphillip

和他的帖子here