Android学习笔记----关于MediaPlayer和SurfaceView的视频播放

第一次接触SurfaceView,就简单写写自己的理解以及从网上看到的东西。

  SurfaceView通俗点来说就相当于在Activity的界面中中开辟一块界面用来显示内容。在一个视图层中嵌入一个专用绘画表面,它是可以由用户自定义的。当然它的父类也是View。

  SurfaceView与View的区别在哪?

 大家都直到View必须在主UI线程中调用,而SurfaceView可以由用户自己来创建线程调用,这就有了一个好处,当你的View界面比较复杂时,你就不会因为长期的占用主线程而导致线程阻塞,某种意义上可一释放线程。

 

下面我就来说说MediaPlayer和SurfaceView的联合播放视频

  SurfaceView在xml文件中的使用就相当于TextView的用法,本身它就是一个组件,主要的一点SurfaceView与SurfaceHolder绑定,并添加callback监听器。

  实例如下(借鉴网上的代码s):

package com.edu.video;

import java.io.IOException;

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnInfoListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaPlayer.OnSeekCompleteListener;
import android.media.MediaPlayer.OnVideoSizeChangedListener;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.LinearLayout;

public class TestVideoPlayerActivity extends Activity 
   implements OnCompletionListener,OnErrorListener,
   OnInfoListener, SurfaceHolder.Callback, 
   OnPreparedListener, OnSeekCompleteListener,
   OnVideoSizeChangedListener
   {
	Display currentDisplay;
	SurfaceView surfaceView;
	SurfaceHolder surfaceHolder;
	MediaPlayer mediaPlayer;
	int videoWidth = 0;
	int videoHeight = 0;
	boolean readyToPlayer = false;
	public final static String LOGCAT = "CUSTOM_VIDEO_PLAYER";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        surfaceView = (SurfaceView)findViewById(R.id.surfaceVeiw);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
       // surfaceHolder.setFixedSize(320,240);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        mediaPlayer  = new MediaPlayer();
        mediaPlayer.setOnCompletionListener(this);
        mediaPlayer.setOnErrorListener(this);
        mediaPlayer.setOnPreparedListener(this);
        mediaPlayer.setOnSeekCompleteListener(this);
        mediaPlayer.setOnVideoSizeChangedListener(this);
        String filePath = "/sdcard/video.3gp";
        try{
        	mediaPlayer.setDataSource(filePath);
        	
        }catch(IllegalArgumentException e)
        {
        	Log.v(LOGCAT, e.getMessage());
        	finish();
        }catch(IllegalStateException e)
        {
        	Log.v(LOGCAT, e.getMessage());
        	finish();
        }catch(IOException e)
        {
        	Log.v(LOGCAT,e.getMessage());
        	finish();
        }
        currentDisplay = getWindowManager().getDefaultDisplay();    
    }
	public boolean onInfo(MediaPlayer arg0, int whatInfo, int extra) {	 
		                return false;
	}

	public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
		  Log.v(LOGCAT,"onError Called");


		return false;
	}

	public void onCompletion(MediaPlayer mp) {
		Log.v(LOGCAT,"onCompletion called");
		finish();
	}

	public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
		Log.v(LOGCAT,"onVideoSizeChanged called");
	}

	public void onSeekComplete(MediaPlayer mp) {
		Log.v(LOGCAT,"onSeekComplete called");
	}

	public void onPrepared(MediaPlayer mp) {
		Log.v(LOGCAT,"onPrepared called");
		videoWidth = mp.getVideoWidth();
		videoHeight = mp.getVideoHeight();
		
      surfaceView.setLayoutParams(new LinearLayout.LayoutParams(videoWidth,videoHeight));
	  
		//mp.prepare();
		
		mp.start();

		
	}

	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		
	}

	public void surfaceCreated(SurfaceHolder holder) {
		Log.v(LOGCAT,"suc calles");
		mediaPlayer.setDisplay(holder);  // 若无此句,只有声音没有图像 
	
		try{
			mediaPlayer.prepare();
			
		}catch(IllegalStateException e)
		{
			Log.v(LOGCAT, e.getMessage());
			finish();
		}catch(IOException e)
		{
			Log.v(LOGCAT,e.getMessage());
			finish();
		}
		
	}

	public void surfaceDestroyed(SurfaceHolder holder) {
		Log.v(LOGCAT,"surfaceDestroyed called");
	}
}

  

开始放了个20M左右的视频,程序无法运行,老是报错,可能是虚拟机内存不足的问题,自己重新拍了一个,问题解决了。

我们来分析一下代码,刚开始绑定了很多监听接口,用于监听MediaPlayer播放过程发生的各种事件,可以有选择的添加(不添加也没什么大问题),

然后主要的就是:

  SurfaceView绑定SurfaceHolder

SurfaceHolder = surfaceView.getHolder();

然后添加Callba监听器:

   surfaceHolder.addCallback(this);

在准备视频之前mediaPlayer与surfaceHolder连接:

mediaPlayer.setDisplay(surfaceHolder);

 

接下来就是播放之类的了。

转载于:https://www.cnblogs.com/neverandnever/archive/2012/03/26/Skton_surfaceView.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值