使用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);
}
}
}
}
使用Mediaplay类写一个播放器的更多相关文章
- 使用AVPlayer制作一个播放器
代码地址如下:http://www.demodashi.com/demo/11685.html AVPlayer 是一个强大的视频播放器,可以播放多种格式的视频,缺点是没有控制界面,需要自己去实现. ...
- 业余写的一个播放器SDK,求点意见
好久没写博客了 现大致花了半年时间私下写一个音频SDK,想请csdn的达人提点意见,看看还需要增加哪些功能 我对这个的定位如下: 可以在游戏开发中播放音乐,作为一般的音频播放器后端,作为音频编辑器后端 ...
- 使用VideoView自定义一个播放器控件
介绍 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了.在写VideoView播放视频时候定义控制的代码全写在Actv ...
- 【C++】从零开始,只使用FFmpeg,Win32 API,实现一个播放器(一)
前言 起初只是想做一个直接读取视频文件然后播放字符动画的程序.我的设想很简单,只要有现成的库,帮我把视频文件解析成一帧一帧的原始画面信息,那么我只需要读取里面的每一个像素的RGB数值,计算出亮度,然后 ...
- 微信小程序 写音乐播放器 slider组件 将value设置为0 真机测试滑块不能回到起点
最近在用微信小程序写一个音频播放页面,做时间进度的时候用到了slider插件,但是在自然播放完成,或者上/下切换的时候,将slider的value属性值设为0,开发工具上滑块会回到起点,有效.但是真机 ...
- 我的Java开发学习之旅------>工具类:将播放器的进度值转换成相应的时间格式
在我的博客<我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法,地址:http://blog.csdn.net/ouyang_pen ...
- 慕课网electron写音乐播放器教程,代码跟随教程变动(十)
添加播放状态,首先是歌曲名称和时间 在index.html中添加 <div class="container fixed-bottom bg-white pb-4"> ...
- Arava: 用 swing 写一个取色器
备哥以前发我了一个小工具,TakeColor 取色器.来复刻一个吧. 分析一下:顶部是菜单,左侧框显示当前鼠标所在的颜色(下面显示当前坐标和颜色值,默认RGB),中间框显示鼠标周围区域,右侧显示取色的 ...
- 手写一个类加载器demo
1.什么是类加载器? 2.加载方式 ClassLoader类加载器,主要的作用是将class文件加载到jvm虚拟机中.jvm启动的时候,并不是一次性加载所有的类,而是根据需要动态去加载类,主要分为隐式 ...
随机推荐
- 备忘:MySQL中修改表中某列的数据类型、删除外键约束
-- MySQL中修改表中某列的数据类型 ALTER TABLE [COLUMN] 表名 MODIFY 列名 列定义; -- 删除外键约束 SHOW CREATE TABLE 表名; -- 复制CON ...
- JVM指令集介绍
转载自:http://glutinit.iteye.com/blog/1263446 延伸参考 JVM接收参数和方法调用 void spin() { int i; for (i = 0 ...
- React学习笔记(一)- 环境搭建
最近在学习react相关的知识,刚刚起步,一路遇坑不断.自己做个笔记,方便日后总结,也供相同趣味的小伙伴一起交流探讨. 学习时主要参考官网的教程:https://facebook.github.io/ ...
- angular+ionic前后端分离开发项目中的使用
Ionic基于AngularJS构建而成,所以学习一些AngularJS的知识很有必要.Ionic并没有独立开发一套完整的Web应用框架,而是对AngularJS进行了扩展,给它添加了大量界面组件和其 ...
- javascript requestAnimationFarme
今天看到一篇很好的文章推荐一下:原文地址:http://www.zhangxinxu.com/wordpress/?p=3695 CSS3动画那么强,requestAnimationFrame还有毛线 ...
- ORA-01207: file is more recent than control file - old control file的处理方法
1. 连接数据库 sqlplus / as sysdba2. 启动数据库,此时会报标题中的错误startup 3.备份创建控制文件的脚本语句,并从中拷贝出相关的NORESETLOGS模式的创建控制文件 ...
- Xcode编译错误__NSCFConstantString
__NSCFConstantString:主要错误就是数据类型造成的,然后就是检查哪个地方造成的数据类型调用错误 错误一:'-[__NSCFConstantString _imageThatSuppr ...
- ejabberd开发和部署
ejabberd开发和部署 (金庆的专栏 2016.10) 搭建了自己的ejabberd集群,然后少量更改源码,实现定制的XMPP服务器. 从github fork ejabberd 库,定为 mas ...
- Angular2学习笔记2
每个angular2应用程序默认使用app目录来创建(可以自己制定,但是eclipse插件生成的会自动使用app) 每个程序应当至少有一个angular模块即根模块.根模块使用@NgModule({} ...
- Linux文件编辑命令详细整理
刚接触Linux,前几天申请了个免费体验的阿里云服务器,选择的是Ubuntu系统,配置jdk环境变量的时候需要编辑文件. vi命令编辑文件,百度了一下,很多回答不是很全面,因此编辑文件话了一些时间. ...