android视频拼接,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 videoUris;

//合并完毕,导出地址

private String output;

//是否正在执行合并任务

public boolean isRunning = false;

public JoinVideo(Context context, List 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 inMovies = new ArrayList<>();

for (String videoUri : videoUris) {

File f = new File(videoUri);

//文件存在

if (f.exists()) {

inMovies.add(MovieCreator.build(videoUri));

}

}

// 分别取出音轨和视频

List videoTracks = new LinkedList<>();

List 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();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值