接着之前两篇文章继续来讲Android视频开发这个主题。今天这篇文章,我们来聊一聊Android中MediaPlayer的DataSource。也许有的同学会觉得奇怪,DataSource有什么好讲的,我们直接调用MediaPlayer的setDataSource方法不就可以了。其实我们要讲的是更深层次的问题:怎么来干预视频播放器获取数据的过程。要解释这个问题,首先我们先来看看原生播放器的组成。下面是原生播放器的结构图。
从图中我们可以看到,播放器的工作流程是:拉流线程通过播放器内的网络库去请求视频数据,然后交给解码线程进行解码,解码线程解析出的视频数据帧交给播放器的渲染线程去绘制到屏幕上。也就是说,播放器是自己去发送网络请求拉取数据的(如果是本地视频直接从本地地址读取),这个过程是完全封闭在播放器内部,用户只需要提供一个播放地址,播放器就帮我们把其他工作做掉了,这样的设计虽然简化了用户的操作,但是灵活性是比较差的,不利于功能的扩展。
为了能够给用户提供更多的灵活性,Android新增了MediaDataSource类,通过给播放器设置MediaDataSource,我们就可以通过这个类来给播放器提供数据源。那么播放器的工作过程就变成了下图所示的样子。播放器每次读取数据都是直接从DataSource获取,至于DataSource的数据是从哪里来,是来自网络还是本地缓存,或者其他什么来源,对播