hanyeah 专注于AS

安卓FileDescriptor

学习使用MediaPlayer的时候,发现MediaPlayer有一个setDataSource方法,参数是FileDescriptor。

了解一下FileDescriptor,网上几乎都是这篇教程:http://www.cnblogs.com/skywang12345/p/io_09.html

看完还是不知道怎么使用,自从看到了这篇文章:https://zhuanlan.zhihu.com/p/20663017

文章中实现了用MediaPlayer播放assets中的资源。

同样,我们也可以用FileInputStream来读取本地文件,然后调用getFD()获取FileDescriptor对象,最后把FileDescriptor对象作为参数调用MediaPlayer的setDataSource方法。这样转了一大圈实现了本地文件的播放,和直接给MediaPlayer传递本地文件的地址效果是一样的。实现代码如下:

File f=new File(Environment.getExternalStorageDirectory().getPath()+"/test.mp4");
FileInputStream fStream = new FileInputStream(f);
media.setDataSource(fStream.getFD(),0,f.length());

既然直接设置文件地址就可以播放,为什么还要绕个大圈呢?

目前我所要用到的是后边两个参数。多了两个参数,比直接设置地址要灵活多了。具体能干什么呢?

比如我要把视频图片等资源打包到一个文件中,打包之后,如何播放视频呢?最早的想法是先把视频解压到一个缓存文件夹下,再播放,显然这样会影响体验,因为视频文件一般比较大,解压时需要时间的。后来又想到一个办法,因为视频地址可以使用网络地址,要是我们在本地键一个http服务器,然后请求这个服务器,当收到视频文件的请求时,就可以自定义读文件的方式,然后返回了。这样一样可以实现,但是要建http服务器,还要自定义请求的处理方式,显然要复杂的多。

现在,我们可以用FileDescriptor,直接指定资源包中视频文件的起始位置和长度就可以了。实现起来简单多了。

再深入研究,肯定还可以实现更多的功能。水平有限,只能先到这里了。



2017年2月21日 | 发布:hanyeah | 分类:Android | 评论:0

发表留言: