公司要做一个在线播放视频的APP。这玩意可真是麻烦啊。咱们可从来没接触过多媒体开发啊。55555~~~。在google搜了半天,都没有一个Open Source的project。郁闷啊郁闷!!
开始恶补MP4的知识。OMG!!光MP4就有200多页的书。唉唉。好不容易将MP4的结构大概明白了。在网上也找到了一个解析MP4的源码。就是这个让我吃尽苦头的IsoParser,可能叫MP4Parser更好些。这个的介绍在
IsoViewer
里面的IsoViewer是用来查看MP4结构的。用法可查看这篇博文:
http://blog.sina.com.cn/s/blog_6c762bb301016swe.html
现在我需要的是解析MP4的java源代码。
解析MP4的Java源代码
源代码的下载地址在:
这个作者很勤奋啊。又有新版本了。
Aspecj
本来以为捡到一个宝贝,结果导入到project中,用不了。需要aspectjrt.jar。在eclipse网站下载下来,然后安装。检查下"C:\aspectj1.7\lib\aspectjrt.jar" 是否有aspectjrt.jar存在。如果有就ok了。
打开刚刚导入了isoparser源代码的工程。在工程名称上右击,选择属性,在属性里选择Java Build Path。
点击Add External JARS,选择aspectjrt.jar
nu.xom.*
接着又说这个nu.xom.*找不到。唉唉。
上网找了一下,终于找到一个地方下载:
将
xom-1.0b3.jar下载下来。然后按上面aspectjrt的方法导入。终于都没有错误了。
这样源代码可以编译通过了。但是解析MP4还是不对。只能得到ftyp,moov和mdat这三个box。moov下面的子box都取不到。唉!!问了IsoParser的开发者,人家说自己编译源代码就是只能取到三个box。最好用他已经编译好了的IsoParser.jar。里面有用到aspectj技术去解析所有的box。
没办法。
下载编译好的jar。
下载编译好的jar
选择
isoparser-1.0-RC-10.jar下载就可以。
导入project中时,也是有讲究的。必须按照下面步骤导入,否则就会报奇奇怪怪的错。譬如下图所示:
首先在这个project下,建立一个目录,叫libs。
接着选择User Library。
点击New...按钮,随便输入一个User Library Name,
IsoParser-1.0-RC-10.jar都是这样导入。导入后project结构如下:
注意:Android Dependencies目录下亚欧有这两个jar文件。如果没有,就重复删除粘贴jar包到libs目录下或者重复删除libs新建libs目录几次,系统又会自动添加进来了。
可用以下代码进行测试。
private
void
parseMP4()
{
String
localFilePath
=
"/sdcard/test.mp4";
IsoFile
isoFile
=
null;
try
{
isoFile
=
new
IsoFile(
new
RandomAccessFile(
localFilePath
,
"r"
).
getChannel());
}
catch (
Exception
e)
{
e
.
printStackTrace();
}
if (
isoFile
==
null)
{
Log
.
i(
TAG
,
"isoFile == null");
return;
}
List
<
Box
>
boxes
=
isoFile
.
getBoxes();
Log
.
i(
TAG
,
"box size:"
+
boxes
.
size());
MovieBox
moov
=
isoFile
.
getBoxes(
MovieBox
.
class
).
get(
0);
if(
moov
!=
null)
{
int
nLen
=
moov
.
getBoxes
().
size();
Log
.
i(
TAG
,
"movie box:"
+
nLen);
MovieHeaderBox
hb
=
moov
.
getMovieHeaderBox();
Log
.
i(
TAG
,
"MovieHeaderBox:"
+
hb);
Log
.
d(
TAG
,
"duration:"
+
hb
.
getDuration());
}
}
{
}
转载自:http://blog.sina.com.cn/s/blog_6c762bb301017f24.html