更多其他页面-自定义View-实用功能合集:点击查看
功能简介
使用MpParse将2个本地视频拼接成1个连续的,并输出保存
相关SDK导入:
compile ‘com.googlecode.mp4parser:isoparser:1.1.21’
实现步骤
1.导入第三方库
2.获取储存stroage权限,如何获取权限 点击查看
3.调用appendMp4List()
即可
java代码
/**
* 简介:使用MpParse将2个本地视频拼接成1个连续的,并输出保存
* 作者:游丰泽
**/
public class Mp4ParseUtil {
/**
* 对Mp4文件集合进行追加合并(按照顺序一个一个拼接起来)
*
* @param mp4PathList 想要被合成的视频列表,List<String>
* @param outPutPath [输出]合成后视频的文件输出绝对路径 ()
* @param outPutFileName [输出]合成后视频的文件名字 (大西瓜)
* @param outPutFileSuffix [[输出]合成后视频的文件后缀 (.mp4)
*/
public static void appendMp4List(List<String> mp4PathList, String outPutPath,String outPutFileName,String outPutFileSuffix) throws IOException {
String TAG="拼接视频->> ";
List<Movie> mp4MovieList = new ArrayList<>();// Movie对象集合[输入]
for (String mp4Path : mp4PathList) {// 将每个文件路径都构建成一个Movie对象
Log.d(TAG, "视频路径: "+mp4Path);
mp4MovieList.add(MovieCreator.build(mp4Path));
}
List<Track> audioTracks = new LinkedList<>();// 音频通道集合
List<Track> videoTracks = new LinkedList<>();// 视频通道集合
for (Movie mp4Movie : mp4MovieList) {// 对Movie对象集合进行循环
for (Track inMovieTrack : mp4Movie.getTracks()) {
if ("soun".equals(inMovieTrack.getHandler())) {// 从Movie对象中取出音频通道
audioTracks.add(inMovieTrack);
}
if ("vide".equals(inMovieTrack.getHandler())) {// 从Movie对象中取出视频通道
videoTracks.add(inMovieTrack);
}
}
}
Movie resultMovie = new Movie();// 结果Movie对象[输出]
if (!audioTracks.isEmpty()) {// 将所有音频通道追加合并
resultMovie.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()])));
}
if (!videoTracks.isEmpty()) {// 将所有视频通道追加合并
resultMovie.addTrack(new AppendTrack(videoTracks.toArray(new Track[videoTracks.size()])));
}
Container outContainer = new DefaultMp4Builder().build(resultMovie);// 将结果Movie对象封装进容器
FileChannel fileChannel = new RandomAccessFile(String.format(outPutPath+outPutFileName+ System.currentTimeMillis() + outPutFileSuffix), "rwd").getChannel();
outContainer.writeContainer(fileChannel);// 将容器内容写入磁盘
fileChannel.close();
}
}