zoukankan      html  css  js  c++  java
  • 从零開始学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;
    	
    	@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声音编辑器

  • 相关阅读:
    H01-Linux系统中搭建Hadoop和Spark集群
    L07-Linux配置ssh免密远程登录
    L06-Ubuntu系统中部署Vagrant和VirtualBox
    P03-Python装饰器
    L05-Linux部署msmtp+mutt发送邮件
    O01-Linux CentOS7中利用RDO部署OpenStack
    L03-Linux RHEL6.5系统中配置本地yum源
    LoggerFactory.getLogger用法
    maven配置本地和远程仓库
    Jmeter下载安装配置及使用(windows)
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6713367.html
Copyright © 2011-2022 走看看