Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaCV FFmpegFrameFilter不适用于fps筛选器_Java_Video_Video Processing_Javacv_Javacpp - Fatal编程技术网

JavaCV FFmpegFrameFilter不适用于fps筛选器

JavaCV FFmpegFrameFilter不适用于fps筛选器,java,video,video-processing,javacv,javacpp,Java,Video,Video Processing,Javacv,Javacpp,我正在尝试使用JavaCV的FFmpegFrameFilter和-grabber更改视频的帧速率。但是,filter.pull()始终返回null 基本上,我尝试过拉和推框架的每一种组合,但似乎都不起作用 这是我的代码: FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(new File("input.mp4")); grabber.start(); FFmpegFrameFilter filter = new F

我正在尝试使用JavaCV的FFmpegFrameFilter和-grabber更改视频的帧速率。但是,
filter.pull()始终返回null

基本上,我尝试过拉和推框架的每一种组合,但似乎都不起作用

这是我的代码:


    FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(new File("input.mp4"));
    grabber.start();

    FFmpegFrameFilter filter = new FFmpegFrameFilter("fps=fps=60", null, grabber.getImageWidth(), grabber.getImageHeight(), 0);
    filter.setVideoInputs(1);
    filter.start();

    Java2DFrameConverter converter = new Java2DFrameConverter();

    for (int i = 0; i < 10; i++) {
        //Push the newly grabbed frame to the filter.
        Frame frame = grabber.grabImage();
        int n = frame.image.length - 1;
        filter.pushImage(n > 0 ? n : 0, frame.imageWidth, frame.imageHeight, frame.imageDepth, frame.imageChannels, frame.imageStride, grabber.getPixelFormat(), frame.image);

        //Pull the frame from the filter, convert it to a BufferedImage, and save it.
        //This line throws an IllegalArgumentException, stating the image is null.
        ImageIO.write(converter.convert(filter.pullImage()), "jpg", new File(outputPath + i + ".jpg"));
    }

FFmpegFrameGrabber grabber=新的FFmpegFrameGrabber(新文件(“input.mp4”);
grabber.start();
FFmpegFrameFilter filter=新的FFmpegFrameFilter(“fps=fps=60”,null,grabber.getImageWidth(),grabber.getImageHeight(),0);
过滤器。设置视频输入(1);
filter.start();
Java2DFrameConverter=新的Java2DFrameConverter();
对于(int i=0;i<10;i++){
//将新抓取的框架推到过滤器上。
Frame Frame=grabber.grabImage();
int n=frame.image.length-1;
filter.pushImage(n>0?n:0,frame.imageWidth,frame.imageHeight,frame.imageDepth,frame.imageChannels,frame.imageStride,grabber.getPixelFormat(),frame.image);
//从筛选器中提取帧,将其转换为BuffereImage,然后保存。
//此行抛出一个IllegalArgumentException,说明图像为null。
write(converter.convert(filter.pullImage()),“jpg”,新文件(outputPath+i+“.jpg”);
}

我最好的猜测是我给了
pushImage(…)
一个错误的参数,因为我不确定第一个参数
n
应该是什么。

我想出了一种方法避免使用过滤器

class GrabWithDifferentFrameRate {

    private Frame lastFrame;
    private FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(input);

    // Basically converts a frameNumber based on the desiredFrameRate 
    // to one fitting for the grabbers frameRate and returns the frame at that frameNumber
    public Frame grabAt(int frameNumber, int desiredFrameRate) {
        double stepSize = desiredFrameRate / grabber.getFrameRate();
        double adjustedFrameNumber = calculateAdjustedFrameNumber(stepSize);

        Frame frame = lastFrame;
        while ((adjustedFrameNumber <= frameNumber && frameNumber / stepSize < grabber.getLengthInFrames())) {
            frame = grabber.grabImage();
            adjustedFrameNumber = calculateAdjustedFrameNumber(stepSize);
        }

        return frame;
    }

    private double calculateAdjustedFrameNumber(double stepSize) {
        return grabber.getFrameNumber() * stepSize;
    }
}
具有不同帧率的类抓取{
私有帧lastFrame;
专用FFmpegFrameGrabber抓取器=新的FFmpegFrameGrabber(输入);
//基本上根据所需的帧速率转换帧数
//到抓取器帧速率的一个配件,并返回该帧编号处的帧
公共帧抓取(int frameNumber,int desiredFrameRate){
双步长=desiredFrameRate/grabber.getFrameRate();
双重调整的帧数=计算调整的帧数(步长);
帧=最后一帧;

而((adjustedFrameNumber改为使用push(),这将完成所需的操作。除此之外,fps需要时间戳,因此我们可能需要手动设置这些时间戳,如本期所述:@SamuelAudet谢谢,但
push()
也不起作用。不过,我找到了一种避免使用while循环过滤的方法。如果有人无意中发现这篇文章,我将在下面发布我的解决方案。