JavaCV FFmpegFrameFilter不适用于fps过滤器

我正在尝试使用FFmpegFrameFilter和JavaCV的-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"));
    }

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

xufeng123456 回答:JavaCV FFmpegFrameFilter不适用于fps过滤器

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

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;
    }
}
本文链接:https://www.f2er.com/2770591.html

大家都在问