private int detectKeyFrame(int start) throws IOException { int[] seekFrames = videoTrack.getMeta().getSeekFrames(); if (seekFrames == null) return start; int prev = seekFrames[0]; for (int i = 1; i < seekFrames.length; i++) { if (seekFrames[i] > start) break; prev = seekFrames[i]; } return prev; }
private static ContainerAdaptor detectDecoder(SeekableDemuxerTrack videoTrack) throws JCodecException { DemuxerTrackMeta meta = videoTrack.getMeta(); switch (meta.getCodec()) { case H264: return new AVCMP4Adaptor(meta); default: throw new UnsupportedFormatException("Codec is not supported"); } }
ByteBuffer codecPrivate = inTrack.getMeta().getCodecPrivate(); H264Decoder decoder = H264Decoder.createH264DecoderFromCodecPrivate(codecPrivate); int totalFrames = (int) inTrack.getMeta().getTotalFrames(), seqNo = 0; for (int i = sf; (inFrame = inTrack.nextFrame()) != null; i++) { ByteBuffer data = inFrame.getData(); Size size = inTrack.getMeta().getVideoCodecMeta().getSize();
/** * Get frame at current position in JCodec native image * * @return A decoded picture with metadata. * @throws IOException */ public PictureWithMetadata getNativeFrameWithMetadata() throws IOException { Packet frame = videoTrack.nextFrame(); if (frame == null) return null; Picture picture = decoder.decodeFrame(frame, getBuffer()); return new PictureWithMetadata(picture, frame.getPtsD(), frame.getDurationD(), videoTrack.getMeta().getOrientation()); }