美文网首页
android下MP4视频拼接

android下MP4视频拼接

作者: 我爱吃青苹果 | 来源:发表于2017-05-03 22:31 被阅读0次

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


需要依赖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下MP4视频拼接

      本文链接:https://www.haomeiwen.com/subject/owwltxtx.html