一、基本概念
本文主要介紹的是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播放音頻與視頻我們就學到這里了,有什么不足的地方歡迎大家提出寶貴意見哦!