使用Mediaplay类写一个播放器

我们知道android本身播放视频的的能力是有限的。。先来一个Demo

另附我的一个还未成熟的播放器,下载地址:http://www.eoemarket.com/soft/370334.html,正在完善中

package cn.marsXTU.mediaplayer;

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.Toast;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.app.Activity;

/**
 * 1.确保在音乐能播放的情况下,进行功能增强
 * @author hjl
 *
 */
public class MainActivity extends Activity implements OnSeekBarChangeListener, OnCompletionListener {

	private boolean isStopUpdatingProgress=false;
	private EditText etPath;
	private MediaPlayer mMediapPlayer;
	private SeekBar mSeekbar;
	private TextView tvCurrentTime;
	private TextView tvTotalTime;

	private final int NORMAL=0;//闲置
	private final int PLAYING=1;//播放中
	private final int PAUSING=2;//暂停
	private final int STOPING=3;//停止中

	private  int currentstate=NORMAL;//播放器当前的状态,默认是空闲状态

	//用行动打消忧虑
	private SurfaceHolder holder;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		etPath=(EditText)findViewById(R.id.et_path);
		mSeekbar=(SeekBar) findViewById(R.id.sb_progress);
		tvCurrentTime=(TextView)findViewById(R.id.tv_current_time);
		tvTotalTime=(TextView)findViewById(R.id.tv_total_time);

		mSeekbar.setOnSeekBarChangeListener(this);

		SurfaceView mSurfaceView=(SurfaceView) findViewById(R.id.surfaceview);
		holder=mSurfaceView.getHolder();//SurfaceView帮助类对象

		//是采用自己内部的双缓冲区,而是等待别人推送数据

		holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

	}

	/**
	 * 开始
	 * @param v
	 */
	public void start(View v){
		if(mMediapPlayer!=null){
			if(currentstate!=PAUSING){
				mMediapPlayer.start();
				currentstate=PLAYING;
				isStopUpdatingProgress=false;//每次在调用刷新线程时,都要设为false
				return ;
				//下面这个判断完美的解决了停止后重新播放的,释放两个资源的问题
			}else if(currentstate==STOPING){
				mMediapPlayer.reset();
				mMediapPlayer.release();
			}
		}
		play();

	}
	/**
	 * 停止
	 * @param v
	 */
	public void stop(View v){
		if(mMediapPlayer!=null){
			mMediapPlayer.stop();
		}
	}

	/**
	 * 播放输入框的文件
	 */
	private void play(){
		String path=etPath.getText().toString().trim();
		mMediapPlayer=new MediaPlayer();
		try {
			//设置数据类型
			mMediapPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
			//设置以下播放器显示的位置
			mMediapPlayer.setDisplay(holder);

			mMediapPlayer.setDataSource(path);
			mMediapPlayer.prepare();
			mMediapPlayer.start();

			mMediapPlayer .setOnCompletionListener(this);
			//把当前播放器的状诚置为:播放中
			currentstate=PLAYING;

			//把音乐文件的总长度取出来,设置给seekbar作为最大值
			int duration=mMediapPlayer.getDuration();//总时长
			mSeekbar.setMax(duration);
			//把总时间显示textView上
			int m=duration/1000/60;
			int s=duration/1000%60;
			tvTotalTime.setText("/"+m+":"+s);
			tvCurrentTime.setText("00:00");

			isStopUpdatingProgress=false;
			new Thread(new UpdateProgressRunnable()).start();

		}catch(Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 暂停
	 * @param v
	 */
	public void pause(View v){
		if(mMediapPlayer!=null&¤tstate==PLAYING){

			mMediapPlayer.pause();
			currentstate=PAUSING;
			isStopUpdatingProgress=true;//停止刷新主线程
		}
	}

	/**
	 * 重播
	 * @param v
	 */
	public void restart(View v){
		if(mMediapPlayer!=null){
			mMediapPlayer.reset();
			mMediapPlayer.release();
			play();
		}
	}

	@Override
	public void onProgressChanged(SeekBar seekBar, int progress,
			boolean fromUser) {

	}

	@Override
	public void onStartTrackingTouch(SeekBar seekBar) {
		isStopUpdatingProgress=true;//当开始拖动时,那么就开始停止刷新线程
	}

	@Override
	public void onStopTrackingTouch(SeekBar seekBar) {
		int progress=seekBar.getProgress();
		//播放器切换到指定的进度位置上
		mMediapPlayer.seekTo(progress);
		isStopUpdatingProgress=false;
		new Thread(new UpdateProgressRunnable()).start();
	}

	/**
	 * 当播放完成时回调此方法
	 */
	@Override
	public void onCompletion(MediaPlayer mp) {
	    Toast.makeText(this, "播放完了,重新再播放", 0).show();
	    mp.start();

	}

	/**
	 * 刷新进度和时间的任务
	 * @author hjl
	 *
	 */
	class  UpdateProgressRunnable implements Runnable{

		@Override
		public void run() {
			//每隔1秒钟取一下当前正在播放的进度,设置给seekbar
			while(!isStopUpdatingProgress){
				//得到当前进度
				int currentPosition=mMediapPlayer.getCurrentPosition();
				mSeekbar.setProgress(currentPosition);
				final int m=currentPosition/1000/60;
				final int s=currentPosition/1000%60;

				//此方法给定的runable对象,会执行主线程(UI线程中)
				runOnUiThread(new Runnable(){

					@Override
					public void run() {
						tvCurrentTime.setText(m+":"+s);

					}

				});
				SystemClock.sleep(1000);
			}

		}

	}

}
时间: 2024-08-17 09:50:46

使用Mediaplay类写一个播放器的相关文章

用JAVA写一个视频播放器

前言 跳过废话,直接看正文 当年入坑java是因为它的跨平台优势.那时我认为,"编写一次,处处运行."这听上去多么牛逼,应该是所有语言发展的终极之道,java势必会一统天下. 然而事实证明,那时的我还是太年轻. 正所谓鱼和熊掌不可兼得,若要享受跨平台带来的方便,便不可避免地要接受性能上的不足.事实上,java一直在致力于提高虚拟机的性能(JIT等技术),但面对对实时计算性能要求很高或涉及到用硬件优化的任务(视频的硬件编码.解码)时,仍远远比不上c或c++.因此,很少能够看到有人用jav

用Delphi写软件播放器

最近打算用Delphi写软件播放器,主要是界面问题,如果用Delphi控件来做界面,那实在是太麻烦了.所以最后决定用Delphi结合HTML来做,主要用到的是Delphi的webbrower来做,这样做的速度可能是原来的10倍,还不止.不过还是要写播放器方面的UI的,希望早日做好吧.用空还是要把http://blog.csdn.net/henreash/article/details/7571660使用GDI+绘制的360风格按钮控件 这个来学习滵学习的,其实Delphi来写界面来说还是比较简单

使用纯css做一个播放器

首先,贴出成品图,如下: 可以发现播放器的基本形状有了,但是需要精确到每一个方向,不能溢出,就得以如下的方式写,贴出静态代码: html如下: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <link rel="stylesheet" href=&

095实现一个播放器的活动指示器

效果如下: ViewController.h 1 #import <UIKit/UIKit.h> 2 3 @interface ViewController : UIViewController 4 @property (strong, nonatomic) UIActivityIndicatorView *activityIndicatorView; 5 6 @end ViewController.m 1 #import "ViewController.h" 2 3 @i

使用IntentService给自己的Android应用写一个文件下载器。

接着上一篇的http://www.cnblogs.com/zhengxt/p/3657833.html,当我们想给自己的APP写一个文件下载器时,可以用重写IntentService来实现. 使用IntentService有几个好处,IntentService继承于Service,适合拿来处理一些耗时又不需要去管它的任务.把要执行的任务用Intent加入到队列中,IntentService会有一个工作线程来取出队列中的Intent来处理.需要实现抽象方法onHandleIntent方法来执行这些

如何用C#快速制作一个播放器

如何用VS快速制作一个播放器 本程序环境: 系统windows7 工具vs2012 语言c# 具体步骤如下: 1.  添加windowsmedia palyer组件 打开视图->工具箱 右键单击常规->选择项->COM组件->Windows Media Palyer 如图所示 新建winForm项目,打开form就可以看见工具箱常规下面有Windows Media Palyer组件了,如下图所示: 2.  在Form中添加WindowsMedia Palyer.OpenFileDi

使用VideoView自定义一个播放器控件

介绍 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了.在写VideoView播放视频时候定义控制的代码全写在Actvity里了,写完一看我靠代码好乱,于是就写了个自定义的播放器控件,支持指定大小,可以横竖屏切换,手动左右滑动快进快退.好了,下面开始. 效果图 效果图有点卡,我也不知道为啥..... VideoView介绍 这个是我们实现视频播放最主要的控件,详细的介绍大家百度就去看,这里介绍几个常用的方法. 用于

JPDA(一):使用JDI写一个调试器

Debugging规范 简单来说,Java Platform Debugger Architecture(JPDA)就是Java提供的一套用于开发Java调试工具的规范,任何的JDK实现都需要实现这个规范.JPDA是一个Architecture,它包括了三个不同层次的规范,如下图, / |--------------| / | VM | debuggee - ( |--------------| <------- JVMTI - Java VM Tool Interface \ | back-e

利用vitamio Mediaplayer 自定义了一个播放器

本人android初学者,学习了Vitamio Mediaplayer 的Demo,参考了农民伯伯大牛的文章,具体链接如下: http://www.cnblogs.com/over140/archive/2012/05/22/2473019.html 实现了简单的功能:双击屏幕切换,点击显示进度条,暂停和播放.自己记录下,许多地方还有待优化的部分,请大家指点哈. 手机拍摄的真机效果不好请大家原谅 显示效果: 首先是XML布局: 这里增加了进度,播放,暂停等组件 <?xml version="