使用google的mp4parser进行MP4视频的合并

/ Android / 没有评论 / 1592浏览

使用google的mp4parser进行MP4视频的合并

前言

最近是饱受折磨,媳妇的单位一直然让她做一些工作视频的合并,在网上找了很多的资源,最后发现都是坑-----------要VIP,果然天底下就没有免费的午餐。

不说了。都是眼泪。

所以决心自己做一个免费的MP4视频合并工具吧。 在网上找了很多资料,最后选定了google的mp4parser工具包来进行视频的处理,NO B B ,SHOW U CODE。

@Slf4j
public class Mp4ParserUtils {

    private static final String MP3_HANDLER = "soun";
    private static final String MP4_HANDLER = "vide";

    public static void mergeMP4(List<String> sourceFiles, File target) 
        throws IOException {
        //添加需要合并的文件
        List<Track> videoTracks = new LinkedList<>();
        List<Track> audioTracks = new LinkedList<>();
        getVideoTracks(sourceFiles, videoTracks, audioTracks);
        Movie movie = creatNewMovie(videoTracks, audioTracks);
        Container out = new DefaultMp4Builder().build(movie);
        FileChannel fc = new RandomAccessFile(target, "rw").getChannel();
        out.writeContainer(fc);
        fc.close();
    }

    private static void getVideoTracks(List<String> sourceFiles, List<Track> videoTracks, List<Track> audioTracks) throws IOException {
        List<Movie> movieList = new LinkedList<>();
        for (String filePath : sourceFiles) {
            Movie movie = MovieCreator.build(filePath);
            movieList.add(movie);
        }
        for (Movie m : movieList) {
            for (Track t : m.getTracks()) {
                if (StrUtil.equals(MP3_HANDLER, t.getHandler())) {
                    audioTracks.add(t);
                }
                if (StrUtil.equals(MP4_HANDLER, t.getHandler())) {
                    videoTracks.add(t);
                }
            }
        }
    }

    private static Movie creatNewMovie(List<Track> videoTracks, List<Track> audioTracks)
        throws IOException {
        Movie result = new Movie();
        if (audioTracks.size() > 0) {
            result.addTrack(new AppendTrack(
                audioTracks.toArray(new Track[audioTracks.size()])));
        }
        if (videoTracks.size() > 0) {
            result.addTrack(new AppendTrack(
                videoTracks.toArray(new Track[videoTracks.size()])));
        }
        return result;
    }

    public static void main(String[] args) throws IOException {
        List<String> strings = new ArrayList<>();
        strings.add("D:\\temp\\1321695771019579392\\b30369u5j3q.p701.1.mp4.mp4");
        strings.add("D:\\temp\\1321695771019579392\\b30369u5j3q.p701.2.mp4.mp4");
        File file = new File("D:\\temp\\1321695771019579392\\merge\\merge.mp4");
        mergeMP4(strings, file);
    }
}

已测试完毕,可以使用。使用要注意的地方是:视频的顺序,要自己控制。根据传入集合的顺序来进行处理。

好了,晚上再也不怕媳妇让我给她合并视频了