1

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.

Razz
  • 87
  • 3
  • 21

0 Answers0