package org.jcodec.samples.prores; import static org.jcodec.common.io.NIOUtils.readableChannel; import static org.jcodec.common.io.NIOUtils.writableChannel; import java.io.File; import java.nio.ByteBuffer; import org.jcodec.codecs.prores.ProresToProxy; import org.jcodec.common.DemuxerTrack; import org.jcodec.common.DemuxerTrackMeta; import org.jcodec.common.MuxerTrack; import org.jcodec.common.io.SeekableByteChannel; import org.jcodec.common.model.Size; import org.jcodec.containers.mp4.Brand; import org.jcodec.containers.mp4.MP4Packet; import org.jcodec.containers.mp4.demuxer.MP4Demuxer; import org.jcodec.containers.mp4.muxer.MP4Muxer; /** * This class is part of JCodec ( www.jcodec.org ) This software is distributed * under FreeBSD License * * Turns a ProRes frame into ProRes proxy * * @author The JCodec project * */ public class ToProxy { public static void main(String[] args) throws Exception { if (args.length < 2) { System.out.println("Syntax: <in.mov> <out.mov>"); return; } SeekableByteChannel input = readableChannel(new File(args[0])); MP4Demuxer demuxer = new MP4Demuxer(input); SeekableByteChannel output = writableChannel(new File(args[1])); MP4Muxer muxer = MP4Muxer.createMP4Muxer(output, Brand.MOV); DemuxerTrack inVideo = demuxer.getVideoTrack(); DemuxerTrackMeta meta = inVideo.getMeta(); Size size = meta.getVideoCodecMeta().getSize(); ProresToProxy toProxy = new ProresToProxy(size.getWidth(), size.getHeight(), 65536); MuxerTrack outVideo = muxer.addVideoTrack(meta.getCodec(), meta.getVideoCodecMeta()); System.out.println(toProxy.getFrameSize()); int frame = 0; long from = System.currentTimeMillis(); long last = from; MP4Packet pkt = null; while ((pkt = (MP4Packet)inVideo.nextFrame()) != null) { ByteBuffer out = ByteBuffer.allocate(pkt.getData().remaining()); toProxy.transcode(pkt.getData(), out); out.flip(); outVideo.addFrame(MP4Packet.createMP4PacketWithData(pkt, out)); frame++; long cur = System.currentTimeMillis(); if (cur - last > 5000) { System.out.println(((1000 * frame) / (cur - from)) + " fps"); last = cur; } } muxer.finish(); output.close(); input.close(); } }