




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 智能平台开发部智能平台开发部 AndroidAndroid 平台多媒体设计平台多媒体设计 版本号版本号V0 1修订内容修订内容修订日期修订日期 拟拟 制制 文件性质文件性质密密 级级 审审 核核文件编号文件编号 批批 准准生效日期生效日期发放号发放号 发发 放放 至至 此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 修改记录修改记录 1 V0 1 完成时间完成时间 2009 7 8 修改人 修改人 修改内容 初始版本修改内容 初始版本 此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 目 录 修改记录修改记录 1 1 编写目的编写目的 1 2 编写背景编写背景 1 3 参考资料参考资料 1 4 ANDROID 总体架构图总体架构图 1 5 ANDROID 多媒体的架构多媒体的架构 1 5 1 多媒体架构概览 1 5 2 多媒体总体架构图 1 5 3 MEDIAPLAYER的各个库之间的结构如下图的表示 2 5 4 整个 MEDIAPLAYER库和调用的关系图 3 6 应用层架构分析 应用层架构分析 3 6 1 JAVA 程序部分 3 6 2 MEDIAPLAYER的 JAVA 本地调用部分 4 6 3 MEDIAPLAYER本地库LIBMEDIA SO 5 6 4 MEDIA服务LIBMEDIASERVICE SO 7 6 5 头文件 IMEDIAPLAYERCLIENT H 8 6 6 头文件MEDIAPLAYER H 8 6 7 头文件 IMEDIAPLAYER H 9 6 8 头文件 IMEDIAPLAYERSERVICE H 10 6 9 头文件 MEDIAPLAYERINTERFACE H 10 7 PVPLAYER 架构分析架构分析 11 7 1 PACKETVIDEO架构总览 11 7 2 整个 OPENCORE库和调用的关系图 12 7 3 PVPLAYER架构图 13 7 4 PVPLAYER状态机 API LEVEL的状态机 13 7 4 1 基本的状态机 13 7 4 2 详细的状态机 14 7 5 ANDROID PLAYER ADAPTER 14 7 6 PVPLAYER ENGINE 17 7 7 PVMF NODES 19 7 7 1 omx相关的node 19 7 7 2 File Parser 20 7 8 PVPLAYER的能力 21 8 MUSIC 播放数据流图播放数据流图 21 9 VIDEO 播放流程播放流程 22 10 ROADMAP 24 10 1 移植 MPLAYER支持更多格式播放 24 10 2 性能指标 24 10 2 1 目标参数 24 10 2 2 Marvell在Android上有关多媒体支持能力与现状 24 10 2 3 附测试数据供参考 25 此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 1 编写目的 本文档描述在Android平台中多媒体的框架设计 在Android中 多媒体部分包括MediaPlayerr应用 media recorder应用 video recorder voice recorder image center image capture view opencore等 此文档仅仅包含MediaPlayer与opencore的架构 2 编写背景 总结前段时间的学习 为后续工作开展打下基础 3 参考资料 N A 4 Android 总体架构图 5 Android 多媒体的架构 5 1 多媒体架构概览 多媒体应用基于Android的多媒体架构 MediaPlayer包含了Audio和Video的播放功能 在Android的界面上 Music和Video两个应用程序都是调用MediaPlayer实现的 MediaPlayer在底层是基于Opencore PacketVideo 的 库实现的 为了构建一个MediaPlayer程序 上层还包含了进程间通讯等内容 这种进程间通讯的基础是 Android基本库中的Binder机制 5 2 多媒体总体架构图 此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 5 3 MediaPlayer的各个库之间的结构如下图的表示 Media 程序 Android Media Java API libmedia jni so libandroid runtime so libmedia solibmediaplayerservice so MediaPlayerInterface MidiFile Vorbis codec Libopencoreplayer so Binder Java Layer C Layer 在各个库中 libmedia so与libmediaplayerservice so位于核心的位置 libmedia so对上层的提供的接口主要是 MediaPlayer类 类libmedia jni so通过调用MediaPlayer类提供对JAVA的接口 并且实现了 android media MediaPlayer类 libmediaplayerservice so 是 Media 的服务器 它通过继承 libmedia so 的类实现服务器的功能 而 libmedia so 中的另外一部分内容则通过进程间通讯和 libmediaplayerservice so 进行通讯 libmediaplayerservice so 的真正功 能通过调用 OpenCore Player 库 libopencoreplayer so 来完成 此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 5 4 整个 MediaPlayer 库和调用的关系图 从框架结构上来看 IMediaPlayerService h IMediaPlayerClient h和MediaPlayer h三个类定义了 MeidaPlayer的接口和架构 MediaPlayerService cpp和mediaplayer coo两个文件用于MeidaPlayer架构的实现 MeidaPlayer的具体功能在PVPlayer 库libopencoreplayer so 中的实现 6 应用层架构分析 6 1 JAVA程序部分 在 packages apps Music src com android music 目录的 MediaPlaybackService java 文件中 包含了对 MediaPlayer 的调用 在 MediaPlaybackService java 中包含对包的引用 import android media MediaPlayer 在 MediaPlaybackService 类的内部 定义了 MultiPlayer 类 private class MultiPlayer private MediaPlayer mMediaPlayer new MediaPlayer MultiPlayer 类中使用了 MediaPlayer 类 其中有一些对这个 MediaPlayer 的调用 调用的过程如下所示 mMediaPlayer reset mMediaPlayer setDataSource path mMediaPlayer setAudioStreamType AudioManager STREAM MUSIC 此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 reset setDataSource 和 setAudioStreamType 等接口就是通过 JAVA 本地调用 JNI 来实现的 6 2 MediaPlayer的JAVA本地调用部分 MediaPlayer 的 JAVA 本地调用部分在目录 frameworks base media jni 的 android media MediaPlayer cpp 中的文件中实现 android media MediaPlayer cpp 之中定义了一个 JNINativeMethod JAVA 本地调用方法 类型的数组 gMethods 如下所示 static JNINativeMethod gMethods setDataSource Ljava lang String V void android media MediaPlayer setDataSource setDataSource Ljava io FileDescriptor JJ V void android media MediaPlayer setDataSourceFD prepare V void android media MediaPlayer prepare prepareAsync V void android media MediaPlayer prepareAsync start V void android media MediaPlayer start stop V void android media MediaPlayer stop getVideoWidth I void android media MediaPlayer getVideoWidth getVideoHeight I void android media MediaPlayer getVideoHeight seekTo I V void android media MediaPlayer seekTo pause V void android media MediaPlayer pause isPlaying Z void android media MediaPlayer isPlaying getCurrentPosition I void android media MediaPlayer getCurrentPosition getDuration I void android media MediaPlayer getDuration release V void android media MediaPlayer release reset V void android media MediaPlayer reset setAudioStreamType I V void android media MediaPlayer setAudioStreamType setLooping Z V void android media MediaPlayer setLooping setVolume FF V void android media MediaPlayer setVolume getFrameAt I Landroid graphics Bitmap void android media MediaPlayer getFrameAt native setup Ljava lang Object V void android media MediaPlayer native setup native finalize V void 此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 android media MediaPlayer native finalize JNINativeMethod 的第一个成员是一个字符串 表示了 JAVA 本地调用方法的名称 这个名称是在 JAVA 程序中调用的名称 第二个成员也是一个字符串 表示 JAVA 本地调用方法的参数和返回值 第三个成员是 JAVA 本地调用方法对应的 C 语言函数 其中 android media MediaPlayer reset 函数的实现如下所示 static void android media MediaPlayer reset JNIEnv env jobject thiz sp mp getMediaPlayer env thiz if mp NULL jniThrowException env java lang IllegalStateException NULL return process media player call env thiz mp reset NULL NULL 在 android media MediaPlayer reset 的调用中 得到一个 MediaPlayer 指针 通过对它的调用实现实际的功 能 register android media MediaPlayer 用于将 gMethods 注册为的类 android media MediaPlayer 其实现如下 所示 static int register android media MediaPlayer JNIEnv env jclass clazz clazz env FindClass android media MediaPlayer return AndroidRuntime registerNativeMethods env android media MediaPlayer gMethods NELEM gMethods android media MediaPlayer 对应 JAVA 的类 android media MediaPlayer 6 3 mediaplayer本地库libmedia so libs media mediaplayer cpp 文件用于实现 mediaplayer h 提供的接口 其中一个重要的片段如下所示 const sp if mMediaPlayerService get 0 sp sm defaultServiceManager sp binder do binder sm getService String16 media player if binder 0 break LOGW MediaPlayerService not published waiting usleep 500000 0 5 s while true if mDeathNotifier NULL mDeathNotifier new DeathNotifier binder linkToDeath mDeathNotifier mMediaPlayerService interface cast binder 此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 LOGE IF mMediaPlayerService 0 no MediaPlayerService return mMediaPlayerService 其中最重要的一点是 binder sm getService String16 media player 这个调用用来得到一个名称为 media player 的服务 这个调用返回值的类型为 IBinder 根据实现将其转换成类型 IMediaPlayerService 使用 一个具体的函数 setDataSource 如下所示 status t MediaPlayer setDataSource const char url LOGV setDataSource s url status t err UNKNOWN ERROR if url NULL const sp if service 0 sp player service create getpid this url err setDataSource player return err 在函数 setDataSource 函数中 调用 getMediaPlayerService 得到了一个 IMediaPlayerService 又从 IMediaPlayerService 中得到了 IMediaPlayer 类型的指针 通过这个指针进行着具体的操作 其他一些函数的实现也与 setDataSource 类似 libmedia so 中的其他一些文件与头文件的名称相同 它们是 libs media IMediaPlayerClient cpp libs media IMediaPlayer cpp libs media IMediaPlayerService cpp 为了实现 Binder 的具体功能 在这些类中还需要实现一个 BpXXX 的类 例如 IMediaPlayerClient cpp 的实 现如下所示 l class BpMediaPlayerClient public BpInterface public BpMediaPlayerClient const sp data writeInterfaceToken IMediaPlayerClient getInterfaceDescriptor data writeInt32 msg data writeInt32 ext1 data writeInt32 ext2 remote transact NOTIFY data 还需要实现定义宏 IMPLEMENT META INTERFACE 这个宏将被展开 生成几个函数 IMPLEMENT META INTERFACE MediaPlayerClient android hardware IMediaPlayerClient 此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 以上的实现都是基于Binder框架的实现方式 只需要按照模版实现即可 其中BpXXX的类为代理类 proxy BnXXX的类为本地类 native 代理类的transact函数和本地类的onTransact函数实现对应的通 讯 6 4 media服务libmediaservice so frameworks base media libmediaplayerservice 目录中的 MediaPlayerService h 和 MediaPlayerService cpp 用于实现一 个 servers media 的服务 MediaPlayerService 是继承 BnMediaPlayerService 的实现 在这个类的内部又定义了类 Client MediaPlayerService Client 继承了 BnMediaPlayer class MediaPlayerService public BnMediaPlayerService class Client public BnMediaPlayer 在 MediaPlayerService 中具有如下一个静态函数 instantiate void MediaPlayerService instantiate defaultServiceManager addService String16 media player new MediaPlayerService 在 instantiate 函数中 调用 IServiceManager 的一个函数 addService 向其中增加了一个名为 media player 的服务 这个名为 media player 的服务和 mediaplayer cpp 中调用 getService 中得到的使用一样名称 因此 在这里 调用 addService 增加服务在 mediaplayer cpp 中可以按照名称 media player 来使用 这就是使用 Binder 实现进程 间通讯的 IPC 的作用 事实上这个 MediaPlayerService 类是在服务中运行的 而 mediaplayer cpp 调用的功能 在应用中运行 二者并不是一个进程 但是在 mediaplayer cpp 却像一个进程的调用一样调用 MediaPlayerService 的功能 在 MediaPlayerService cpp 中的 createPlayer 函数如下所示 static sp createPlayer player type playerType void cookie notify callback f notifyFunc sp p switch playerType case PV PLAYER LOGV create PVPlayer p new PVPlayer break case SONIVOX PLAYER LOGV create MidiFile p new MidiFile break case VORBIS PLAYER LOGV create VorbisPlayer p new VorbisPlayer break return p 在这里根据 playerType 的类型建立不同的播放器 对于大多数情况 类型将是 PV PLAYER 这时会调用 了 new PVPlayer 建立一个 PVPlayer 然后将其指针转换成 MediaPlayerBase 来使用 对于 Mini 文件的情况 此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 类型为 SONIVOX PLAYER 将会建立一个 MidiFile 对于 Ogg Vorbis 格式的情况 将会建立一个 VorbisPlayer 值得注意的是 PVPlayer MidiFile 和 VorbisPlayer 三个类都是继承 MediaPlayerInterface 得到的 而 MediaPlayerInterface 又是继承 MediaPlayerBase 得到的 因此三者具有相同接口类型 只有建立的时候会调用各 自的构造函数 在建立之后 将只通过 MediaPlayerBase 接口来 MediaPlayerBase 控制它们 在 frameworks base media libmediaplayerservice 目录中 MidiFile h 和 MidiFile cpp 的实现 MidiFile VorbisPlayer h和VorbisPlayer cpp实现一个VorbisPlayer 6 5 头文件IMediaPlayerClient h IMediaPlayerClient h 用于描述一个 MediaPlayer 客户端的接口 描述如下所示 class IMediaPlayerClient public IInterface public DECLARE META INTERFACE MediaPlayerClient virtual void notify int msg int ext1 int ext2 0 class BnMediaPlayerClient public BnInterface public virtual status t onTransact uint32 t code const Parcel 在定义中 IMediaPlayerClient类继承IInterface 并定义了一个MediaPlayer客户端的接口 BnMediaPlayerClient继承了BnInterface 这是为基于Android的基础类Binder机制 实现在进程通讯而构建的 事实上 根据BnInterface类模版的定义BnInterface类 相当于双继承了BnInterface和ImediaPlayerClient 这是Android一种常用的定义方式 6 6 头文件mediaplayer h mediaplayer h 是对外的接口类 它最主要是定义了一个 MediaPlayer 类 class MediaPlayer public BnMediaPlayerClient public MediaPlayer MediaPlayer void onFirstRef void disconnect status t setDataSource const char url status t setDataSource int fd int64 t offset int64 t length status t setVideoSurface const sp status t setListener const sp status t prepare status t prepareAsync status t start status t stop status t pause bool isPlaying status t getVideoWidth int w status t getVideoHeight int h 此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 status t seekTo int msec status t getCurrentPosition int msec status t getDuration int msec status t reset status t setAudioStreamType int type status t setLooping int loop status t setVolume float leftVolume float rightVolume void notify int msg int ext1 int ext2 static sp decode const char url uint32 t pSampleRate int pNumChannels static sp decode int fd int64 t offset int64 t length uint32 t pSampleRate int pNumChannels 从接口中可以看出 MediaPlayer 类刚好实现了一个 MediaPlayer 的基本操作 例如播放 start 停止 stop 暂停 pause 等 另外的一个类 DeathNotifier 在 MediaPlayer 类中定义 它继承了 IBinder 类中的 DeathRecipient 类 class DeathNotifier public IBinder DeathRecipient public DeathNotifier virtual DeathNotifier virtual void binderDied const wp 事实上 MediaPlayer 类正是间接地继承了 IBinder 而 MediaPlayer DeathNotifier 类继承了 IBinder DeathRecipient 这都是为了实现进程间通讯而构建的 这个库和主要类之间的关系如下所示 6 7 头文件IMediaPlayer h IMediaPlayer h 主要的的内容是一个实现 MediaPlayer 功能的接口 它的主要定义如下所示 class IMediaPlayer public IInterface public DECLARE META INTERFACE MediaPlayer virtual void disconnect 0 virtual status t setVideoSurface const sp virtual status t prepareAsync 0 virtual status t start 0 virtual status t stop 0 virtual status t pause 0 virtual status t isPlaying bool state 0 virtual status t getVideoSize int w int h 0 virtual status t seekTo int msec 0 virtual status t getCurrentPosition int msec 0 virtual status t getDuration int msec 0 virtual status t reset 0 virtual status t setAudioStreamType int type 0 virtual status t setLooping int loop 0 virtual status t setVolume float leftVolume float rightVolume 0 此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 class BnMediaPlayer public BnInterface public virtual status t onTransact uint32 t code const Parcel 在IMediaPlayer类中 主要定义MediaPlayer的功能接口 这个类必须被继承才能够使用 值得注意的是 这些接口和MediaPlayer类的接口有些类似 但是它们并没有直接的关系 事实上 在MediaPlayer类的各种实 现中 一般都会通过调用IMediaPlayer类的实现类来完成 6 8 头文件IMediaPlayerService h IMediaPlayerService h 用于描述一个 MediaPlayer 的服务 定义方式如下所示 class IMediaPlayerService public IInterface public DECLARE META INTERFACE MediaPlayerService virtual sp create pid t pid const sp virtual sp create pid t pid const sp virtual sp decode const char url uint32 t pSampleRate int pNumChannels 0 virtual sp decode int fd int64 t offset int64 t length uint32 t pSampleRate int pNumChannels 0 class BnMediaPlayerService public BnInterface public virtual status t onTransact uint32 t code const Parcel 由于具有纯虚函数 IMediaPlayerService 以及BnMediaPlayerService必须被继承实现才能够使用 在 IMediaPlayerService定义的create和decode等接口 事实上是必须被继承者实现的内容 注意 create的返回 值的类型是sp 这个IMediaPlayer正是提供实现功能的接口 6 9 头文件MediaPlayerInterface h MediaPlayerInterface h 定义的是一个 MeidaPlayer 底层的接口 这个类的实现者是最终实现媒体播放功能的 MediaPlayerBase 是一个基础的接口类 其主要的接口如下所示 class MediaPlayerBase public RefBase public MediaPlayerBase mCookie 0 mNotify 0 virtual MediaPlayerBase virtual status t initCheck 0 virtual bool hardwareOutput 0 此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 virtual status t setSigBusHandlerStructTLSKey pthread key t key return 0 virtual status t setDataSource const char url 0 virtual status t setDataSource int fd int64 t offset int64 t length 0 virtual status t setVideoSurface const sp virtual status t prepare 0 virtual status t prepareAsync 0 virtual status t start 0 virtual status t stop 0 virtual status t pause 0 virtual bool isPlaying 0 virtual status t getVideoWidth int w return 0 virtual status t getVideoHeight int h return 0 virtual status t seekTo int msec 0 virtual status t getCurrentPosition int msec 0 virtual status t getDuration int msec 0 virtual status t reset 0 virtual status t setLooping int loop 0 virtual player type playerType 0 virtual void setNotifyCallback void cookie notify callback f notifyFunc mCookie cookie mNotify notifyFunc MediaPlayerInterface 继承了类 MediaPlayerBase class MediaPlayerInterface public MediaPlayerBase public virtual MediaPlayerInterface virtual bool hardwareOutput return false virtual void setAudioSink const sp protected sp mAudioSink MediaPlayerInterface 本身还是一个纯虚类 只作为接口使用 MediaPlayerBase 和 MediaPlayerInterface 是 底层的接口 这些接口被 MediaPlayer 的服务所调用 用于实现 MediaPlayer 的具体功能 Android Browser 的主要执行流程 7 PVPlayer 架构分析 7 1 PacketVideo架构总览 PacketVideo的另外一个称呼是OpenCore 它是Android的多媒体核心 OpenCore是一个多媒体的框架 从 宏观上来看 它主要包含了两大方面的内容 PVPlayer 提供媒体播放器的功能 完成各种音频 Audio 视频 Video 流的回放 Playback 功能 PVAuthor 提供媒体流记录的功能 完成各种音频 Audio 视频 Video 流的以及静态图像捕获功能 OSCL Operating System Compatibility Library 操作系统兼容库 包含了一些操作系统底层的操作 为了更好地在不同操作系统移植 包含了基本数据类型 配置 字符串工具 IO 错误处理 线程等内容 类 似一个基础的C 库 此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 PVMF PacketVideo Multimedia Framework PV多媒体框架 在框架内实现一个文件解析 parser 和 组成 composer 编解码的NODE 也可以继承其通用的接口 在用户层实现一些NODE OSCL Operating System Compatibility Library PVMF PacketVideo Multimedia Framework PV 多媒体框架 PVAuthor引擎PVPlayer引擎 Play 适适配配层层和和应应用用程程序序Author 适适配配层层和和应应用用程程序序 PVMF的NODEPVMF的NODE L Li in nu ux x K Ke er rn ne el l 7 2 整个Opencore库和调用的关系图 libopencorecommon so libopencoreauthor solibopencoreplayer so libopencoremp4 so libopencoremp4reg so 注册 动态 加载 libopencorenet support so 依赖 libopencoredownlo ad so libopencoredownloadreg s o 注册 动态 加载 libopencorertsp so Libopencorertspreg so 注册 动态 加载 调用 调用 依赖 依赖依赖 Player 对外接口 Author 对外接口 Android平台底层库 libutils so libcutils so libhardware so libandroid runtime so等 依赖依赖 OpenCore 的各个库之间具有如下的关系 libopencorecommon so 是所有的库的依赖库 提供了公共的功能 libopencoreplayer so 和 libopencoreauthor so 是两个并立的库 分别用于回放和记录 而且这两个库是 此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 OpenCore 对外的接口库 libopencorenet support so 提供网络支持的功能 一些功能以插件 Plug In 的方式放入Player中使用 每个功能使用两个库 一个实现具体功能 一个用于注 册 7 3 PVPlayer架构图 ApplicaitonApplicaiton OpenCore Common lib libopencorecommon so PVMF Player Engine Android Player Video Output Audio Output Player Driver PVPlayer libopencoreplayer so 7 4 PVPlayer状态机 API Level的状态机 7 4 1 基本的状态机 此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 7 4 2 详细的状态机 7 5 Android Player Adapter Android 的 Player 的 适配器 需要调用 OpenCore 的 Player Engine 的接口 实现 Android 的媒体播放 器的服务所需要接口 即最终实现一个 PVPlayer 而 PVPlayer 实际上是继承了 MediaPlayerInterface 在实现过程中 首先实现了一个PlayerDriver 然后再使用PVPlayer PVPlayer通过调用PlayerDriver来 完成具体的功能 整个实现的结构图如图所示 此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 GetPVPlayerState AddDataSource Init AddDataSink Prepare Start Pause Resume Stop RemoveDataSink Reset RemoveDataSource PVPlayerInterface PVPlayerFactory PVPlayerDataSink PVPlayerDataSinkFilenamePVPlayerDataSinkPVMFNode PVPlayer PVPlayerDriver AndroidSurfaceOutputAndroidAudioOutput MediaPlayerInterface 对 PVPlayerDriver 的各种操作使用各种命令来完成 这些命令在 playerdriver h 中进行的定义 enum player command type PLAYER QUIT 1 PLAYER SETUP 2 PLAYER SET DATA SOURCE 3 PLAYER SET VIDEO SURFACE 4 PLAYER SET AUDIO SINK 5 PLAYER INIT 6 PLAYER PREPARE 7 PLAYER START 8 PLAYER STOP 9 PLAYER PAUSE 10 PLAYER RESET 11 PLAYER SET LOOP 12 PLAYER SEEK 13 PLAYER GET POSITION 14 PLAYER GET DURATION 15 PLAYER GET STATUS 16 PLAYER REMOVE DATA SOURCE 17 PLAYER CANCEL ALL COMMANDS 18 这些命令一般实现的是 PVPlayerInterface 各个接口的简单封装 例如对于较为简单的暂停播放这个操作 整 个系统执行的过程如下所示 1 在 PVPlayer 中的 pause 函数 在 playerdriver cpp 文件中 此文档收集于网络 如有侵权 请联系网站删除 此文档仅供学习与交流 status t PVPlayer pause LOGV pause return mPlayerDriver enqueueCommand new PlayerPause 0 0 这时调用其成员 mPlayerDriver PlayerDriver 类型 的函数 将一个 PlayerPause 命令加入了命令序列 具体的 各种命令功能在 playerdriver h 文件中 2 PlayerDriver 类的 enqueueCommand 将间接调用各个以 handle 为开头的函数 对于 PlayerPause 命令 调用 的函数是 handlePause void PlayerDriver handlePause PlayerPause ec LOGV call pause mPlayer Pause 0 FinishSyncCommand ec 这里的 mPlayer 是一个 PVPlayerInterface 类型的指针 使用这个指针调用到了 OpenCore 的 Player Engine 中的 PVPlayerEngine 类 在这个播放器适配器的实现中 一个主要的工作是将 Android 框架中定义的媒体的输出 包括 Audio 的输出和 Video 的输出 转换成 OpenCore 的 Player Engine 需要的形式 在这里两个重要的类是 android surface output cpp 实现的 AndroidSurfaceOutput android audio output cpp 实现的 AndroidAudioOutput 对于 Video 输出的设置过程 在类 PlayerDriv
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 金属材料及加工工艺 参考答案
- 2025年新能源行业供应链风险预警与产业链安全评估体系创新报告
- 页岩气开采新技术2025:环境风险评估与生态保护区域划定与生态补偿政策研究
- 人力资源管理师三级考试题
- 工业化进步与安全培训课件
- 2025年宿迁中考试题及答案
- 社区护理学理论考试题
- 农发行衡水市深州市2025秋招笔试英文行测高频题含答案
- 软件工程基础知识考试题
- 平板钉钉上传课件操作
- 机器设备安装调试费率
- 蹴球正撞球技术教案
- 18米固定式高杆灯
- 临时起搏器植入术后护理(心血管内科)
- 有机化学饱和烃课件
- GB/T 30707-2014精细陶瓷涂层结合力试验方法划痕法
- GB/T 26536-2011竹条
- 公司付款委托书 模板
- 全屋定制基础知识培训课件
- 设备安装施工方案
- 危险化学品作业场所安全、危险象形图、方向辅助标志、警戒线、警示语句、图形标志尺寸、基本形式
评论
0/150
提交评论