3

我是 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可能对我更有用。

4

1 回答 1

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/64 位上设置 JavaCV 的官方指南并希望使用上面的代码捕获视频,您应该创建在C:\:中创建一个新目录,然后从官方指南中告诉您下载C:\ffmpeg的版本中提取文件。ffmped然后你应该添加C:\ffmpeg\bin到你的Enviorment variable PATH,仅此而已。关于这一步,所有学分都归于 karlphillip

和他的帖子在这里

于 2012-12-29T12:26:59.763 回答