Android 使用 mp4parser 做視頻拼接合並


做短視頻拍攝時,在分段錄製結束需要將多個視頻片段拼接成一個視頻文件,然後進入預覽界面播放。
有兩種方案:
方案一:使用 FFMpeg 進行視頻拼接,命令如下:

// inputListFilePath 爲需要合併的文件列表文件,每行一個文件路徑
String cmd = "ffmpeg -y -f concat -safe 0 -i " + inputListFilePath + " -c copy " + outputFilePath;

方案二:使用開源庫 mp4parser 做多視頻片段拼接

本文主要介紹方案二。

使用時先在 gradle 中配置依賴:

compile 'com.googlecode.mp4parser:isoparser:1.1.21'

將 mp4parser 封裝成音視頻合併工具類,合併函數如下:

package com.alanwang.aav.alvideoeditor.core;

import com.coremedia.iso.boxes.Container;
import com.googlecode.mp4parser.authoring.Movie;
import com.googlecode.mp4parser.authoring.Track;
import com.googlecode.mp4parser.authoring.builder.DefaultMp4Builder;
import com.googlecode.mp4parser.authoring.container.mp4.MovieCreator;
import com.googlecode.mp4parser.authoring.tracks.AppendTrack;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * Author: AlanWang4523.
 * Date: 19/4/15 01:46.
 * Mail: [email protected]
 */
public class AWMp4ParserHelper {
    private final static String PREFIX_VIDEO_HANDLER = "vide";
    private final static String PREFIX_AUDIO_HANDLER = "soun";

    /**
     * 合併視頻
     * @param inputVideos
     * @param outputPath
     * @throws IOException
     */
    public static void mergeVideos(List<String> inputVideos, String outputPath) throws IOException {
        List<Movie> inputMovies = new ArrayList<>();
        for (String input : inputVideos) {
            inputMovies.add(MovieCreator.build(input));
        }

        List<Track> videoTracks = new LinkedList<>();
        List<Track> audioTracks = new LinkedList<>();

        for (Movie m : inputMovies) {
            for (Track t : m.getTracks()) {
                if (PREFIX_AUDIO_HANDLER.equals(t.getHandler())) {
                    audioTracks.add(t);
                }
                if (PREFIX_VIDEO_HANDLER.equals(t.getHandler())) {
                    videoTracks.add(t);
                }
            }
        }

        Movie outputMovie = new Movie();
        if (audioTracks.size() > 0) {
            outputMovie.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()])));
        }
        if (videoTracks.size() > 0) {
            outputMovie.addTrack(new AppendTrack(videoTracks.toArray(new Track[videoTracks.size()])));
        }

        Container out = new DefaultMp4Builder().build(outputMovie);

        FileChannel fc = new RandomAccessFile(outputPath, "rw").getChannel();
        out.writeContainer(fc);
        fc.close();
    }
}

使用 Mp4Parser 進行視頻裁剪請見我的另外一篇博客 《 Android 使用 mp4parser 做視頻裁剪》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章