Android mediaframework创建mediaplayer

// java层

///frameworks/base/media/java/android/media/MediaPlayer.java

public MediaPlayer() {

...

native_setup(new WeakReference<MediaPlayer>(this));

baseRegisterPlayer();

}

// native层

///frameworks/base/media/jni/android_media_MediaPlayer.cpp

//将函数native_setup映射为android_media_MediaPlayer_native_setup

{"native_setup",        "(Ljava/lang/Object;)V",

(void*)android_media_MediaPlayer_native_setup},

android_media_MediaPlayer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this)

{

 sp<MediaPlayer> mp = new MediaPlayer();

if (mp == NULL) {

jniThrowException(env, "java/lang/RuntimeException", "Out of memory");

return;

}

sp<JNIMediaPlayerListener> listener = new JNIMediaPlayerListener(env, thiz, weak_this);

mp->setListener(listener);

 setMediaPlayer(env, thiz, mp);

}

Android mediaframework调用setDatasource

// java层

///frameworks/base/media/java/android/media/MediaPlayer.java

void setDataSource(String path, String[] keys, String[] values,

List<HttpCookie> cookies)

throws IOException, IllegalArgumentException, SecurityException, IllegalStateException {

...

if ("file".equals(scheme)) {

path = uri.getPath();

} else if (scheme != null) {

// handle non-file sources

nativeSetDataSource(MediaHTTPService.createHttpServiceBinderIfNecessary(path, cookies), path, keys, values);

return;

}

}

// 这两个函数是native层的代码,并且在库 'libmedia_jni.so'中例如 :System.loadLibrary("media_jni");

private native void nativeSetDataSource(IBinder httpServiceBinder, String path, String[] keys,

String[] values)throws IOException, IllegalArgumentException,

SecurityException, IllegalStateException;

private native void _setDataSource(FileDescriptor fd, long offset, long length)

throws IOException, IllegalArgumentException, IllegalStateException;

// native层

///frameworks/base/media/jni/android_media_MediaPlayer.cpp

//将函数nativeSetDataSource映射为android_media_MediaPlayer_setDataSourceAndHeaders

static const JNINativeMethod gMethods[] = {

{

"nativeSetDataSource",

"(Landroid/os/IBinder;Ljava/lang/String;[Ljava/lang/String;"

"[Ljava/lang/String;)V",

(void *)android_media_MediaPlayer_setDataSourceAndHeaders

}

...

}

static void android_media_MediaPlayer_setDataSourceAndHeaders(

JNIEnv *env, jobject thiz, jobject httpServiceBinderObj, jstring path,

jobjectArray keys, jobjectArray values) {

sp<MediaPlayer> mp = getMediaPlayer(env, thiz);

if (mp == NULL ) {

jniThrowException(env, "java/lang/IllegalStateException", NULL);

return;

}

...

status_t opStatus =

mp->setDataSource(

httpService,

pathStr,

headersVector.size() > 0? &headersVector : NULL);

...

}

/frameworks/av/media/libmedia/mediaplayer.cpp

status_t MediaPlayer::setDataSource(

const sp<IMediaHTTPService> &httpService,

const char *url, const KeyedVector<String8, String8> *headers)

{

status_t err = BAD_VALUE;

if (url != NULL) {

// 获取mediaserver系统服务进程中的MediaPlayerService的

const sp<IMediaPlayerService> service(getMediaPlayerService());

if (service != 0) {

// 创建一个MediaPlayer代理

sp<IMediaPlayer> player(service->create(this, mAudioSessionId));

...

err = attachNewPlayer(player); // mPlayer = player;

}

}

return err;

}

Android---mediaplayer 创建和调用顺序的更多相关文章

  1. Android MediaPlayer架构 -- MediaPlayer的创建过程

    本文系作者自己学习之所用,文章内容仅出自作者拙劣之思考,问题之处烦请不吝指教. MediaPlayer 能被用来控制音/视频文件或流媒体的回放.Android中以MediaPlayer类作为音视频播放 ...

  2. Android中onInterceptTouchEvent、dispatchTouchEvent及onTouchEvent的调用顺序及内部原理

    在Android中需要经常对用户手势进行判断,在判断手势时需要精细的分清楚每个触摸事件以及每个View对事件的接收情况,在View,ViewGroup,Activity中都可以接收事件,在对事件进行处 ...

  3. Android 页面跳转之生命周期调用顺序问题

    Android Activity 常用技巧 Android Activity 启动模式和任务栈 Android 页面跳转之生命周期调用顺序问题 一.页面跳转逻辑分析 1.1 跳转逻辑分析 Androi ...

  4. Android之Activity界面跳转--生命周期方法调用顺序

    这本是一个很基础的问题,很惭愧,很久没研究这一块了,已经忘得差不多了.前段时间面试,有面试官问过这个问题.虽然觉得没必要记,要用的时候写个Demo,打个Log就清楚了.但是今天顺手写了个Demo,也就 ...

  5. Android Mediaplayer各种属性和方法简单介绍

    主要涉及类:MediaPlayer (1) 当一个MediaPlayer对象被创建或者调用reset()方法之后,它处于空闲状态,调用release()方法后处于结束状态 1,一个MediaPlaye ...

  6. Android MediaPlayer的生命周期

    MediaPlayer的状态转换图也表征了它的生命周期,如下: 这张状态转换图清晰的描述了MediaPlayer的各个状态,也列举了主要的方法的调用时序,每种方法只能在一些特定的状态下使用,如果使用时 ...

  7. android MediaPlayer API大全已经方法详解(转载)

    通过这张图,我们可以知道一个MediaPlayer对象有以下的状态: 1)当一个MediaPlayer对象被刚刚用new操作符创建或是调用了reset()方法后,它就处于Idle状态.当调用了rele ...

  8. Android MediaPlayer状态机

    对播放音频/视频文件和流的控制是通过一个状态机来管理的.下图显示一个MediaPlayer对象被支持的播放控制操作驱动的生命周期和状态.椭圆代表MediaPlayer对象可能驻留的状态.弧线表示驱动M ...

  9. 翻译的很好的一篇android mediaplayer

    MediaPlayer类可用于控制音频/视频文件或流的播放.关于如何使用这个类的方法还可以阅读VideoView类的文档. 1.状态图对播放音频/视频文件和流的控制是通过一个状态机来管理的.下图显示一 ...

  10. Android MediaPlayer和VideoView的使用

          MediaPlayer MediaPlayer类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码和播放音视频.它支持三种不同的媒体来源: 本地资源 内部 ...

随机推荐

  1. java中线程的两种创建方式

    第一种:继承java.lang.Thread类.然后重写run方法 例如我们模拟一个龟兔赛跑 1 package edu.aeon.thread; 2 3 /** 4 * 说明:模拟龟兔赛跑 5 * ...

  2. beego入门

    beego的官方仓库地址是 https://github.com/beego/beego 为什么要特别说明这个事情呢?因为我们引入的包地址,有可能是从官方fork的,特别是beego,有的教程上通过g ...

  3. Self-Attention学习

    2个连接+1个视频推荐 Self-Attention 原理与代码实现_DonngZH的博客-CSDN博客_selfattention代码 Transformer模型详解(图解最完整版) - 知乎 (z ...

  4. java基础(一)~~内存分析

    1.java内存分析 2.2.面向对象内存分析 Java虚拟机的内存可以分为三个区域:栈(stack).堆(heap).方法区(method area): 2.2.1.栈 栈的特点如下: 1.栈描述的 ...

  5. MyLiveCam使用条款与免责协议

    MyLiveCam(以下简称"我们")在此特别提醒您务必认真阅读.充分理解本<使用条款与免责协议>(以下简称"本协议")中各条款并选择是否接受本协议 ...

  6. java和js 用正则表达式切割省市县的代码

    String s= "安徽省合肥市肥西县上派镇"; // String regex="(\\?[^省]+自治区|.*?省|.*?行政区|.*?市)(\\?[^市]+自治州 ...

  7. http头部meta 作用

    <meta charset="utf-8"> <!-- 设置文档字符编码 --> <meta http-equiv="x-ua-compat ...

  8. SqlServer查看所有表数据条数

    select a.name as 表名, max(b.rows) as 记录条数 from sysobjects a ,sysindexes b where a.id=b.id and a.xtype ...

  9. idea安装破解

    转 一般都会去官网下载,官网地址IntelliJ IDEA,官网上对于不同的操作系统(windows,macOS,Linux)都有两个版本可供下载 3|0安装 确认已经安装好了 JDK ,每个IDEA ...

  10. abc285h题解

    考虑容斥,强制要求\(k\)个数为完全平方数,系数为\((-1)^k*C_n^k\)(因为我们要从\(n\)个数选出\(k\)个数作为完全平方数).则在唯一分解\(p_1^{e_1}...p_n^{e ...