有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

FrameGrab中的java NullPointerException。getFrame

我想使用jcodec从视频中获取帧,但我得到的是NullPointerException

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import org.jcodec.api.FrameGrab;
import org.jcodec.api.JCodecException;

public class App 
{
    public static void main( String[] args )
    {
        int frameNumber = 150;  

        try {
            BufferedImage frame = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);

            try {
                frame = FrameGrab.getFrame(new File("/Users/AG/Downloads/video.mp4"), frameNumber);
            } catch (JCodecException ex) {
                Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
            }

            ImageIO.write(frame, "png", new File("frame_150.png"));

        } catch (IOException ex) {
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Stacktrace:

Exception in thread "main" java.lang.NullPointerException
at org.jcodec.codecs.h264.decode.deblock.DeblockingFilter.calcBsH(DeblockingFilter.java:167)
at org.jcodec.codecs.h264.decode.deblock.DeblockingFilter.deblockFrame(DeblockingFilter.java:80)
at org.jcodec.codecs.h264.H264Decoder$FrameDecoder.decodeFrame(H264Decoder.java:101)
at org.jcodec.codecs.h264.H264Decoder.decodeFrame(H264Decoder.java:61)
at org.jcodec.api.specific.AVCMP4Adaptor.decodeFrame(AVCMP4Adaptor.java:40)
at org.jcodec.api.FrameGrab.decodeLeadingFrames(FrameGrab.java:184)
at org.jcodec.api.FrameGrab.seekToFramePrecise(FrameGrab.java:111)
at org.jcodec.api.FrameGrab.getFrame(FrameGrab.java:331)
at com.mycompany.video_extractor.App.main(App.java:27)

共 (1) 个答案

  1. # 1 楼答案

    很难说没有看到你的踪迹,但是这一行

    ImageIO.write(frame, "png", new File("frame_150.png"));
    

    可能正在抛出Exceptionframe恰好是null。我会像这样重写代码

    try {
        BufferedImage frame = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
        frame = FrameGrab.getFrame(new File("/Users/AG/Downloads/video.mp4"), frameNumber);
        if (frame != null) {
            ImageIO.write(frame, "png", new File("frame_150.png"));
        } 
    
    } catch (IOException ex) {
        Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
    } catch (JCodecException ex) {
        Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
    }
    

    请注意,如果在下一行中重新分配new BufferedImage,那么实例化一个new BufferedImage是没有意义的,如果FrameGrab.getFrame返回null,那么运行第三行(ImageIO.write)是没有意义的(这很可能就是这里发生的情况)