I am trying to merge audio and video using MP4parser in Android studio and cropping audio track based on video. PFB the code.
Movie videoMovie = MovieCreator.build(video_url);
Track videoTracks = null;// Get the video portion of the video
for (Track videoMovieTrack : videoMovie.getTracks()) {
if ("vide".equals(videoMovieTrack.getHandler())) {
videoTracks = videoMovieTrack;
}
}
Movie outMovie = new Movie();
int videoDuration=0;
Uri vidUri = Uri.parse(video_url);
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(AddaudiovideoActivity.this, vidUri);
String durationStr = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
videoDuration = Integer.parseInt(durationStr);
mmr.release();
AACTrackImpl audioTrack = new AACTrackImpl(new FileDataSourceImpl(audio_url));
Uri audUri = Uri.parse(audio_url);
MediaMetadataRetriever audmmr = new MediaMetadataRetriever();
audmmr.setDataSource(AddaudiovideoActivity.this, audUri);
String audurationStr = audmmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
int audioDuration = Integer.parseInt(audurationStr);
audmmr.release();
outMovie.addTrack(videoTracks);
if(audioDuration<videoDuration){
double exactlyDuration = (double) videoDuration / audioDuration ;
int minDuration = (int) Math.floor(exactlyDuration);
double offsetDuration = exactlyDuration - minDuration ;
Track[] audioTracks = new Track[minDuration+1];
for (int i=0;i<minDuration;i++){
audioTracks[i] = audioTrack ;
}
int offsetSize = (int) (audioTrack.getSamples().size()* offsetDuration);
audioTracks[minDuration] = new CroppedTrack(audioTrack,0,offsetSize);
outMovie.addTrack(new AppendTrack(audioTracks));
} else if(audioDuration>videoDuration){
double offsetDuration = (double) videoDuration / audioDuration ;
int offsetSize = (int) (audioTrack.getSamples().size()* offsetDuration);
CroppedTrack croppedTrack = new CroppedTrack(audioTrack,0,offsetSize);
outMovie.addTrack(croppedTrack);
} else { outMovie.addTrack(audioTrack); }
Container container = new DefaultMp4Builder().build(outMovie);
File outFile = new File(vid_fileName);
RandomAccessFile randomAccessFile = new RandomAccessFile(outFile,"rw");
container.writeContainer(randomAccessFile.getChannel()); //Issue occuring line
randomAccessFile.close();
At code line "container.writeContainer(randomAccessFile.getChannel());" ,I am encountering exception java.lang.IndexOutOfBoundsException: No such device.
Thanks in Advance.