weixin_43146727 2024-12-31 00:10 采纳率: 33.3%
浏览 6

javacv-视频读取存储

使用javacv读取视频文件处理并保存,但是保存的文件无法打开
读取视频,给视频添加边框,做人脸识别并加框,按帧保存视频
相关代码


public static void test2() throws FFmpegFrameGrabber.Exception, FFmpegFrameRecorder.Exception {

        String path = "D:\\haarcascade_frontalface_alt.xml";
        CascadeClassifier classifier = new CascadeClassifier(path);

        String str = "D:\\test1.mp4";
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(str);
        grabber.start();

        String outputVideo = "D:\\"+ UUID.randomUUID()+ ".mp4";
        File file = new File(outputVideo);
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(file.getAbsolutePath(), grabber.getImageWidth(), grabber.getImageHeight());
        recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
        recorder.setFormat("mp4");
        recorder.start();

//        CanvasFrame canvasFrame = new CanvasFrame("Video");

        OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();
        // 边框的宽度和颜色
        int borderType = Core.BORDER_CONSTANT;
        int borderSize = 10; // 边框大小

        try {
        Frame frame;
        while ((frame = grabber.grab()) != null){
            Mat mat = converter.convert(frame);
            Mat gray = new Mat();
            // 转换为灰度图像
            cvtColor(mat, gray, COLOR_BGR2GRAY);
            // 加边框
            Mat borderedImg = new Mat();
//            opencv_core.copyMakeBorder(mat, borderedImg, borderSize,borderSize,borderSize,borderSize, borderType,Scalar.RED);
            opencv_core.copyMakeBorder(mat, borderedImg, borderSize,borderSize,borderSize,borderSize, borderType);
            if(classifier.empty()){
                System.out.println("Classifier failed to load!");
                break;
            }
            RectVector rectVector = new RectVector();
            //识别
            classifier.detectMultiScale(gray,rectVector);
            for (Rect rect : rectVector.get()){
                opencv_imgproc.rectangle(borderedImg, new Point(rect.x(), rect.y()),new Point(rect.x() + rect.width(), rect.y() + rect.height()), new Scalar(0,0, 0, 255));
            }
            //存储处理好的视频帧
            Frame frame1 = converter.convert(borderedImg);
            recorder.record(frame1);
//            canvasFrame.showImage(frame);
        }
        } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (grabber != null) {
            grabber.release();
            grabber.stop();
        }
        if (recorder != null) {
            recorder.release();
            recorder.stop();
        }
    }
    }

现象古-月

img

  • 写回答

2条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-12-31 08:35
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题导致你的保存视频无法打开的原因可能是视频编解码器不匹配。你在保存视频时使用了H.264编解码器,如果你的电脑上没有正确的解码器,那么保存的视频文件可能无法被正常解码播放。 你可以尝试更换不同的视频编解码器来保存视频文件,或者在保存视频之前先查询一下你的电脑支持的视频编解码器,并选择其中一个来保存视频。 另外,你可以在代码中添加一些打印信息来确认保存视频的过程是否正常,比如输出错误信息、保存的视频文件路径等。这样有助于排除问题。 案例代码:
    recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4); // 使用MPEG4编解码器
    

    这段代码将视频保存编码器改为了MPEG4,你可以尝试使用不同的编解码器来保存视频文件。

    评论

报告相同问题?

问题事件

  • 创建了问题 12月31日