学习使用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,直接指定资源包中视频文件的起始位置和长度就可以了。实现起来简单多了。
再深入研究,肯定还可以实现更多的功能。水平有限,只能先到这里了。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。