package com; import org.mp4parser.muxer.Movie; import org.mp4parser.muxer.Track; import org.mp4parser.muxer.builder.DefaultMp4Builder; import org.mp4parser.muxer.builder.Mp4Builder; import org.mp4parser.muxer.container.mp4.MovieCreator; import org.mp4parser.muxer.tracks.ClippedTrack; import org.mp4parser.tools.Mp4Arrays; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by sannies on 19.11.2015. */ public class ChopSuey { public static void main(String[] args) throws IOException { Movie m = MovieCreator.build("C:\\dev\\mp4parser\\schaf-schleppt-knüppel.mp4"); Track videoTrack = null; for (Track track : m.getTracks()) { if ("vide".equals(track.getHandler())) { videoTrack = track; } } if (videoTrack == null) { throw new RuntimeException("You need a video track!"); } int refNumSamples = videoTrack.getSamples().size(); long[] refSampleDuration = videoTrack.getSampleDurations(); long[] syncSamples = videoTrack.getSyncSamples(); double[] syncSampleTimes = new double[0]; int refIndex = 0; double refTime = 0; for (long syncSample : syncSamples) { while (refIndex < syncSample - 1 && refIndex < refNumSamples) { refTime += (double) refSampleDuration[refIndex] / videoTrack.getTrackMetaData().getTimescale(); refIndex++; } syncSampleTimes = Mp4Arrays.copyOfAndAppend(syncSampleTimes, refTime); } Map<Track, List<Track>> tracks = new HashMap<Track, List<Track>>(); for (Track track : m.getTracks()) { List<Track> chops = new ArrayList<Track>(); int lastStart = 0; int index = 0; int numSamples = track.getSamples().size(); long[] durations = track.getSampleDurations(); double time = 0; int timeIndex = 0; while (index < numSamples) { if (timeIndex >= syncSampleTimes.length) { chops.add(new ClippedTrack(track, lastStart, numSamples)); System.err.println("Added partial track for " + track.getTrackMetaData().getTrackId() + " from sample " + lastStart + " to " + numSamples); break; } if (time >= syncSampleTimes[timeIndex]) { if (lastStart != index) { chops.add(new ClippedTrack(track, lastStart, index)); System.err.println("Added partial track for " + track.getTrackMetaData().getTrackId() + " from sample " + lastStart + " to " + index); lastStart = index; } timeIndex++; } time += (double) durations[index] / track.getTrackMetaData().getTimescale(); index++; } if (!chops.isEmpty()) { tracks.put(track, chops); } } Mp4Builder b = new DefaultMp4Builder(); for (int i = 0; i < syncSamples.length; i++) { Movie chopped = new Movie(); for (Track track : tracks.keySet()) { chopped.addTrack(tracks.get(track).get(i)); } b.build(chopped).writeContainer(new FileOutputStream("out-" + i + ".mp4").getChannel()); } } }