android下MP4视频拼接

遇上视频暂停/继续功能的需求,然后网上找资料,最后实现功能


需要依赖jar包 isoviewer-1.0-RC-28


代码如下

package com.example.videosplicing;

import android.content.Context;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

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.File;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * Created by pengshulin on 2017/4/28.
 */

public class JoinVideo {
    private Context context;
    //需要拼接的mp4视频的地址
    private List<String> videoUris;
    //合并完毕,导出地址
    private String output;
    //是否正在执行合并任务
    public boolean isRunning = false;

    public JoinVideo(Context context, List<String> videoUris, String output) {
        this.context = context;
        this.videoUris = videoUris;
        this.output = output;
    }

    public boolean isRunning() {
        return isRunning;
    }

    public void joinVideo() {
        isRunning = true;

        if (videoUris == null || videoUris.size() <= 0 || TextUtils.isEmpty(output)) {
            throw new IllegalArgumentException();
        }

        if (videoUris.size() == 1) { // 只有一个视频片段,不需要合并
            return;
        }

        try {

            List<Movie> inMovies = new ArrayList<>();

            for (String videoUri : videoUris) {
                File f = new File(videoUri);
                //文件存在
                if (f.exists()) {
                    inMovies.add(MovieCreator.build(videoUri));
                }
            }

            // 分别取出音轨和视频
            List<Track> videoTracks = new LinkedList<>();
            List<Track> audioTracks = new LinkedList<>();
            for (Movie m : inMovies) {
                for (Track t : m.getTracks()) {
                    if (t.getHandler().equals("soun")) {
                        audioTracks.add(t);
                    }
                    if (t.getHandler().equals("vide")) {
                        videoTracks.add(t);
                    }
                }
            }

            // 合并到最终的视频文件
            Movie outMovie = new Movie();

            if (!audioTracks.isEmpty()) {
                outMovie.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()])));
            }
            if (!videoTracks.isEmpty()) {
                outMovie.addTrack(new AppendTrack(videoTracks.toArray(new Track[videoTracks.size()])));
            }

            Container mp4file = new DefaultMp4Builder().build(outMovie);

            // 将文件输出
            File resultFile = new File(output);

            //删除resultFile
            if (resultFile.exists() && resultFile.isFile()) {
                resultFile.delete();
            }

            FileChannel fc = new RandomAccessFile(resultFile, "rw").getChannel();
            mp4file.writeContainer(fc);
            fc.close();

            // 合成完成后把原片段文件删除
//            for (String filePath : filePaths) {
//                File file = new File(filePath);
//                file.delete();
//            }

            isRunning = false;

            Toast.makeText(context, "拼接成功", Toast.LENGTH_SHORT).show();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
            Log.i("JoinVideo", "--文件到不到异常--");

            isRunning = false;
            Toast.makeText(context, "拼接失败", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();

            isRunning = false;
            Toast.makeText(context, "拼接失败", Toast.LENGTH_SHORT).show();
        }
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,861评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,837评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,926评论 6 342
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,740评论 18 399
  • 殊途同归,通过不同的途径,到达同一个目的地。比喻采取不同的方法而得到相同的结果。 很多时候我们做一件事情之前都想要...
    一箭阅读 859评论 0 3