Я пытаюсь объединить два видео (файлы mp4), одно со звуком и одно без звука, с одним видео с помощью MP4Parser. Конечное видео, которое генерируется, всегда имеет звук с самого начала. например, 1-е видео имеет длину 20 сек c и не имеет аудио. 2-е видео имеет длину 10 se c и имеет аудио. Конечное сгенерированное видео имеет продолжительность 30 секунд, но звук будет воспроизводиться в начале видео в течение 10 секунд (остальные 20 секунд не будут иметь звука), тогда как он должен иметь начало 20 секунд без звука и конец 10 секунд с аудио.
Movie[] clips = new Movie[2];
//location of the movie clip storage
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "TestMerge");
//Build the two clips into movies
Movie firstClip = MovieCreator.build(first);
Movie secondClip = MovieCreator.build(second);
//Add both movie clips
clips[0] = firstClip;
clips[1] = secondClip;
//List for audio and video tracks
List<Track> videoTracks = new LinkedList<Track>();
List<Track> audioTracks = new LinkedList<Track>();
//Iterate all the movie clips and find the audio and videos
for (Movie movie: clips) {
for (Track track : movie.getTracks()) {
if (track.getHandler().equals("soun"))
audioTracks.add(track);
if (track.getHandler().equals("vide"))
videoTracks.add(track);
}
}
//Result movie from putting the audio and video together from the two clips
Movie result = new Movie();
//Append all audio and video
if (videoTracks.size() > 0)
result.addTrack(new AppendTrack(videoTracks.toArray(new Track[videoTracks.size()])));
if (audioTracks.size() > 0)
result.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()])));
}
Я попытался добавить треки тишины, изменив несколько строк, как показано ниже
//List for audio and video tracks
List<Track> videoTracks = new LinkedList<Track>();
List<Track> audioTracks = new LinkedList<Track>();
Track audioSourceTrack = null;
for (final Movie movie : inMovies) {
for (final Track t : movie.getTracks()) {
if (isAudioTrack(t)) {
audioSourceTrack = t;
break;
}
}
if (audioSourceTrack != null) break;
}
//Iterate all the movie clips and find the audio and videos
for (Movie movie: clips) {
if (movie.getTracks().size() == 1) {
videoTracks.add(movie.getTracks().get(0));
audioTracks.add(new SilenceTrackImpl(audioSourceTrack, movie.getTracks().get(0).getDuration() / 2));
} else {
for (final Track t : movie.getTracks()) {
if (isAudioTrack(t)) {
audioTracks.add(t);
}
if (isVideoTrack(t)) {
videoTracks.add(t);
}
}
}
}