好记性不如铅笔头

android, java, 编程

Android应用开发笔记:多个MP4合并(mp4parser)

我们在使用Android录制视频的时候,可能会有这么一种需求,就是将多个mp4视频合并成一个(比如某企鹅的某软件)。这里备份下一种实现方式:

使用【 mp4parser 】来合并视频:

官网:

https://code.google.com/p/mp4parser/ 】

使用方法:

1)在官网上下载jar文件,作者下载的是【 isoviewer-1.0-RC-28.jar 】

2)将jar文件添加到Android的工程里,配置好buildpath

3)合并多个文件,基本实现如下:

List<String> fileList = new ArrayList<String>();
List<Movie> moviesList = new LinkedList<Movie>();
fileList.add("/1387865774255.mp4");
fileList.add("/1387865800664.mp4");

try
{
	for (String file : fileList)
	{
		moviesList.add(MovieCreator.build(file));
	}
}
catch (IOException e)
{
	e.printStackTrace();
}
		
List<Track> videoTracks = new LinkedList<Track>();
List<Track> audioTracks = new LinkedList<Track>();
for (Movie m : moviesList)
{
	for (Track t : m.getTracks())
	{
		if (t.getHandler().equals("soun"))
		{
			audioTracks.add(t);
		}
		if (t.getHandler().equals("vide"))
		{
			videoTracks.add(t);
		}
	}
}

Movie result = new Movie();

try
{
	if (audioTracks.size() > 0) 
	{
		result.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()])));
	}
	if (videoTracks.size() > 0) 
	{
		result.addTrack(new AppendTrack(videoTracks.toArray(new Track[videoTracks.size()])));
	}
}
catch (IOException e)
{
	// TODO Auto-generated catch block
	e.printStackTrace();
}

Container out = new DefaultMp4Builder().build(result);

try
{
	FileChannel fc = new RandomAccessFile("output.mp4", "rw").getChannel();
	out.writeContainer(fc);
	fc.close();
}
catch (Exception e)
{
	// TODO Auto-generated catch block
	e.printStackTrace();
}
		
moviesList.clear();
fileList.clear();

 备注:

1)mp4parser的功能有很多,更多的使用方法可以参考源码SVN里面的sample。

2)mp4parser的速度比较慢,可以使用一些小技巧神马的提升一些速度,这里就不扩展了。

Leave a Reply

3 × 2 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据