Android音视频开发之MediaPlayer使用教程

 更新时间:2022年04月06日 09:05:07   作者:JulyYu  
Android多媒体框架支持播放提供了MediaPlayerAPI,可以通过MediaPlayer来实现媒体文件播放。可以说MediaPlayer是非常方便使用的多媒体播放器。本文将详细讲解MediaPlayer的使用,需要的可以参考一下

MediaPlayer

Android多媒体框架支持播放提供了MediaPlayerAPI,可以通过MediaPlayer来实现媒体文件播放。可以说MediaPlayer是非常方便使用的多媒体播放器,只需要简单设置就能实现对音频和视频播放功能,其内部帮助开发者实现了播放对象获取解码以及播放功能。

简单使用

MediaPlayer支持多种资源形式:本地资源、内部URI、外部网址。

//播放器实例化
mediaPlayer = new MediaPlayer();
//准备播放素材
Uri uri = Uri.fromFile(new File("sdcard/DCIM","Camera/test.mp4"));
try {
    //播放器载入资源
    mediaPlayer.setDataSource(this,uri);
} catch (IOException e) {
    e.printStackTrace();
}
//播放器异步准备
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        //播放操作
        mediaPlayer.start();
    }
});
//播放窗口展示
SurfaceView surfaceView = new SurfaceView(this);
surfaceView.post(new Runnable() {
    @Override
    public void run() {
        mediaPlayer.setSurface(surfaceView.getHolder().getSurface());
    }
});

以上代码示例就是MediaPlayer简单使用过程。其中prepareAsync()是异步操作需要在回调setOnPreparedListener方法了解最终播放器准备结果然后再执行播放操作。当然播放器也支持同步准备prepare方法,但推荐使用异步操作,因为资源获取过程可能会涉及到解码数据会是耗时操作,同步操作很有可能造成ANR错误。

缺陷

MediaPlayer虽然有内部状态,某些操作只有在特定状态下正确操作才能生效。若在非指定状态下操作或许会导致播放器发生异常更有可能发生崩溃的情况。但播放器的内部状态机并没有暴露接口给开发者,无法随时能够获取到目前播放器当前状态。

AndroidMediaPlayer播放器封装

因为缺陷原因直接使用MediaPlayer就不能很好的去管理状态。因此可以自行对MediaPlayer进行封装使用,可以将功能进行整理并且增加状态管理和方便错误统一处理等逻辑。

状态机编写

根据MediaPlayer状态图预设几种状态类型以暂存播放器内部状态。

private static final int IDLE = 0; // 空闲状态
private static final int INIT = 3;// 初始化状态
private static final int PREPARING = 4;// 准备状态
private static final int PREPARED = 5;// 准备状态
private static final int STARTED = 6;// 开始状态
private static final int PAUSED = 7;// 暂停状态
private static final int STOPPED = 8;// 停止状态

private static final int END = 9; // 结束状态
private static final int ERROR = 10;// 错误状态

内部类

使用mPlayerStatus暂存播放器状态

@IntDef({IDLE,
        END,
        ERROR,
        INIT,
        PREPARED,
        STARTED,
        PAUSED,
        STOPPED,
})
public @interface STATUS {
}

MediaPlayer mMediaPlayer;
Context mContext;
@STATUS
int mPlayerStatus = IDLE;

初始化函数

初始化函数实例化播放器并注册基本播放所需要的回调函数

public AndroidMediaPlayer(Context context) {
    mContext = context;
    mMediaPlayer = new MediaPlayer();
    mMediaPlayer.setOnErrorListener(this);
    mMediaPlayer.setOnCompletionListener(this);
    mMediaPlayer.setOnPreparedListener(this);
    mPlayerStatus = INIT;
}

方法和回调

封装播放器基础方法可供播放调用并且进行状态机判断,若不在可操作范围内则不可执行对应操作。同时对于资源设置方法通过原生api可以看到有许多在形式,但这里就只是用URI来做入参了。

//资源入参
public void setSource(Uri uri){
    try {
        mMediaPlayer.setDataSource(mContext,uri);
        mMediaPlayer.prepareAsync();
        mPlayerStatus = PREPARING;
    } catch (IOException e) {
        e.printStackTrace();
    }
}
// 设置可视化窗口
public void setSurface(Surface surface){
    mMediaPlayer.setSurface(surface);
}
//开始播放
public void start(){
    mMediaPlayer.start();
    mPlayerStatus = STARTED;
}
//暂停
public void pause(){
    if(mPlayerStatus > PAUSED) return;
    mMediaPlayer.pause();
    mPlayerStatus = PAUSED;
}
//停止
public void stop(){
    if(mPlayerStatus > STOPPED) return;
    mMediaPlayer.stop();
    mPlayerStatus = STOPPED;
}
//释放
public void release(){
    if(mPlayerStatus >= INIT){
        mMediaPlayer.release();
        mMediaPlayer = null;
        mPlayerStatus = END;
    }
}
// 错误回调
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
    mPlayerStatus = ERROR;
    return false;
}
// 播放回调
@Override
public void onCompletion(MediaPlayer mp) {

}
// 准备成功回调
@Override
public void onPrepared(MediaPlayer mp) {
    mPlayerStatus = PREPARED;
}

小结

MediaPlayer作为官方提供封装的播放器在使用上并没有什么难度,可以说开发者直接开箱即用。或许对于简单开发视频播放已经足够了,能够播放本地文件或是网络文件等都能支持。但对于深入理解MediaPlayer可能还远远不够,后续去读读源码来了解内部实现。之后要自行实现编解码来播放音视频等能力去处理和添加其他效果的时候,那时MediaPlayer或许就捉襟见肘了。

到此这篇关于Android音视频开发之MediaPlayer使用教程的文章就介绍到这了,更多相关Android MediaPlayer内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android开发获取重力加速度和磁场强度的方法

    Android开发获取重力加速度和磁场强度的方法

    这篇文章主要介绍了Android开发获取重力加速度和磁场强度的方法,结合实例形式分析了Android通过重力传感器与罗盘传感器获取重力加速度与磁场强度的方法,需要的朋友可以参考下
    2017-10-10
  • Android开发常见错误小结

    Android开发常见错误小结

    这篇文章主要介绍了Android开发常见错误,实例分析了常见的Android开发中遇到的错误,对Android开发有一定参考借鉴价值,需要的朋友可以参考下
    2015-05-05
  • Android Canvas之drawBitmap方法案例详解

    Android Canvas之drawBitmap方法案例详解

    这篇文章主要介绍了Android Canvas之drawBitmap方法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Android App开发中自定义View和ViewGroup的实例教程

    Android App开发中自定义View和ViewGroup的实例教程

    这篇文章主要介绍了Android App开发中自定义View和ViewGroup的实例教程,分别介绍了进度条和图片上传并排列的例子,效果很好很强大,需要的朋友可以参考下
    2016-05-05
  • Android DigitalClock组件用法实例

    Android DigitalClock组件用法实例

    这篇文章主要介绍了Android DigitalClock组件用法,结合实例形式分析了DigitalClock组件的布局调用技巧,非常简单实用,需要的朋友可以参考下
    2016-01-01
  • Android使用文件进行IPC

    Android使用文件进行IPC

    这篇文章主要为大家详细介绍了Android使用文件进行IPC,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Android View事件分发机制详解

    Android View事件分发机制详解

    这篇文章主要为大家详细介绍了Android View事件分发机制,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android ellipsize的小问题介绍

    Android ellipsize的小问题介绍

    使用TextView的时候,需要长度过长自动显示省略号,android里有原生的支持,本文将针对此问题进行深入剖析,需要的朋友可以参考
    2012-11-11
  • Android自定义viewgroup快速滑动(4)

    Android自定义viewgroup快速滑动(4)

    这篇文章主要为大家详细介绍了Android自定义viewgroup快速滑动的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • 微信或手机浏览器在线显示office文件(已测试ios、android)

    微信或手机浏览器在线显示office文件(已测试ios、android)

    这篇文章主要介绍了微信或手机浏览器在线显示office文件,已测试ios、android,感兴趣的小伙伴们可以参考一下
    2016-06-06

最新评论