Android 播放器框架

Android 播放器框架

1、背景

平常开发中经常会遇到一些音视频播放的一些基础需求,做了这个框架目的是解决这一类需求,提高开发效率

2、API简单使用

3、需求分析

音频播放,视频播放,文本播放

以音频播放为例(听歌)

小明想听歌了,于是拿出手机打开简单听app点了一首听妈妈的话,(听妈妈的话,别让她受伤)好听的音乐响起了,小明沉浸其中。刚听了1分钟,突然有人找小明,小明这时将音乐暂停去处理事情。做完事情之后,小明把手机拿出来点击继续播放 音乐从暂停的地方继续播放,音乐结束了小明换了一首歌 《死了都要爱》 小明想听高潮部分,于是滑动进度,一次一次试终于找到高潮部分 (死了都要爱,不淋漓尽致不痛快,感情多深 只有这样 才足够表白)哒哒哒电话来了,音频暂停了 挂断电话 音乐继续播放

操作行为:

  • 播放
  • 暂停
  • 停止
  • 上一首
  • 下一首
  • 进度改变

状态:

  • 空闲
  • 加载中
  • 播放中
  • 已暂停
  • 已停止

涉及到UI的部分

  • 播放状态
  • 进度更新
  • 通知栏

4、结构设计(java语言)

接口|类组成

  1. PodPlayer 负责控制播放
  2. IPodPlayer 播放接口,定义播放的一些行为
  3. PodMediaPlayer 具体播放实现类
  4. IPod播放信息接口 音频|描述接口
  5. Playlist 播放总负责人
1、IPodPlayer 播放职位描述
public interface IPodPlayer {
    void play(String content);
    void seekTo(int position);
    void pause();
    void resume();
    void release();
    void stop();
    int getState();
    void registerListener(PlayListener listener);
    void unregisterListener();
    interface PlayListener {
        void onPlayProgress(long cur, long total);
        void onPlayStart();
        void onPlayStateChanged(int state);
        void onPlayCompleted();
        void onPlayError(int code, String message);
        void onPlayBufferingUpdate(int percent);
    }
}
2、PodPlayer 播放组高管
public class PodPlayer {
    private IPodPlayer mediaPlay;
    private int mStreamType;
    public PodPlayer(Context context) {
        mediaPlay = PodMediaPlayer.getInstance(context);
    }
    public void start(int stream_type, String content) {}
    public void seekTo(int position) {}
    public void stop() {}
    public void pause() { }
    public void resume() { }
    public int getState() { }
    public void registerListener(IPodPlayer.PlayListener listener) { }
    public void unRegisterListener() { }
    public void release() { }
}

PodPlayer这里作为代理人角色只负责指派任务,目前代理人手里只有一个mediaPlay可以用

这样做的一个好处是:代理人只需要学习stream_type该应该交给谁来执行,后期如果有新的stream_type,代理只需要到市场招聘会这个stream_type人即可,自己不需要去学习stream_type的content如何执行

3、PodMediaPlayer 播放员工(播音频)
public class PodMediaPlayer implements IPodPlayer {
  private MediaPlayer mMediaPlayer;
}

PodMediaPlayer实现了IPodPlayer接口(有播放的能力)说明PodMediaPlayer可以到PodPlayer代理人应聘工作了

PodMediaPlayer最近失业了,去了一家公司 面试 PodPlayer(面试官)说我这里差一个播放音频的活 问道PodMediaPlayer:“你会做stream_type(音频类型),content播放工作吗” ,PodMediaPlayer说到:我当然会呀,我做的很好,从来没出现意外。PodMediaPlayer大喜😄,明天来我这里报道!!

4、IPod 播放信息描述
public interface IPod {
    String getId();
    String getTitle();
    String getContent();
    String getAuthor();
    String getCover();
    int getContentType();
    long getDuration();
}
5、Playlist 播放实施负责人
public class Playlist{
    private static Playlist mInstance;
    private Context context;
    private PodPlayer podPlayer;
    private ArrayList<OnPlayListListener> listeners;
    private ArrayList<IPod> pods;
    private IPod pod;
    private int mLastPlayPosition = -1;
    private PlayEntity mPlay = new PlayEntity();
    private boolean isAppPause;
    private Playlist(Context applicationContext) {}
    public synchronized static Playlist getInstance(Context context) {}
    public void buildPlaylist(ArrayList<? extends IPod> podcasts) { }
    public void play() { }
    public void play(int willPlayPosition) { }
    public void seekTo(int percent) { }
    private void startRead(int willPlayPosition, int lastPosition) { }
    public void pause() { }
    public void pause(boolean isAppPause) { }
    public void checkAndResume() { }
    public void resume() { }
    public void stop() { }
    public void forward(boolean isAuto) { }
    public void forward() { }
    private void reset() { }
    public void backward() { }
    public void release() { }
    public int getState() { }
    public void addOnPlayListListener(OnPlayListListener listener) { }
    public void removeOnPlayListListener(OnPlayListListener listener) { }
    public IPod getPlayPod() {  }
    public boolean isPlaying(String id) { }
    public boolean isConnecting(String id) { }
    public boolean contains(String id) { }
    public long getPlayedDuration() { }
    public long getTotalDuration() { }
    public interface OnPlayListListener {
        void onPlayStateChanged(String tag, int position, int state);
        void onPlayProgressChanged(String tag, int position, long cur, long total);
        void onPlayCompleted(String tag, int position);
        void onPlayError(String tag, int position, int code, String message);
        void onPlayBufferingChanged(String tag, int percent);
    }
    private void unLockWifi() {}
    private void lockWifi() {}
}
6、开工

播放市场部负责人来到PodPlayer(播放高管)面前,最近接了些播放的单子,最好两天之内完成这些播放任务。说着把播放的资料给到PodPlayer,可PodPlayer只认识stream_type,这些资料他也看不懂,PodPlayer把资料交给了他上司PlaylistPlaylist看了下资料不符合播放规范 于是交给了小A加工处理, 小A处理了两分钟最终得到了IPod信息列表 Playlist跟PodPlayer说你现在可以执行播放任务了,Playlist拿了第一个IPod 跟PodPlayer说现在播放stream_type,content。PodPlayer拿到任务后,找到自己手下PodMediaPlayer给我播content

Playlist->PodPlayer->PodMediaPlayerPodMediaPlayerPodPlayer我做完了,PodPlayer对Playlist说我做完了,Playlist说继续下一个。

哒哒哒经过一段时间后任务终于做完了 Playlist对大家说辛苦大家了,晚上请大家吃饭

7、感想

Playlist 专家

PodPlayer 高级开发

PodMediaPlayer 初级开发

Playlist做的工作:将任务资料交给小A,拿到处理后的资料,找到PodPlayer给我做这个事情

PodPlayer的工作:找到PodMediaPlayer 给我做这个事情,收到PodMediaPlayer做完后消息后,通知Playlist事情做完了

PodMediaPlayer工作:累死累活的把工作做完,通知PodPlayer做完了

干具体活的人报酬最少了,还累死累活哒

大家好好学习往上走才能越来越轻松,加油吧😊

憋大招,造轮子,加油!

power by stay4it

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值