首页 > 代码库 > 从零開始学android<mediaplayer自带播放器(视频播放).四十九.>
从零開始学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="http://www.mamicode.com/@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="http://www.mamicode.com/@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; @Override public 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);// 实例化SurfaceView this.surfaceHolder = this.surfaceView.getHolder();// 实例化SurfaceHolder this.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 stub if (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 { @Override public 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 { @Override public void onClick(View v) { // 停止播放 if (MainActivity.this.media!=null) { MainActivity.this.media.stop(); } } } private class pauseOrstart implements OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub if (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个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。