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

目录
  • MediaPlayer
  • 简单使用
  • 缺陷
  • AndroidMediaPlayer播放器封装
    • 状态机编写
    • 内部类
    • 初始化函数
    • 方法和回调
  • 小结

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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 21天学习android开发教程之MediaPlayer

    本文介绍MediaPlayer的使用.MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用MediaPlayer,要视情况选择了.MediaPlayer播放音频比较简单,但是要播放视频就需要SurfaceView.SurfaceView比普通的自定义View更有绘图上的优势,它支持完全的OpenGL ES库. 先贴出本文程序运行结果的截图,上面是播放/停止音频,可用SeekBar来调进度,下面

  • Android MediaPlayer 音频倍速播放 调整播放速度问题

    现在市面上的很多音视频App都有倍速播放的功能,例如把播放速度调整为0.5.1.5.2倍等等. 从Android API 23 (Android M)开始,MediaPlayer支持调整播放速度. 使用的方法是setPlaybackParams,传入一个代表播放属性的类PlaybackParams. 本文介绍如何使用MediaPlayer调整播放速度. MediaPlayer.setPlaybackParams 说明 播放速度设置在PlaybackParams对象中,再将此对象传入setPlay

  • Android开发之MediaPlayer多媒体(音频,视频)播放工具类

    本文实例讲述了Android开发之MediaPlayer多媒体(音频,视频)播放工具类.分享给大家供大家参考,具体如下: package com.android.imooc.chat; import java.io.IOException; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; impor

  • Android多媒体应用使用MediaPlayer播放音频

    Android提供了对常用音频和视频格式的支持,它所支持的音频格式有MP3(.mp3).3GPP(.3gp).Ogg(.ogg)和WAVE(.ave)等,支持的视频格式有3GPP(.3gp)和MPEG-4(.mp4)等.通过AndroidAPI提供的相关方法,在Android中可以实现音频与视频的播放. 下面介绍使用MediaPlayer播放音频 在Android中,提供了MediaPlayer类来播放音频.使用MediaPlayer类播放音频比较简单,只需要创建该类的对象,并为其指定要播放的音

  • Android开发之MediaPlayer基本使用方法详解

    本文实例讲述了Android MediaPlayer基本使用方法.分享给大家供大家参考,具体如下: 使用MediaPlayer播放音频或者视频的最简单例子: Java代码部分: public class MediaPlayerStudy extends Activity { private Button bplay,bpause,bstop; private MediaPlayer mp = new MediaPlayer(); @Override public void onCreate(Bu

  • Android MediaPlayer 播放音频的方式

    主要介绍使用MediaPlayer播放音频的方式.关于MediaPlayer的基础知识,比如状态,可以参考Android MediaPlayer基础简介. 为了方便表达,定义变量名为mediaPlayer. MediaPlayer的使用方式 创建MediaPlayer 可以直接 new MediaPlayer,也可以用MediaPlayer提供的create方法创建. mediaPlayer = new MediaPlayer(); 使用create方法创建成功后,mediaPlayer处于Pr

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

    目录 MediaPlayer 简单使用 缺陷 AndroidMediaPlayer播放器封装 状态机编写 内部类 初始化函数 方法和回调 小结 MediaPlayer Android多媒体框架支持播放提供了MediaPlayerAPI,可以通过MediaPlayer来实现媒体文件播放.可以说MediaPlayer是非常方便使用的多媒体播放器,只需要简单设置就能实现对音频和视频播放功能,其内部帮助开发者实现了播放对象获取解码以及播放功能. 简单使用 MediaPlayer支持多种资源形式:本地资源

  • Android音视频开发之MediaExtactor使用教程

    目录 前言 MediaExtactor 使用MediaExtactor 加载音视频文件代码 获取轨道代码 提取轨道数据信息 一些源码细节分析 前言 在之前学习如何使用MediaPlayer后,了解到Android系统提供开发者播放多媒体全家桶能力,但对于开发者希望DIY自由度更高的播放器能力也是可以利用Android内部提供组件包自行实现一个播放器的.举例实现一个视频播放这个流程,它大致流程是[多媒体文件解析提取视频文件]-> [视频流解码]-> [解码数据播放渲染到Render].首要需要实

  • Android音视频开发之MediaCodec的使用教程

    目录 前言 MediaCodec 编解码流程 生命周期 接口简介 前言 获取到音视频轨道(编解码格式),知道设备支持哪些编解码器,下一步就是创建编解码器去实现数据流的编解码过程了.在Android开发中提供了实现音视频编解码工具MediaCodec,针对对应音视频解码类型通过该类创建对应解码器就能实现对数据进行解码操作. MediaCodec MediaCodec所支持的数据类型:压缩的音视频数据.原始音频数据和原始视频数据. 首先show代码,紧接着之前MediaExtactor提取资源,Me

  • Android音视频开发之VideoView使用指南

    目录 VideoView介绍 MediaController 使用 源码分析 进度显示 播放尺寸适配 VideoView介绍 之前介绍过使用MediaPlayer+SurfaceView实现播放视频功能.无意间发现官方封装了VideoView组件来实现简单视频播放功能,内部同样是使用MediaPlayer+SurfaceView的形式控制MediaPlayer对视频文件进行播放.使用场景比较简单,适用于只是播放视频的场景,其提供能力有限不太适合使用在调节视频亮度等其他功能. MediaContr

  • Android 媒体开发之MediaPlayer状态机接口方法实例解析

    一. MediaPlayer 状态机 介绍 Android MediaPlayer 状态即图例 : 1. Idle (闲置) 状态 和 End (结束) 状态 MediaPlayer 对象声明周期 : 从 Idle 到 End 状态就是 MediaPlayer 整个生命周期; -- 生命周期开始 : 进入 Idle (闲置) 状态; -- 生命周期结束 : 进入 End (结束) 状态; Idle 和 End 状态转换 : -- 进入 Idle 状态 : MediaPlayer 刚被创建 new

  • Android音视频开发Media FrameWork框架源码解析

    目录 一.Media FrameWork背景 二.Media Framework“路线图” 2.1 代理端 2.2 服务端 2.2.1 Source 2.2.2 Decoder 2.2.3 Renderer 2.2.4 Foundation 2.3 OMX端 2.4 Kernel端 三.media播放的流程 四.Media FrameWork源码分析 一.Media FrameWork背景 Media Framework (媒体函数库):此函数库让Android 可以播放与录制许多常见的音频与视

  • Android开发之Wifi基础教程

    本文实例讲述了Android开发Wifi的基础知识.分享给大家供大家参考.具体如下: Android提供了WifiManager这个类,通过这个类可以进行wifi相关的各种操作. 通过 wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE) 可获取该类的实例. 1. 获取wifi开启状态 (只要手机的wifi打开了,即认为是开启状态,而与是否连接了某个wifi无关): boolean isOpen = wifiMana

  • Android音视频之视频采集(系统API预览)

    我们了解了视频相关的基础知识,后面的文章我们要能够和音频一样可以采集我们的视频,视频是一帧一帧的图片来的,我们首先要学习预览视频,然后采集一帧图片,采集视频从简到难的来了解这个问题.首先第一个反应打开Google搜索和Android视频采集相关的东西,我们要知道如何通过API来采集,不由自主地到了Android官网的Camera API.Android有两个视频采集的API,Camera是Android 5.0以前使用的,现在已经废弃了,我们还是得学一下他的使用,Camera2是最新的视频采集A

随机推荐