android之通過SurfaceView以及SurfaceHolder進行視頻播放

來源:互聯網
上載者:User

      使用AudioView進行視頻播放的時候,是不是很不爽,千篇一律的模式,噁心吧。這裡,我們可以通過一些方式對MediaPlayer進行封裝。而所用到的正是SurfaceView以及SurfaceHolder。

最終:

我們提供了四個按鈕,可以進行播放控制。

--------------------------------------------------------------------------------

布局檔案media.xml代碼:

<?xml version="1.0" encoding="utf-8"?><br /><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"<br />android:layout_width="fill_parent" android:layout_height="fill_parent"<br />android:orientation="vertical"><br /><SurfaceView android:id="@+id/surfaceView1"<br />android:layout_width="320px" android:layout_height="160px"></SurfaceView><br /><LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content"<br />android:orientation="horizontal"<br />><br /><ImageButton android:id="@+id/button_play" android:src="@drawable/play" android:onClick="buttonClick"<br />android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageButton><br /><ImageButton android:id="@+id/button_pause" android:src="@drawable/pause" android:onClick="buttonClick"<br />android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageButton><br /><ImageButton android:id="@+id/button_stop" android:src="@drawable/stop" android:onClick="buttonClick"<br />android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageButton><br /><ImageButton android:id="@+id/button_reset" android:src="@drawable/reset" android:onClick="buttonClick"<br />android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageButton><br /></LinearLayout><br /></LinearLayout><br />

activity代碼:

package cn.com.chenzheng_java.media;</p><p>import android.app.Activity;<br />import android.media.AudioManager;<br />import android.media.MediaPlayer;<br />import android.os.Bundle;<br />import android.util.Log;<br />import android.view.SurfaceHolder;<br />import android.view.SurfaceView;<br />import android.view.View;<br />/**<br /> * @description 通過SurfaceView/SurfaceHolder實現自己的播放器<br /> * @author chenzheng_java<br /> * @since 2011/03/23<br /> * @description 這裡進行一下補充說明,我們可以通過mediaplayer添加OnPreparedListener<br /> * 以及OnCompletionListener等事件對準備好播放以及播放完成後的操作進行控制。<br /> * 使用SurfaceView以及SurfaceHolder進行視頻播放時,結構是這樣的:<br /> * 1、首先,我們從布局檔案中擷取一個surfaceView<br /> * 2、通過surfaceView.getHolder()方法擷取與該容器想對應的surfaceHolder<br /> * 3、對srufaceHolder進行一些預設的設定,如addCallback()和setType()<br /> * 4、通過mediaPlayer.setDisplay()方法將視頻播放與播放容器連結起來<br /> */<br />public class MyMediaPlayerActivity extends Activity {</p><p>MediaPlayer mediaPlayer ; // 播放器的內部實現是通過MediaPlayer<br />SurfaceView surfaceView ;// 裝在視頻的容器<br />SurfaceHolder surfaceHolder;// 控制surfaceView的屬性(尺寸、格式等)對象<br />boolean isPause ; // 是否已經暫停了</p><p>@Override<br />protected void onCreate(Bundle savedInstanceState) {<br />super.onCreate(savedInstanceState);<br />setContentView(R.layout.media);<br />surfaceView = (SurfaceView) findViewById(R.id.surfaceView1);<br />/**<br /> * 擷取與當前surfaceView相關聯的那個的surefaceHolder<br /> */<br />surfaceHolder = surfaceView.getHolder();<br />/**<br /> * 註冊當surfaceView建立、改變和銷毀時應該執行的方法<br /> */<br />surfaceHolder.addCallback(new SurfaceHolder.Callback() {</p><p>@Override<br />public void surfaceDestroyed(SurfaceHolder holder) {<br />Log.i("通知", "surfaceHolder被銷毀了");<br />if(mediaPlayer!=null)<br />mediaPlayer.release();<br />}</p><p>@Override<br />public void surfaceCreated(SurfaceHolder holder) {<br />Log.i("通知", "surfaceHolder被create了");<br />}</p><p>@Override<br />public void surfaceChanged(SurfaceHolder holder, int format, int width,<br />int height) {<br />Log.i("通知", "surfaceHolder被改變了");<br />}<br />});</p><p>/**<br /> * 這裡必須設定為SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS哦,意思<br /> * 是建立一個push的'surface',主要的特點就是不進行緩衝<br /> */<br />surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);<br />}</p><p>/***<br /> * @param targetButton 被使用者點擊的按鈕<br /> */<br />public void buttonClick(View targetButton){<br />int buttonId = targetButton.getId();<br />switch (buttonId) {<br />case R.id.button_play:<br />play();<br />break;<br />case R.id.button_pause:<br />pause();<br />break;<br />case R.id.button_reset:<br />reset();<br />break;<br />case R.id.button_stop:<br />stop();<br />break;<br />default:<br />break;<br />}</p><p>}</p><p>/**<br /> * 播放<br /> */<br />private void play(){</p><p>mediaPlayer = new MediaPlayer();<br />// 設定多媒體流類型<br />mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);</p><p>// 設定用於展示mediaPlayer的容器<br />mediaPlayer.setDisplay(surfaceHolder);<br />try {<br />mediaPlayer.setDataSource("/data/jinsha.3gp");<br />mediaPlayer.prepare();<br />mediaPlayer.start();<br />isPause = false;<br />} catch (Exception e) {<br />Log.i("通知", "播放過程中出現了錯誤哦");<br />}<br />}</p><p>/**<br /> * 暫停<br /> */<br />private void pause(){<br />Log.i("通知", "點擊了暫停按鈕");<br />if(isPause==false){<br />mediaPlayer.pause();<br />isPause=true;<br />}else{<br />mediaPlayer.start();<br />isPause=false;<br />}</p><p>}</p><p>/**<br /> * 重設<br /> */<br />private void reset(){<br />Log.i("通知", "點擊了reset按鈕");<br />// 跳轉到視頻的最開始<br />mediaPlayer.seekTo(0);<br />mediaPlayer.start();<br />}</p><p>/**<br /> * 停止<br /> */<br />private void stop(){<br />Log.i("通知", "點擊了stop按鈕");<br />mediaPlayer.stop();<br />mediaPlayer.release();</p><p>}</p><p>}<br />

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.