获得网络视频缩略图并且播放

</pre><pre name="code" class="java">




</pre><pre name="code" class="java">利用surfacehlder 和mediaplayer  播放网络视频
import java.io.IOException;

import android.app.Activity;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.TextView;
/** 
 * 
 * 
 * SurfaceHolder  
 * 		1. 简介 : 是 Surface 的控制器, 用于控制 SurfaceView 绘图, 处理画布上的动画, 渲染效果, 大小等;
 * 		2. 常用方法 : 
 * 			-- abstract void addCallback(SurfaceHolder.Callback callback) : 添加一个 SurfaceHolder.Callback 接口对象, 监听 Surface 的开始结束绘制大小改变事件;
 * 			-- abstract Canvas lockCanvas() : 锁定画布, 可以获得 Canvas 对象, 之后就可以在 Canvas 上绘图了;
 * 
 * SurfaceHolder.Callback接口 : 
 * 		1. Surface 绘图边界 : 所有的绘图工作都在 Surface 创建之后才能进行, 在 Surface 销毁之前结束;
 * 		2. Callback 接口对应的 Surface 边界 : surfaceCreated() 方法在开始绘制时回调, surfaceDestroyed() 在 Surface 销毁前回调;
 * 		3. 该接口中的方法 : 
 * 			-- surfaceChanged() : 在 Surface 大小改变时回调;
 * 			-- surfaceCreated() : 在 Surface 创建时回调;
 * 			--  () : 在 Surface 销毁时回调;
 * 
 * @author octopus 
 *
 */
public class MPlayer extends Activity implements SurfaceHolder.Callback {

//	private AutoCompleteTextView url;							/* 地址输入框, 带自动提示功能 */
	private SurfaceView surface_view;							/* 播放视频载体 */
	private TextView status;									/* 显示播放状态 */
	private Button play;										/* 播放按钮 */
	private Button pause;										/* 暂停按钮 */
	private Button reset;										/* 重放按钮 */
	private Button stop;										/* 停止按钮 */
	
	private MediaPlayer mediaPlayer;							/* 播放器 */
	private SurfaceHolder surface_holder; 						/* Surface 控制器 */
	
	private boolean isStartPlaying;		/* 是否开始了播放 */
    private int vedioPosition;         /* 接收intent从MainActivity传过来的需要播放的视频URL*/
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_mplayer);
		Intent intent1=getIntent();//getIntent将该项目中包含的原始intent检索出来,将检索出来的intent赋值给一个Intent类型的变量intent  
		vedioPosition=intent1.getExtras().getInt("vedioUrl");
		initViews();
		initData();
	}

	/**
	 * 初始化成员变量中的组件变量
	 */
	private void initViews() {
		/* 通过 findViewById 获取相关方法 */
//		url = (AutoCompleteTextView) findViewById(R.id.url);
		surface_view = (SurfaceView) findViewById(R.id.surface_view);
		
		status = (TextView) findViewById(R.id.status);
		play = (Button) findViewById(R.id.play);
		pause = (Button) findViewById(R.id.pause);
		reset = (Button) findViewById(R.id.reset);
		stop = (Button) findViewById(R.id.stop);
		/* 使窗口支持透明度, 把当前 Activity 窗口设置成透明, 设置了该选项就可以使用 setAlpha 等函数设置窗口透明度 */
		getWindow().setFormat(PixelFormat.TRANSPARENT);
	}	
	/**
	 * 初始化相关数据变量
	 */
	private void initData() {
		/* 获取并设置 SurfaceHolder 对象 */
		surface_holder = surface_view.getHolder();						/* 根据 SurfaceView 组件, 获取 SurfaceHolder 对象 */
		surface_holder.addCallback(this); 								/* 为 SurfaceHolder 设置回调函数, 即 SurfaceHolder.Callback 子类对象 */
		surface_holder.setFixedSize(160, 128);							/* 设置视频大小比例 */
		surface_holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);/* 设置视频类型 */	
	}	
	/**
	 * 设置点击事件
	 * @param view
	 */
	public void onClick(View view) {
		int id = view.getId();
		switch (id) {
		case R.id.play:
			playVideo(VedioImages.imageThumbUrls[vedioPosition].toString());
			break;
			
		case R.id.pause:
			if(mediaPlayer != null){
				mediaPlayer.pause();
				status.setText("暂停");
			}
			break;
			
		case R.id.reset:
			if(mediaPlayer != null){
				mediaPlayer.seekTo(0);
				mediaPlayer.start();
				status.setText("播放中");
			}
			break;
	
		case R.id.stop:
			if(mediaPlayer != null){
				mediaPlayer.stop();
				mediaPlayer.release();
				isStartPlaying = false;
				status.setText("停止");
			}
			break;

		default:
			break;
		}
	}
	
	/**
	 * 播放网络视频
	 * a. 创建并配置 MediaPlayer 对象 (音量, SurfaceHolder)
	 * b. 为 MediaPlayer 设置错误监听器, 缓冲进度监听器, 播放完毕监听器, 准备完毕监听器
	 * c. 未 MediaPlayer 设置数据源
	 * d. 调用 prepare() 进入 Prapared 状态
	 * e. 调用 start() 进入 Started 状态
	 * 
	 * @param dataSource 播放视频的网络地址
	 */
	private void playVideo(final String dataSource) {
		
		/* 点击播放有两种情况 
		 * a. 第一次点击 : 需要初始化 MediaPlayer 对象, 设置监听器
		 * b. 第二次点击 : 只需要 调用 mediaPlayer 的 start() 方法
		 * 两种情况通过 isStartPlaying 点击时间判断 */
		
		if(isStartPlaying){								/* 如果已经开始了播放, 就直接开始播放 */
			mediaPlayer.start();
		}else{											/* 如果是第一次开始播放, 需要初始化 MediaPlayer 设置监听器等操作 */
			mediaPlayer = new MediaPlayer(); 			/* 创建 MediaPlayer 对象 */
			mediaPlayer.setAudioStreamType(2); 			/* 设置播放音量 */
			mediaPlayer.setDisplay(surface_holder); 	/* 设置播放载体 */	
			
			/* 设置 MediaPlayer 错误监听器, 如果出现错误就会回调该方法打印错误代码 */
			mediaPlayer.setOnErrorListener(new OnErrorListener() {
				@Override
				public boolean onError(MediaPlayer arg0, int what, int extra) {
					System.out.println("MediaPlayer 出现错误 what : " + what + " , extra : " + extra);
					return false;
				}
			});
			
			/* 设置缓冲进度更新监听器 */
			mediaPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {
				@Override
				public void onBufferingUpdate(MediaPlayer arg0, int percent) {
					/* 打印缓冲的百分比, 如果缓冲 */
					System.out.println("缓冲了的百分比 : " + percent + " %");
				}
			});
			
			/* 设置播放完毕监听器 */
			mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
				@Override
				public void onCompletion(MediaPlayer arg0) {
					Log.i("tag","播放完毕了");
					System.out.println("播放完毕了");
					status.setText("播放完毕");
				}
			});
			
			/* 设置准备完毕监听器 */
			mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
				@Override
				public void onPrepared(MediaPlayer arg0) {
					Log.i("tag","准备完毕");
					System.out.println("准备完毕");
					/* 设置播放状态 */
					status.setText("播放中");
				}
			});
			new Thread(){
				public void run() {
					try {
						
						System.out.println("设置数据源");
						mediaPlayer.setDataSource(dataSource);
						mediaPlayer.prepare();
						/* 打印播放视频的时长 */
						Log.i("tag","视频播放长度 : " + mediaPlayer.getDuration());
						System.out.println("视频播放长度 : " + mediaPlayer.getDuration());
						mediaPlayer.start();
					} catch (IllegalStateException e) {
						e.printStackTrace();
					} catch (IOException e) {
						e.printStackTrace();
					}
				};
			}.start();
			/* 设置 MediaPlayer 开始播放标识为 true */
			isStartPlaying = true;
			/* 设置播放状态 */
			status.setText("正在缓冲");
		}
	}
	/**
	 * 在 Surface 大小发生改变的时候回调
	 * 实现的 SurfaceHolder.Callback 接口方法
	 */
	@Override
	public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
		Log.i("tag","SurfaceHolder.Callback.surfaceChanged : Surface 大小发生改变");
		System.out.println("SurfaceHolder.Callback.surfaceChanged : Surface 大小发生改变");
	}
	/**
	 * 在 Surface 创建的时候回调, 一般在该方法中开始绘图
	 * 实现的 SurfaceHolder.Callback 接口方法
	 */
	@Override
	public void surfaceCreated(SurfaceHolder arg0) {
		Log.i("tag","SurfaceHolder.Callback.surfaceCreated : Surface 开始创建");
		System.out.println("SurfaceHolder.Callback.surfaceCreated : Surface 开始创建");
	}
	/**
	 * 在 Surface 销毁之前回调, 在该方法中停止渲染线程, 释放相关资源
	 * 实现的 SurfaceHolder.Callback 接口方法
	 */
	@Override
	public void surfaceDestroyed(SurfaceHolder arg0) {
		Log.i("tag","SurfaceHolder.Callback.surfaceDestroyed : Surface 销毁");
		System.out.println("SurfaceHolder.Callback.surfaceDestroyed : Surface 销毁");
	}
	@Override
	protected void onDestroy() {
		if(mediaPlayer != null)
			mediaPlayer.release();
		super.onDestroy();
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值