博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android MediaPlayer接口及状态迁移
阅读量:6153 次
发布时间:2019-06-21

本文共 4490 字,大约阅读时间需要 14 分钟。

[时间:2016-09] [状态:Open]

[关键词:android,mediaplayer,播放接口,播放状态图]

引言

本文内容相对简单,作为后续处理的起点,简要整理了Android MediaPlayer的接口层,并且这里只会涉及c层的实现,至于上层的JNI/跨进程调用逻辑,建议参考其他资料。

整理本文的目的仅供个人后续参考使用。

MediaPlayer Interface

我们可以在Android源码中找到MediaPlayerInterface的定义如下:(这里只列出接口信息,详细内容建议参考源码)

// from frameworks/av/include/media/MediaPlayerInterface.h// abstract base class - use MediaPlayerInterfaceclass MediaPlayerBase : public RefBase{public:    // AudioSink: abstraction layer for audio output    class AudioSink : public RefBase {...};    MediaPlayerBase() : mCookie(0), mNotify(0) {}    virtual             ~MediaPlayerBase() {}    virtual status_t    initCheck() = 0;    virtual bool        hardwareOutput() = 0;    virtual status_t    setUID(uid_t /* uid */);    virtual status_t    setDataSource(            const sp
&httpService, const char *url, const KeyedVector
*headers = NULL) = 0; virtual status_t setDataSource(int fd, int64_t offset, int64_t length) = 0; virtual status_t setDataSource(const sp
& /* source */); virtual status_t setDataSource(const sp
& /* source */); // pass the buffered IGraphicBufferProducer to the media player service virtual status_t setVideoSurfaceTexture( const sp
& bufferProducer) = 0; 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 setPlaybackSettings(const AudioPlaybackRate& rate); virtual status_t getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */); virtual status_t setSyncSettings(const AVSyncSettings& sync, float /* videoFps */); virtual status_t getSyncSettings(AVSyncSettings* sync /* nonnull */, float* videoFps /* nonnull */); 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 status_t setParameter(int key, const Parcel &request) = 0; virtual status_t getParameter(int key, Parcel *reply) = 0; // default no-op implementation of optional extensions virtual status_t setRetransmitEndpoint(const struct sockaddr_in* /* endpoint */); virtual status_t getRetransmitEndpoint(struct sockaddr_in* /* endpoint */); virtual status_t setNextPlayer(const sp
& /* next */); virtual status_t invoke(const Parcel& request, Parcel *reply) = 0; virtual status_t getMetadata(const media::Metadata::Filter& /* ids */, Parcel* /* records */); void setNotifyCallback(void* cookie, notify_callback_f notifyFunc); void sendEvent(int msg, int ext1=0, int ext2=0, const Parcel *obj=NULL); virtual status_t dump(int /* fd */, const Vector
& /* args */) const;private: friend class MediaPlayerService; Mutex mNotifyLock; void* mCookie; notify_callback_f mNotify;};// Implement this class for media players that use the AudioFlinger software mixerclass MediaPlayerInterface : public MediaPlayerBase{public: virtual ~MediaPlayerInterface() { } virtual bool hardwareOutput() { return false; } virtual void setAudioSink(const sp
& audioSink) { mAudioSink = audioSink; }protected: sp
mAudioSink;};// Implement this class for media players that output audio directly to hardwareclass MediaPlayerHWInterface : public MediaPlayerBase{public: virtual ~MediaPlayerHWInterface() {} virtual bool hardwareOutput() { return true; } virtual status_t setVolume(float leftVolume, float rightVolume) = 0; virtual status_t setAudioStreamType(audio_stream_type_t streamType) = 0;};

通常我们的调用逻辑是,构造函数->setDataSource->SetVideoSurfaceTexture->prepare/prepareAsync->start->stop->reset->析构函数,按照实际需求还会调用pause、isPlaying、getDuration、getCurrentPosition、setLooping、seekTo等。

各个接口具体含义参考下表:

方法 说明
setDataSource 设置多媒体数据来源(位置)
setVideoSurfaceTexture 设置用SurfaceHolder来显示多媒体
prepare 准备(同步)
prepareAsync 准备(异步)
start 开始播放
stop 停止播放
reset 重置MediaPlayer对象为刚刚创建的状态
getCurrentPosition 得到当前播放位置
getDuration 得到文件的时间
isPlaying 是否正在播放
pause 暂停
seekTo 指定播放的位置(以毫秒为单位的时间)
setLooping 设置是否循环播放

MediaPlayer状态图

MediaPlayer的状态图如下:

MediaPlayer state diagram

这个状态图对应的java层的MediaPlayer。不过可以参考,在实际的源码实现时,不会完全参考这个状态图,可能有更多的内部状态和简化状态。

比如,你可以不调用prepare,直接调用start。
图中各个状态的迁移,建议参考MediaPlayer的官方文档。

参考资料

转载地址:http://jnbfa.baihongyu.com/

你可能感兴趣的文章
英文 停用词 词典
查看>>
广告延迟加载
查看>>
Vue, React, AngularJS, Angular2 我们对流行JavaScript框架们的选择
查看>>
计算机网络概述---数据链路层
查看>>
第10条:在既有类中使用关联对象存放自定义数据
查看>>
在Linux切割文件
查看>>
进度总结
查看>>
软件测试2019:第八次作业
查看>>
MySQL 基础 之 语句执行顺序
查看>>
Codeforces Goodbye 2018
查看>>
Asp.net页面间传值方式汇总
查看>>
C# 数组、ArrayList和List三者的区别
查看>>
docker的核心原理-cgroup
查看>>
浅析操作系统函数调用原理-附实例
查看>>
直线恒过定点问题
查看>>
Elasticsearch初级语句入门
查看>>
洛谷P4762 [CERC2014]Virus synthesis(回文自动机+dp)
查看>>
利用PIL和Selenium实现页面元素截图
查看>>
cdoj 树上战争(Battle on the tree) Label:并查集?
查看>>
LightOJ 1236 Pairs Forming LCM(LCM为n的数对个数)
查看>>