lib 1006715 // jcodec 0.2.0 lib 1006717 // jcodec 0.2.0 javase import org.jcodec.common.io.*; import org.jcodec.api.*; import org.jcodec.api.awt.*; import org.jcodec.scale.*; static int framesFromVideo_bufferSize = 7; static IterableIterator framesFromVideo_reordering(File video) ctex { final int bufferSize = framesFromVideo_bufferSize; final FileChannelWrapper ch = NIOUtils.readableChannel(video); final AWTFrameGrab8Bit grab = AWTFrameGrab8Bit.createAWTFrameGrab8Bit(ch); ret iteratorFromFunction(new O { new TreeMap reorderBuffer; bool done; void grab ctex { print("Grabbing (" + l(reorderBuffer) + ")"); PictureWithMetadata8Bit pmd = grab.getNativeFrameWithMetadata(); if (pmd.getPicture() == null) { done = true; NIOUtils.closeQuietly(ch); } else { BufferedImage img = pmd.getPicture() == null ? null : AWTUtil.toBufferedImage8Bit(pmd.getPicture()); reorderBuffer.put(pmd.getTimestamp(), img); } } O get() { while (!done && l(reorderBuffer) < bufferSize) grab(); if (done || reorderBuffer.size() >= bufferSize) { if (empty(reorderBuffer)) null; double leastPts = firstKey(reorderBuffer); BufferedImage img = reorderBuffer.get(leastPts); reorderBuffer.remove(leastPts); ret img; } null; } }); // TODO: close file when not all frames are grabbed }