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播放音頻與視頻我們就學到這里了,有什么不足的地方歡迎大家提出寶貴意見哦!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM