21
2017
02

安卓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-3-3 16:48:11)

FileDescriptor到底实现了那些功能  (2017-3-3 11:13:34)

安卓利用反射调用@Hide隐藏函数  (2017-3-3 10:2:2)

安卓zxing实现二维码扫描  (2017-2-20 13:42:56)

安卓webview中调试js脚本  (2016-8-2 14:21:51)

安卓Camera实现3d效果  (2015-12-23 13:40:0)

(十)hEngine—时钟  (2015-12-21 14:34:48)

(九)hEngine—画波形图  (2015-12-21 12:4:46)

(八)hEngine—打气球小游戏  (2015-12-18 11:0:22)

(七)hEngine—类继承关系  (2015-12-17 13:11:27)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。