将mp4剪辑与mp4parser合并可使视频背后的音频

Luc*_*ord 5 java android mp4parser

我正在开发一个使用mp4parser库(isoparser-1.0-RC-27.jar和aspectjrt-1.8.0.jar)合并mp4剪辑的应用程序.合并两个剪辑时,它们会成为一个剪辑,但随着更多剪辑被添加到其中,输出mp4会在视频后面显示音频.

这是代码:

    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()])));

    //Output the resulting movie to a new mp4 file
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String outputLocation = mediaStorageDir.getPath()+timeStamp;
    Container out = new DefaultMp4Builder().build(result);
    FileChannel fc = new RandomAccessFile(String.format(outputLocation), "rw").getChannel();
    out.writeContainer(fc);
    fc.close();

    //Now set the active URL to play as the combined videos!
    setURL(outputLocation);
}
Run Code Online (Sandbox Code Playgroud)

我的猜测是,随着更多剪辑被添加,视频与音频的同步被混乱,因为如果合并两个更长的剪辑,那么音频/视频就可以了.反正是为了防止多个较小的剪辑中的视频和音频的这种差的同步,还是有人找到了使用mp4parser这样做的解决方案?FFMpeg是我正在考虑的另一个解决方案,但没有找到其他人使用它来做到这一点

编辑:我发现音频通常比视频长,因此,当添加越来越多的剪辑来创建一个剪辑时,这就是导致最终结果视频偏移的原因.我将通过切断音频样本来解决

Luc*_*ord 1

我能够通过使用上述编辑的技术来解决这个问题。诀窍是跟踪有多少剪辑被合并在一起,并从最近添加的剪辑的音轨末尾删除样本。随着生成的输出 mp4 随着剪辑的增多而增长,您需要从末尾剥离越来越多的内容。这部分是由于音频和视频轨道的时序差异造成的,因为音轨可能是 1020 毫秒,而视频是 1000 毫秒,添加 5 个剪辑后,音频与视频长度会有大约 100 毫秒的偏移,因此你必须对此做出补偿。