private VideoFrameWithPacket removeFirstFixDuration(List<VideoFrameWithPacket> reorderBuffer) { Collections.sort(reorderBuffer); VideoFrameWithPacket frame = reorderBuffer.remove(0); if (!reorderBuffer.isEmpty()) { // Setting duration VideoFrameWithPacket nextFrame = reorderBuffer.get(0); frame.getPacket().setDuration(nextFrame.getPacket().getPts() - frame.getPacket().getPts()); } return frame; }
@Override public Packet inputVideoPacket() throws IOException { while (true) { Packet packet = getNextVideoPacket(); if (packet != null) videoPacketReorderBuffer.add(packet); if (packet == null || videoPacketReorderBuffer.size() > Transcoder.REORDER_BUFFER_SIZE) { if (videoPacketReorderBuffer.size() == 0) return null; Packet out = videoPacketReorderBuffer.remove(0); int duration = Integer.MAX_VALUE; for (Packet packet2 : videoPacketReorderBuffer) { int cand = (int) (packet2.getPts() - out.getPts()); if (cand > 0 && cand < duration) duration = cand; } if (duration != Integer.MAX_VALUE) out.setDuration(duration); return out; } } }
@Override public void addFrame(Packet outPacket) { MkvBlock frame = keyFrame(trackNo, 0, outPacket.getData()); frame.absoluteTimecode = outPacket.getPts() - 1; trackBlocks.add(frame); }
@Override public Packet nextFrame() throws IOException { if (lastFrame == null) lastFrame = nextFrameWithBuffer(null); if (lastFrame == null) return null; Packet toReturn = lastFrame; lastFrame = nextFrameWithBuffer(null); if (lastFrame != null) { lastKnownDuration = lastFrame.getPts() - toReturn.getPts(); } toReturn.setDuration(lastKnownDuration); return toReturn; }
@Override public Packet nextFrame() throws IOException { if (audioStash.size() == 0) { Packet nextFrame = nextFrameWithBuffer(null); if (nextFrame != null) { ByteBuffer data = nextFrame.getData(); Header adts = ADTSParser.read(data.duplicate()); long nextPts = nextFrame.getPts(); while (data.hasRemaining()) { ByteBuffer data2 = NIOUtils.read(data, adts.getSize()); Packet pkt = Packet.createPacketWithData(nextFrame, data2); pkt.setDuration((pkt.getTimescale() * 1024) / AACConts.AAC_SAMPLE_RATES[adts.getSamplingIndex()]); pkt.setPts(nextPts); nextPts += pkt.getDuration(); audioStash.add(pkt); if (data.hasRemaining()) adts = ADTSParser.read(data.duplicate()); } } } if (audioStash.size() == 0) return null; return audioStash.remove(0); } }
@Override public void addFrameInternal(Packet pkt, int entryNo) throws IOException { checkState(!finished, "The muxer track has finished muxing"); if (_timescale == NO_TIMESCALE_SET) { if (adtsHeader != null) { _timescale = adtsHeader.getSampleRate(); } else { _timescale = pkt.getTimescale(); } } if (_timescale != pkt.getTimescale()) { pkt.setPts((pkt.getPts() * _timescale) / pkt.getTimescale()); pkt.setDuration((pkt.getPts() * _timescale) / pkt.getDuration()); } if (adtsHeader != null) { pkt.setDuration(1024); } super.addFrameInternal(pkt, entryNo); }
VideoCodecMeta meta = new MPEGDecoder().getCodecMeta(pkt.getData()); MuxerTrack videoTrack = mp4Muxer.addVideoTrack(Codec.MPEG2, meta); long firstPts = pkt.getPts(); for (int i = 0; pkt != null && i < 150; i++) { videoTrack.addFrame(MP4Packet.createMP4Packet(pkt.getData(), pkt.getPts() - firstPts, pkt.getTimescale(), pkt .getDuration(), pkt.getFrameNo(), pkt.getFrameType(), pkt.getTapeTimecode(), 0, pkt.getPts() - firstPts, 0)); pkt = video.nextFrame();