I am not writing any code using intel inde,i am just checking your given sample.Before that i am using Mp4 parser for trimming,same issue in mp4 parser also.code is given below(MP4 parser code)
private void trimVideo(float start, float end)
{
// TODO Auto-generated method stub
try
{
Log.e("vidpath before triming","viddeo path before triming<><><><ashok"+strImagePath);
File folder = Ut.getTestMp4ParserVideosDir(this);
Movie movie = MovieCreator.build(new FileInputStream(new File(strImagePath)).getChannel());
List<Track> tracks = movie.getTracks();
movie.setTracks(new LinkedList<Track>());
// remove all tracks we will create new tracks from the old
Log.e("No. of tracks==","<>"+tracks.size()+" Start="+start);
double startTime = start;//0;
double endTime =(double) getDuration(tracks.get(0)) / tracks.get(0).getTrackMetaData().getTimescale();
endTime= Math.min(endTime, end);
Log.e("endTime","<>"+endTime);
boolean timeCorrected = false;
// Here we try to find a track that has sync samples. Since we can only start decoding
// at such a sample we SHOULD make sure that the start of the new fragment is exactly
// such a frame
for (Track track : tracks)
{
if (track.getSyncSamples() != null && track.getSyncSamples().length > 0)
{
if (timeCorrected)
{
// This exception here could be a false positive in case we have multiple tracks
// with sync samples at exactly the same positions. E.g. a single movie containing
// multiple qualities of the same video (Microsoft Smooth Streaming file)
throw new RuntimeException("The startTime has already been corrected by another track with SyncSample. Not Supported.");
}
startTime = correctTimeToSyncSample(track, startTime, false);
endTime = correctTimeToSyncSample(track, endTime, true);
timeCorrected = true;
}
}
for (Track track : tracks)
{
long currentSample = 0;
double currentTime = 0;
long startSample = -1;
long endSample = -1;
for (int i = 0; i < track.getDecodingTimeEntries().size(); i++)
{
TimeToSampleBox.Entry entry = track.getDecodingTimeEntries().get(i);
for (int j = 0; j < entry.getCount(); j++)
{
// entry.getDelta() is the amount of time the current sample covers.
if (currentTime <= startTime)
{
// current sample is still before the new starttime
startSample = currentSample;
}else if (currentTime <= endTime)
{
// current sample is after the new start time and still before the new endtime
endSample = currentSample;
} else
{
// current sample is after the end of the cropped video
break;
}
currentTime += (double) entry.getDelta() / (double) track.getTrackMetaData().getTimescale();
currentSample++;
}
}
Log.e("<>=","startSample="+startSample+" endSample"+endSample);
movie.addTrack(new CroppedTrack(track, startSample, endSample));
Log.e("<><>>","<><><");
}
long start1 = System.currentTimeMillis();
IsoFile out = new DefaultMp4Builder().build(movie);
long start2 = System.currentTimeMillis();
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
filename1 = folder.getPath() + File.separator + String.format("Trimming", startTime, endTime) + "_" + timeStamp + ".mp4";
FileOutputStream fos = new FileOutputStream(filename1);
Log.e("after trim","after trim ing videopath ashok<><><><><><><"+filename1.toString());
FileChannel fc = fos.getChannel();
out.getBox(fc);
fc.close();
fos.close();
long start3 = System.currentTimeMillis();
System.err.println("Building IsoFile took : " + (start2 - start1) + "ms");
System.err.println("Writing IsoFile took : " + (start3 - start2) + "ms");
System.err.println("Writing IsoFile speed : " + (new File(String.format("TMP4_APP_OUT-%f-%f", startTime, endTime)).length() / (start3 - start2) / 1000) + "MB/s");
CreatingThumb1(filename1);
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected static long getDuration(Track track)
{
long duration = 0;
for (TimeToSampleBox.Entry entry : track.getDecodingTimeEntries())
{
duration += entry.getCount() * entry.getDelta();
}
return duration;
}
private static double correctTimeToSyncSample(Track track, double cutHere, boolean next)
{
double[] timeOfSyncSamples = new double[track.getSyncSamples().length];
long currentSample = 0;
double currentTime = 0;
for (int i = 0; i < track.getDecodingTimeEntries().size(); i++)
{
TimeToSampleBox.Entry entry = track.getDecodingTimeEntries().get(i);
for (int j = 0; j < entry.getCount(); j++) {
if (Arrays.binarySearch(track.getSyncSamples(), currentSample + 1) >= 0)
{
// samples always start with 1 but we start with zero therefore +1
timeOfSyncSamples[Arrays.binarySearch(track.getSyncSamples(), currentSample + 1)] = currentTime;
}
currentTime += (double) entry.getDelta() / (double) track.getTrackMetaData().getTimescale();
currentSample++;
}
}
double previous = 0;
for (double timeOfSyncSample : timeOfSyncSamples)
{
if (timeOfSyncSample > cutHere)
{
if (next)
{
return timeOfSyncSample;
}
else
{
return previous;
}
}
previous = timeOfSyncSample;
}
return timeOfSyncSamples[timeOfSyncSamples.length - 1];
}