NullPointerException in FrameGrab.getFrame

I would like to get a frame from a video using jcodec , but I am getting a 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) 
0
source share
1 answer

It's hard to say without seeing your stack, but this line.

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

Exception frame null can be selected. I would rewrite 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); } 

Note that it makes no sense to instantiate a new BufferedImage if you reassign it on the next line, and it makes no sense to run the third line ( ImageIO.write ) if FrameGrab.getFrame returns null (which is most likely what happens here).

0
source

All Articles