遇上视频暂停/继续功能的需求,然后网上找资料,最后实现功能
需要依赖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();
}
}
}