Android多媒体(二) 多段Mp4文件拼接 我用双手成就你的梦想

上一篇中讲了音轨合成  Android多媒体(一) 音轨合成 我用双手成就你的梦想,今天要实现的是将多个Mp4文件合并。

两者相同点在于都是将多个音频合并成一个,不同点在于前者是同时播放多个音频,后者是按合成的顺序播放。


这里使用的是mp4parser来实现的

官网地址:https://code.google.com/p/mp4parser/

GitHub: https://github.com/sannies/mp4parser

也可以在本篇最下面的Demo链接中直接下载本Demo

需要用到的jar:


本次Demo是在上篇的基础上进行的修改,效果图及流程还是一样的,这里不再进行复述,可参考上一篇Android多媒体(一) 音轨合成 我用双手成就你的梦想


因为都是第三方的东西,这里就直接贴代码了:

/**
	 * 拼接多段Mp4
	 * 
	 * @param num
	 */
	private void append(int num) {

		// 把选中的item的path存到一个List里
		List<String> phthList = new ArrayList<String>();
		for (int i = 0; i < list.size(); i++) {
			if (1 == list.get(i).getState()) {
				phthList.add(list.get(i).getPath());
			}
		}

		try {
			List<Movie> inMovies = new ArrayList<Movie>();
			for (String videoUri : phthList) {
				inMovies.add(MovieCreator.build(videoUri));
			}

			List<Track> audioTracks = new LinkedList<Track>();
			for (Movie m : inMovies) {
				for (Track t : m.getTracks()) {
					if (t.getHandler().equals("soun")) {
						audioTracks.add(t);
					}
				}
			}

			Movie result = new Movie();

			if (!audioTracks.isEmpty()) {
				result.addTrack(new AppendTrack(audioTracks
						.toArray(new Track[audioTracks.size()])));
			}

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

			@SuppressWarnings("resource")
			FileChannel fc = new RandomAccessFile(appendFile.getAbsolutePath()
					+ "/appendAudio.mp4", "rw").getChannel();
			con.writeContainer(fc);
			fc.close();

		} catch (IOException e) {
			e.printStackTrace();
		}

		// 将所有item点击状态设置为未点击并刷新adapter
		for (int i = 0; i < list.size(); i++) {
			list.get(i).setState(0);
		}
		adapter.setList(list);

		Toast.makeText(
				getApplicationContext(),
				"拼接完成,并存储在" + appendFile.getAbsolutePath() + "/appendAudio.mp4",
				Toast.LENGTH_SHORT).show();
		dialog.dismiss();
	}

最后拼接的Mp4存储在/sdcard/merge/append下面的appendAudio.mp4,可以打开文件夹找到播放试听一下。


以上是Mp4的拼接,Mp3的拼接这里暂不支持,楼主也没有找到好的资料可以实现,如有可实现的办法请在下面留言


Demo: http://download.csdn.net/detail/qq_18612815/9531963

 



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值