您的位置:首页 > 移动开发 > Android开发

从零開始学android<mediaplayer自带播放器(视频播放).四十九.>

2017-04-15 10:41 363 查看
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;

@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声音编辑器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: