package com.googlecode.mp4parser;
import org.mp4parser.Container;
import org.mp4parser.muxer.Movie;
import org.mp4parser.muxer.Track;
import org.mp4parser.muxer.builder.DefaultMp4Builder;
import org.mp4parser.muxer.container.mp4.MovieCreator;
import org.mp4parser.muxer.tracks.ClippedTrack;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
/**
* Shortens/Crops a track
*/
public class SingleTrackShortenExample {
public static void main(String[] args) throws IOException {
//Movie movie = new MovieCreator().build(new RandomAccessFile("/home/sannies/suckerpunch-distantplanet_h1080p/suckerpunch-distantplanet_h1080p.mov", "r").getChannel());
Movie movie = MovieCreator.build("C:\\content\\843D111F-E839-4597-B60C-3B8114E0AA72_ABR05.mp4");
List<Track> tracks = movie.getTracks();
assert tracks.size() == 1;
Track track = movie.getTracks().get(0);
movie.setTracks(new LinkedList<Track>());
// remove all tracks we will create new tracks from the old
double startTime = 10;
double endTime = 20;
long startSample = findNextSyncSample(track, startTime);
long endSample = findNextSyncSample(track, endTime);
movie.addTrack(new ClippedTrack(track, startSample, endSample));
Container out = new DefaultMp4Builder().build(movie);
FileOutputStream fos = new FileOutputStream(String.format("output-%f-%f.mp4", startTime, endTime));
FileChannel fc = fos.getChannel();
out.writeContainer(fc);
fc.close();
fos.close();
}
private static long findNextSyncSample(Track track, double cutHere) {
long currentSample = 0;
double currentTime = 0;
long[] durations = track.getSampleDurations();
long[] syncSamples = track.getSyncSamples();
for (int i = 0; i < durations.length; i++) {
long delta = durations[i];
if ((syncSamples == null || syncSamples.length > 0 || Arrays.binarySearch(syncSamples, currentSample + 1) >= 0)
&& currentTime > cutHere) {
return i;
}
currentTime += (double) delta / (double) track.getTrackMetaData().getTimescale();
currentSample++;
}
return currentSample;
}
}