【问题标题】:javacv error (Has setFormat() been called?)_javacv错误(是否调用了setFormat()?)_
【发布时间】:2015-03-16 13:03:37
【问题描述】:

嗨,我正在制作通过 javacv 录制带有音频的视频的程序,但我遇到了一些错误。有什么建议吗?

lib 版本:jdk 1.8 javacv 0.8 opencv 2.4.9

Exception in thread "main" org.bytedeco.javacv.FrameGrabber$Exception: avformat_open_input() error -2: Could not open input "output.mp4". (Has setFormat() been called?)
    at org.bytedeco.javacv.FFmpegFrameGrabber.startUnsafe(FFmpegFrameGrabber.java:362)
    at org.bytedeco.javacv.FFmpegFrameGrabber.start(FFmpegFrameGrabber.java:312)
    at com.unomic.securobot.javacv.main(javacv.java:14)

我的代码

FFmpegFrameGrabber grabber1 = new FFmpegFrameGrabber("output.mp4");
                FFmpegFrameGrabber grabber2 = new FFmpegFrameGrabber("test.mp3"); 
                grabber1.setFormat("mp4");
                grabber1.start(); 
                grabber2.start(); 
                FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("outputFinal.mp4", 
                        grabber1.getImageWidth(), grabber1.getImageHeight(), 
                        grabber2.getAudioChannels()); 
                recorder.setFrameRate(grabber1.getFrameRate()); 
                recorder.setSampleFormat(grabber2.getSampleFormat()); 
                recorder.setSampleRate(grabber2.getSampleRate()); 

                recorder.start(); 
                Frame frame1;
                Frame  frame2 = null; 
                while ((frame1 = grabber1.grabFrame()) != null || 
                       (frame2 = grabber2.grabFrame()) != null) { 
                    recorder.record(frame1); 
                    recorder.record(frame2); 
                } 
                recorder.stop(); 
                grabber1.stop(); 
                grabber2.stop(); 
}

【问题讨论】:

    标签: opencv javacv


    【解决方案1】:

    我试图使用抓帧器从视频中获取缩略图。我遇到了同样的错误,但后来我只是尝试给出文件的完整路径,瞧,它起作用了。以前,我使用的相对路径不起作用。当我给出完整路径时,它开始工作。

    package com.tape.controller;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import javax.imageio.ImageIO;
    import org.bytedeco.javacv.FFmpegFrameGrabber;
    import org.bytedeco.javacv.OpenCVFrameGrabber;
    
    public class VideoThumbTaker {
    
        protected String ffmpegApp;
    
        public VideoThumbTaker(String ffmpegApp)
        {
            this.ffmpegApp = ffmpegApp;
        }
    
        public void getThumb(String videoFilename, String thumbFilename, int width, int height,int hour, int min, float sec)
          throws IOException, InterruptedException
        {
            ProcessBuilder processBuilder = new ProcessBuilder(ffmpegApp, "-y", "-i", videoFilename, "-vframes", "1",
        "-ss", hour + ":" + min + ":" + sec, "-f", "mjpeg", "-s", width + "*" + height, "-an", thumbFilename);
            Process process = processBuilder.start();
            InputStream stderr = process.getErrorStream();
            InputStreamReader isr = new InputStreamReader(stderr);
            BufferedReader br = new BufferedReader(isr);
            String line;
            while ((line = br.readLine()) != null);
            process.waitFor();
        }
    
        public static void main(String[] args) throws Exception, IOException
        {
             //Both case work
    
            FFmpegFrameGrabber g = new FFmpegFrameGrabber("C:\\JavaEE\\New Project\\tape\\src\\main\\webapp\\web-resources\\videos\\vid.mp4");
            g.setFormat("mp4");
            g.start();
    
            for (int i = 0 ; i < 50 ; i++) {
                ImageIO.write(g.grab().getBufferedImage(), "png", new File("C:\\JavaEE\\New Project\\tape\\src\\main\\webapp\\web-resources\\thumbnails\\video-frame-" + System.currentTimeMillis() + ".png"));
            }
    
             g.stop();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 2014-07-17
      相关资源
      最近更新 更多