Слияние двух клипов со звуком и без него приводит к тому, что звук начинается с начала сгенерированного видео - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь объединить два видео (файлы 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);
                }
            }
        }
    }

1 Ответ

0 голосов
/ 27 января 2020

Я смог сделать это, добавив приглушенный клип с дорожками молчания. Проблема состояла в том, что реакция-нативного видео не воспроизводила трек молчания должным образом, как у Q-плеера. Мне пришлось перекодировать видео, чтобы убедиться, что добавляющаяся тишина работает правильно.

...