当前位置: 首页>移动开发>正文

Android MediaPlayer setOnProgressListener 弃用 android studio mediaplayer

     为了督促自己对于android MediaPlayer部分的学习与理解,简单的贴出自己逐步学习的过程欢迎大家一起探讨,以及大牛的指导

     第一天20170410:

     看源码的方法是通过点击studio的MediaPlayer进入。

      

public class MediaPlayer implements SubtitleController.Listener


简单的点进入SubtitleController 看了下,感觉是实现了对于MediaPlayer中的视图部分的控制(个人猜想)


在看具体的代码前,看一下MediaPlayer的功能流程



这个是mediaPlayer的功能过程,从直观上理解我们可以从一个播放器的使用流程来考虑问题
最初一个播放器是处于空闲状态的(将这个播放器理解为一个容器),这时候我们需要加载一部影片我们需要
像这个容器中加入视频的数据(视频数据的格式不同,且有各种加入方式,因为是播放和加载的同步进行如何
控制视频数据的正确加入是一个坑,此处后续要看看)。
当一个容器获取到足够的资源时,我们要对这个状态进行确认。
这个准备的过程可以是一个异步的操作(据了解这块有的android版本会有坑点)。
资源就绪了,这时候就要研究一下播放的功能,正常播放对于视频流操作的方法主要是,开始,暂停,快进,停止。这些功能实现了
视频播放流程,但是具体的实现每个方法有很多细节(此处需看一下mediaPlayer中具体的实现的原理)。



简单的顺了一下media的使用流程,第一步我们先看下对于加入数据这一步,mediaPlayer是如何的实现的。
常规思路,一个视频第一步加载时的数据有很多,包括视频数据和音频数据,视频数据要想展示在画面上也需要
画在屏幕上。
开始我的小白琢磨代码的旅程。
因为还不确定,setDateSource这一过程中所做的工作,计划从create开始看起control+f12看一下包含
oncreate的方法。
有三种方法,所传入的参数不同,逐个查看实现的过程,
//第一个create中传入的参数只有context,和一个整数型数据,(因为开始需要有表面的视图变换,以及
内在的数据传入 ,姑且在此时认为是某个控件的Id)
 public static MediaPlayer create(Context context, int resid) {
        try {
            //认为这里是让context获取资源信息的过程
            AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
            if (afd == null) return null;
            //创建了mediaPlayer对象
            MediaPlayer mp = new MediaPlayer();
            mediaPlayer设置了数据
            mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
            //afd这个东西为什么在这一步close?这时候说明之前的判断不太正确。
            afd.close();
            //走到这一步mediaplayer已经到了prepare的状态
            mp.prepare();
            return mp;
        } catch (IOException ex) {
            Log.d(TAG, "create failed:", ex);
            // fall through
        } catch (IllegalArgumentException ex) {
            Log.d(TAG, "create failed:", ex);
           // fall through
        } catch (SecurityException ex) {
            Log.d(TAG, "create failed:", ex);
            // fall through
        }
        return null;
    }


public static MediaPlayer create(Context context, Uri uri) {
//这个的区别是第二个参数不同,第二种以url定位控件的情景还没有想出来,返回值多了一个参数
        return create (context, uri, null);
    }
public static MediaPlayer create(Context context, Uri uri, SurfaceHolder holder) {
    //这个地方多了一个SurfaceHolder,介绍说这个是用来显示视频的
        try {
            MediaPlayer mp = new MediaPlayer();
            mp.setDataSource(context, uri);
这个地方进行了判空操作,猜想这个地方是没有释放播放器时候开始播放
            if (holder != null) {
                mp.setDisplay(holder);
            }
            mp.prepare();
            return mp;
        } catch (IOException ex) {
            Log.d(TAG, "create failed:", ex);
            // fall through
        } catch (IllegalArgumentException ex) {
            Log.d(TAG, "create failed:", ex);
            // fall through
        } catch (SecurityException ex) {
            Log.d(TAG, "create failed:", ex);
            // fall through
        }

        return null;
    }

今天暂时就先看这些

20170415今天终于偷得浮生半日闲继续咱的计划 没偷成,忙了一下午。


总体上不看细节大致就是创建播放器然后set资源,看一下创建播放器的过程。


public MediaPlayer() {

        Looper looper;
//在线程中执行,会优先判断子线程
        if ((looper = Looper.myLooper()) != null) {
            mEventHandler = new EventHandler(this, looper);
        } else if ((looper = Looper.getMainLooper()) != null) {
            mEventHandler = new EventHandler(this, looper);
        } else {
            mEventHandler = null;
        }
        //推测:时间控制,标题控制
        mTimeProvider = new TimeProvider(this);
        mOutOfBandSubtitleTracks = new Vector<SubtitleTrack>();
        mOpenSubtitleSources = new Vector<InputStream>();
        mInbandSubtitleTracks = new SubtitleTrack[0];

        /* Native setup requires a weak reference to our object.
         * It's easier to create it here than in C++.
         */
//从注释中看这里要实现更底层c++的实现
        native_setup(new WeakReference<MediaPlayer>(this));
    }

看一下在线程做的事情,可以判断为对操作事件的判断响应(这个后续研究对视频的操作的时候研究)




https://www.xamrdz.com/mobile/4rd1932587.html

相关文章: