從零開始學android<mediaplayer內建播放器(視頻播放).四十九.>

來源:互聯網
上載者:User

標籤:風飛雪未揚   從零開始學android   安卓mediaplayer播放視頻   

MediaPlayer除了可以對音頻播放之外,也可以對視頻進行播放,但是如果要播放視頻只依靠MediaPlayer還是不夠的,還需要編寫一個可以用於視頻顯示的空間,而這塊顯示空間要求可以快速的進行GUI的更新,而且可以在渲染代碼時進行無阻塞的的對GUI進行渲染,而如果要完成此種功能,則必須依靠android.view.SurfaceView組件完成,SurfaceView組件封裝了一個Surface對象,而不是一個Canvas對象,使用Surface可以完成對後台線程的控制,對於像視頻、3D圖形等需要快速更新或者高幀率的地方上有很大的用處。

SurfaceHolder顯示一個surface的抽象介面,使你可以控制surface的大小和格式, 以及在surface上編輯像素,和監視surace的改變。這個介面通常通過SurfaceView類實現。


下面就結合前一節寫過的例子來實現mediaplayer對視頻的播放。
首先在xml配置surfaceview對象。
<span style="font-size:18px;"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <ImageButton        android:id="@+id/imageButton1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:layout_alignParentTop="true"        android:src="@drawable/play" /><SurfaceView    android:id="@+id/surfaceview"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_alignParentBottom="true"    android:layout_alignParentLeft="true"    android:layout_alignParentRight="true"    android:layout_below="@+id/imageButton1" /><ImageButton    android:id="@+id/imageButton2"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_above="@+id/surfaceview"    android:layout_alignRight="@+id/surfaceview"    android:src="@drawable/stop" /><ImageView    android:id="@+id/imageView1"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_alignBottom="@+id/surfaceview"    android:layout_centerHorizontal="true"    android:layout_marginBottom="162dp"    /></RelativeLayout></span>


Java檔案
<span style="font-size:18px;">package com.example.mediaplayer2;import java.io.File;import android.app.Activity;import android.media.AudioManager;import android.media.MediaPlayer;import android.os.Bundle;import android.os.Environment;import android.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnHoverListener;import android.widget.ImageButton;import android.widget.ImageView;public class MainActivity extends Activity {private ImageButton play = null;// 播放private ImageButton stop = null;// 停止播放private MediaPlayer media = null;private ImageView image=null ;private SurfaceView surfaceView = null;private SurfaceHolder surfaceHolder = null;private Boolean pauseFlag=false;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.activity_main);this.play = (ImageButton) super.findViewById(R.id.imageButton1);this.stop = (ImageButton) super.findViewById(R.id.imageButton2);this.surfaceView = (SurfaceView) super.findViewById(R.id.surfaceview);// 執行個體化SurfaceViewthis.surfaceHolder = this.surfaceView.getHolder();// 執行個體化SurfaceHolderthis.surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// 設定格式this.image=(ImageView)this.findViewById(R.id.imageView1);this.media = new MediaPlayer();// 執行個體化MeidaPlayer組件try {// 取得SD卡上的視頻檔案String path = Environment.getExternalStorageDirectory()+ File.separator + "Movies" + File.separator + "abc.mp4";// 設定資源this.media.setDataSource(path); // 少了一些判斷} catch (Exception e) {e.printStackTrace();}// 分別對開始播放盒停止播放進行監聽this.play.setOnClickListener(new PlayOnClickListenerImpl());this.stop.setOnClickListener(new StopOnClickListenerImpl());this.surfaceView.setOnClickListener(new pauseOrstart() );this.surfaceView.setOnHoverListener(new OnHoverListener() {public boolean onHover(View v, MotionEvent event) {// TODO Auto-generated method stubif (MainActivity.this.media.isPlaying()) {MainActivity.this.image.setImageResource(R.drawable.stop);}else {MainActivity.this.image.setImageResource(R.drawable.play);}return true;}});}private class PlayOnClickListenerImpl implements OnClickListener {@Overridepublic void onClick(View v) {// 設定音頻格式啊MainActivity.this.media.setAudioStreamType(AudioManager.STREAM_MUSIC);// 設定播放的範圍MainActivity.this.media.setDisplay(MainActivity.this.surfaceHolder);try {// 準備播放MainActivity.this.media.prepare();} catch (Exception e) {}// 開始播放MainActivity.this.media.start();}}private class StopOnClickListenerImpl implements OnClickListener {@Overridepublic void onClick(View v) {// 停止播放if (MainActivity.this.media!=null) {MainActivity.this.media.stop();}}}private class pauseOrstart implements OnClickListener{@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif (MainActivity.this.media!=null) {if (MainActivity.this.pauseFlag) {MainActivity.this.media.start();MainActivity.this.pauseFlag=false;}else {MainActivity.this.media.pause();MainActivity.this.pauseFlag=true;}}}}}</span>




這樣就實現了簡單的視頻播放功能,但是由於解碼器的緣故現在僅支援3gp和部分MP4視頻的播放,想要播放更多的視頻格式需要另外寫演算法或下載解碼器實現

下節預報:AudioManagerandroid聲音編輯器

從零開始學android<mediaplayer內建播放器(視頻播放).四十九.>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.