FrameGrab.getFrame 中的 NullPointerException [英] NullPointerException in FrameGrab.getFrame

查看:34
本文介绍了FrameGrab.getFrame 中的 NullPointerException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用 jcodec 从视频中获取帧,但出现 NullPointerException.

I would like to get frame from video using jcodec, but I get 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);
        }
    }
}

堆栈跟踪:

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)

推荐答案

没有看到你的堆栈跟踪很难说,但是这一行.-

Hard to say without seeing your stacktrace, but this line.-

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

可能会抛出 Exceptionframe 恰好是 null.我会像这样重写代码.-

may be throwing the Exception it frame happens to be null. I'd rewrite the code like this.-

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,则实例化它是没有意义的,并且运行第三行 (ImageIO.write>) 如果 FrameGrab.getFrame 返回 null(这很可能就是这里发生的事情).

Notice that there's no sense in instantiating a new BufferedImage if you're reassigning it in the next line, and there's no sense in running the third line (ImageIO.write) if FrameGrab.getFrame returns null (which is most probably what's happening here).

这篇关于FrameGrab.getFrame 中的 NullPointerException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆