2014年3月7日 Android(java方法)上实现mp4的分割和拼接 (二) - banking17173的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/banking17173/article/details/20646251 1/5
banking17173的专栏
分类: android
“程序人生”中国软件开发者职业生涯调查 CSDN社区“三八节”特别活动 开发者职业生涯调查之未来
Android(java方法)上实现mp4的分割和拼接 (二)
2014-03-06 20:01 117人阅读 评论(0) 收藏 举报
mp4parser Android clipm p4 appendmp4
这节谈一下如何在android上实现mp4文件的高效率切割。
业务需求举例:把一段2分钟的mp4文件切割出00:42 至 01:16这段时间的视频,要求足够短的执行时间和
尽量少的误差。
分析:mp4Parser只能在关键帧切割,比如,在00:40和00:45分别存在一个可切割关键帧,那么切割视频的
头和尾,都应该选择短切割。然后获取到误差的视频短,如果这个误差大于0.5S,用FFmpeg进行一帧一帧编解
码切割文件。这样最多会有三段mp4文件,再次将这三段mp4拼接起来就可以了。
下面直接上关键代码,这些代码在PC上新建一个java工程也可以实现。
1.切割文件方法:
/**
需要使用isoviewer-1.0-RC-27包
返回值是目标mp4的开头和结尾时刻
**/
[java]
01. public static double[] startTrim(File src, File dst, int startMs, int endMs) throws IOException {
02. Movie movie = MovieCreator.build(src.getAbsolutePath());
03. List<Track> tracks = movie.getTracks();
04. movie.setTracks(new LinkedList<Track>());
05. double startTime = startMs/1000;
06. double endTime = endMs/1000;
07. boolean timeCorrected = false;
08. // Here we try to find a track that has sync samples. Since we can only start decoding
09. // at such a sample we SHOULD make sure that the start of the new fragment is exactly
10. // such a frame
11. for (Track track : tracks) {
12. if (track.getSyncSamples() != null && track.getSyncSamples().length > 0) {
13. if (timeCorrected) {
14. throw new RuntimeException("The startTime has already been corrected by another track with SyncSample. Not Supported."
15. }
16. //true,false表示短截取;false,true表示长截取
17. startTime = correctTimeToSyncSample(track, startTime, true);
18. endTime = correctTimeToSyncSample(track, endTime, false);
19. timeCorrected = true;
20. }
21. }
22. int x = 0;
23. for (Track track : tracks) {
24. long currentSample = 0;
25. double currentTime = 0;
26. long startSample = -1;
27. long endSample = -1;
28. x++;
29. for (int i = 0; i < track.getDecodingTimeEntries().size(); i++) {
30. TimeToSampleBox.Entry entry = track.getDecodingTimeEntries().get(i);
原创: 18篇 转载: 0篇
译文: 0篇 评论: 7条
展开
(1852)
(1142)
(757)
(744)
(714)
(366)
(304)
(275)
(226)
(224)
个人资料
banking17173
访问: 8014次
积分: 262分
排名: 千里之外
文章搜索
文章分类
android (16)
表情 (1)
Gradle (1)
Android视频处理 (1)
文章存档
2014年03月 (1)
2014年02月 (1)
2013年12月 (3)
2013年10月 (3)
2013年08月 (3)
阅读排行
面试遇到的问题
Gradle自动化编译Android项目总结
android4.2中AES加密算法的失效问题
通过getChildAt方法取得AdapterView中第n个Item
Android SDK Manager无法更新问题解决
Android webViewj简单处理apk的下载链接
简单Android手机端发送展示表情
巧妙实现缺角radiogroup控制多个fragment切换和滑动
Android中使用webview和web页面的一些交互
判断当前Event触点是否在指定区域之内的两种方法
成长源于积累
目录视图 摘要视图 订阅