Android学习总结(十六) ———— MediaPlayer播放音频与视频

一、基本概念   

  本文主要介绍的是Android中很重要也最为复杂的媒体播放器(MediaPlayer)部分的架构。Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的。 MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaPlayer程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。

  它支持三种不同的媒体来源:

  • 本地资源
  • 内部的URI,比如你可以通过ContentResolver来获取
  • 外部URL(流) 对于Android所支持的的媒体格式列表

 

二、代码之旅

  2.1 使用MediaPlayer播放音频:

  布局代码很简单,就播放、暂停、停止按钮,这里就不写出来了,我们还是赶紧看看关键代码吧,代码示例如下:

package com.nyl.mediaplayertest;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity implements View.OnClickListener {

    private Button btnPlay;
    private Button btnPause;
    private Button btnStop;

    private MediaPlayer mediaPlayer = null;
    private boolean isRelease = true; //判断MediaPlayer是否释放的标志

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView(); //初始化控件
    }

    private void initView() {
        btnPlay = (Button) findViewById(R.id.btnPlay);
        btnPause = (Button) findViewById(R.id.btnPause);
        btnStop = (Button) findViewById(R.id.btnStop);

        btnPlay.setOnClickListener(this);
        btnPause.setOnClickListener(this);
        btnStop.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btnPlay: //播放
                if (isRelease){
                    //在raw下的资源
                    mediaPlayer = MediaPlayer.create(this,R.raw.fly);
                    isRelease = false;
                }
                mediaPlayer.start(); //开始播放
                btnPlay.setEnabled(false);
                btnPause.setEnabled(true);
                btnStop.setEnabled(true);
                break;

            case R.id.btnPause:
                mediaPlayer.pause(); //停止播放
                btnPlay.setEnabled(true);
                btnPause.setEnabled(false);
                btnStop.setEnabled(false);
                break;

            case R.id.btnStop:
                mediaPlayer.reset(); //重置MediaPlayer
                mediaPlayer.release(); //释放MediaPlayer
                isRelease = true;
                btnPlay.setEnabled(true);
                btnPause.setEnabled(false);
                btnStop.setEnabled(false);
                break;
        }
    }
}

  注意:播放的是res/raw目录下的音频文件,创建MediaPlayer调用的是create方法,第一次启动播放前 不需要再调用prepare(),如果是使用构造方法构造的话,则需要调用一次prepare()方法!

  当点击播放按钮时,音乐就会播放,哈哈哈~话不多说,感兴趣的朋友还是自己动手操作吧,我们来看运行效果图,如下所示:

  

  2.2 使用MediaPlayer播放视频

  MediaPlayer主要用于播放音频,没有提供图像输出界面,所以我们需要借助其他的 组件来显示MediaPlayer播放的图像输出,我们可以使用用SurfaceView 来显示,下面我们使用SurfaceView来写个视频播放的例子,布局代码如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <SurfaceView
        android:id="@+id/sfvShow"
        android:layout_width="match_parent"
        android:layout_height="300dp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:gravity="center|bottom">

        <Button
            android:id="@+id/btnStart"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="开始" />

        <Button
            android:id="@+id/btnPause"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="暂停 " />

        <Button
            android:id="@+id/btnStop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="终止" />

    </LinearLayout>


</LinearLayout>

  接着就是最关键的代码的,如下所示:

package com.nyl.mediaplayerdemo;

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity implements View.OnClickListener, SurfaceHolder.Callback {

    private SurfaceView sfvShow;
    private Button btnStart;
    private Button btnPause;
    private Button btnStop;

    private MediaPlayer mediaPlayer = null;
    private SurfaceHolder surfaceHolder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView(); //初始化布局控件
    }

    private void initView() {
        sfvShow = (SurfaceView) findViewById(R.id.sfvShow);
        btnStart = (Button) findViewById(R.id.btnStart);
        btnPause = (Button) findViewById(R.id.btnPause);
        btnStop = (Button) findViewById(R.id.btnStop);

        btnStart.setOnClickListener(this);
        btnPause.setOnClickListener(this);
        btnStop.setOnClickListener(this);

        //初始化SurfaceHolder类,SurfaceView的控制器
        surfaceHolder = sfvShow.getHolder();
        surfaceHolder.addCallback(this);
        //显示的分辨率,不设置为视频默认
        surfaceHolder.setFixedSize(320,220);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btnStart:
                mediaPlayer.start();
                break;
            case R.id.btnPause:
                mediaPlayer.pause();
                break;
            case R.id.btnStop:
                mediaPlayer.stop();
                break;
        }

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mediaPlayer = MediaPlayer.create(MainActivity.this,R.raw.lesson);
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        //设置视频显示在SurfaceView上
        mediaPlayer.setDisplay(surfaceHolder);
    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mediaPlayer.isPlaying()){
            mediaPlayer.stop();
        }
        mediaPlayer.release();
    }
}

   运行效果图如下所示:

  

  亲爱的园友们,MediaPlayer播放音频与视频我们就学到这里了,有什么不足的地方欢迎大家提出宝贵意见哦!

posted @ 2017-03-16 21:18  ButterflyGirl  阅读(3162)  评论(1编辑  收藏  举报