public void addTimecode(Packet packet) throws IOException { if(_timescale == NO_TIMESCALE_SET) _timescale = packet.getTimescale(); if(_timescale != NO_TIMESCALE_SET && _timescale != packet.getTimescale()) throw new RuntimeException("MP4 timecode track doesn't support timescale switching."); if (packet.isKeyFrame()) processGop(); gop.add(Packet.createPacketWithData(packet, (ByteBuffer) null)); }
@Override public void addFrame(Packet pkt) throws IOException { if (!headerWritten) { frameRate = pkt.getTimescale(); writeHeader(); headerWritten = true; } ByteBuffer fh = ByteBuffer.allocate(12); fh.order(ByteOrder.LITTLE_ENDIAN); ByteBuffer frame = pkt.getData(); fh.putInt(frame.remaining()); fh.putLong(nFrames); fh.clear(); ch.write(fh); ch.write(frame); nFrames++; }
@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); }
@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); } }
_timescale = pkt.getTimescale(); if (_timescale != pkt.getTimescale()) { pkt.setPts((pkt.getPts() * _timescale) / pkt.getTimescale()); pkt.setDuration((pkt.getPts() * _timescale) / pkt.getDuration());
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();