Android 音视频开发(何俊林)阅读笔记(3)

1 流程

1通过getService从ServiceManager 获取对应的MediaPlayerService.

2通过调用native_setup函数创建播放器

3 通过调用setDataSource把URL地址传入地址底层

4 通过调用SetDisplay 传入SurfaceHolder, 解码后的数据放在SurfaceHolder 中,最后显示在SurfaceView 中

创建过程的细节

public static MediaPlayer create(Context context, Uri uri, SurfaceHolder holder,
AudioAttributes audioAttributes, int auddioSessionId){
    try{
        MediaPlayer mp = new MediaPlayer();
        final AudioAttributes aa = audioAttributes != null ?
audioAttributes:new AudioAttributes.Builder().build();
        //  声音相关处理,若为空,创建一个
        mp.setAudioAttributes(aa); //设置音频属性
        mp.setAudioSessionId(audioSessionId);
        //设置声音会话id,视频和音频分开渲染
        mp.setDataSource(context, uri);
        //URI 为资源统一标示符
        if(holder != null)
        {
            mp.setDisplay(holder);
            //   给surface 设置一个surface的控制器
            // 控制表面,大小,像素
}
        mp.prepare();
        return mp;
        }catch(IOException ex){
        //  省略各种try catch
}
    return  null;
}

上述code 中实例化MediaPlayer 的两种方法 new and create

MediaPlayer// 播放页处理主页面

public MediaPlayer() {
    Looper looper; // 定义一个 looper
    if((looper = looper.myLooper())!=null){
    //如果mylooper 不为空就复制到looper 中
        myEventHandler = new EventHandler(this, looper);
    // 实例化myEventHandler对象
}else if(looper = looper.getMainLooper())!=null){
    //  如果主线程不为空,也可以赋值到looper中
        myEventHandler = new EventHandler(this, looper);
}else{
        myEventHandler = null;
}

    mTimeProvider = new TimeProvider(this);
    //时间数据容器,一般provider都是和数据联系起来的。
    mOpenSubtitleSource = new Vector();
    //通过Binder 机制获取系统原生服务。比如camera等服务申请,用于打开摄像头,获取声音
    IBinder b = ServiceManager.getService(Context.APP_OPS_SERVICE);
    mAppOps = IAppOpsService.Stub.asInterface(b);
    // Binder 的服务连接桥,把IPC通信过程中的相关服务,对象带回,下面就能使用native_setup开始创建
Mediaplayer
    native_setup(new WeakReference(this))
}

通过Binder 机制获取系统原生服务

在MediaPlay中有一段静态代码块,用于加载和链接库文件,media_jni.so.(早于构造函数, 在加载类时候就执行了,全局性的数据,变量)。

static{
    System.loadlibrary("media_jni");
    native_init();
}


 

你可能感兴趣的:(学习记录)