资源描述
Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,www.,huaruiedu,.com,长沙华瑞IT培训学校,*,Click to edit Master title style,Lesson3,媒体播放器,第二阶段,课堂回顾,如何让控件动起来?,自定义控件的原理,自定义属性的两种方法,实现音量控件,www.,huaruiedu,.com,长沙华瑞IT培训学校,多媒体简介,多媒体是计算机和视频技术的结合,实际上它是两个媒体:声音和图像,音频和视频的播放,我们都会用到MediaPlayer这个类进行播放,www.,huaruiedu,.com,长沙华瑞IT培训学校,从源文件中播放,1,在项目的res/raw目录下,放置一个android支持的多媒体文件,如MP3,会在R文件中生成对应的索引,2,通过MediaPlayer.create(this,R.id.et_mp3)创建一个文件,3,使用start播放,www.,huaruiedu,.com,长沙华瑞IT培训学校,核心代码,mediaplayer=MediaPlayer.create(this,R.raw.music02);,try,mediaplayer.start();,catch(IllegalStateException e),e.printStackTrace();,注:将muisc02.mp3文件放入res/raw的文件夹中,www.,huaruiedu,.com,长沙华瑞IT培训学校,从文件系统中播放,1,实例化一个MediaPlayer,2,MediaPlayer.setData方法调用(输入文件所在路径),3,调用,MediaPlayer,.prepare进行准备,4,调用start进行播放,www.,huaruiedu,.com,长沙华瑞IT培训学校,核心代码,private void createMusicFromPath(String path),mediaplayer=new MediaPlayer();,try,mediaplayer.setDataSource(path);,mediaplayer.prepare();,mediaplayer.start();,catch(Exception e),/TODO Auto-generated catch block,e.printStackTrace();,注:将音频文件放入在手机的sdcard,输入路径即可播放,www.,huaruiedu,.com,长沙华瑞IT培训学校,播放,网络音乐,1,,获取音乐链接地址,A,通过地址创建Uri,通过 MediaPlayer.create(this,uri)创建,获取player对象,B,new出MediaPlayer对象,通过MediaPlayer.setData(webPath)创建player对象,然后调用prepare();,2,调用start方法进行播放,www.,huaruiedu,.com,长沙华瑞IT培训学校,音乐播放器,www.,huaruiedu,.com,长沙华瑞IT培训学校,多媒体,状态,www.,huaruiedu,.com,长沙华瑞IT培训学校,使用,SeekBar,实现控制播放位置功能,1,在视图xml中拖入SeekBar控件,2,设置seekBar.setMax(mediaPlayer.getDuration()为媒体的最大长度,3,实现控件的OnSeekBarChangeListener接口,4,实现onProgressChanged(/当进度状态发生变化时候,SeekBar seekBar,int progress,/当前的进度,boolean fromUser)/是否由用户操作导致,public void onProgressChanged(SeekBar arg0,int progress,boolean isFromUser),if(isFromUser),mediaPlayer.seekTo(progress);,www.,huaruiedu,.com,长沙华瑞IT培训学校,实现进度条,SeekBar,自动移动效果,/1,创建一个线程,Runnable run=new Runnable(),public void run(),/TODO Auto-generated method stub,/获取当前播放音乐的位置,if(mediaPlayer!=null),int current=mediaPlayer.getCurrentPosition();,progressBar.setProgress(current);,if(mediaPlayer.isPlaying(),progressHandler.postDelayed(run,100);,;,/2,创建一个handler用于控制线程,Handler progressHandler=new Handler();,progressHandler.post(run);,/启动线程,progressHandler.postDelayed(run,100);,/延时启动线程,progressHandler.removeCallbacks(run);,/删除指定的Runnable对象,使线程对象停止运行。,www.,huaruiedu,.com,长沙华瑞IT培训学校,停止,暂停,重播功能实现,A,停止,1,首先判断是否是playing调用player的stop方法,2,同时要将还没有执行的线程从handler中移除progressHandler.removeCallbacks(run);,3,将进度条的seekbar的进度设置为0,B,暂停,1,利用一个boolean变量判断是否是pause状态,2,判断playing,调用play的pause方法,并且removeCallbacks,3,如果是pause状态,则执行start,并且执行progressHandler.post方法,C,重播,1,mediaPlayer.seekTo(0),,2,progressBar.setProgress(0);,www.,huaruiedu,.com,长沙华瑞IT培训学校,实现进度条,SeekBar,缓存条效果,/设置缓存更新事件,mediaPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener(),/实现更新方法,public void onBufferingUpdate(MediaPlayer arg0,int arg1),/在每次更新之后,设置缓存条的进度,progressBar.setSecondaryProgress(arg1*progressBar.getMax()/100);,);,www.,huaruiedu,.com,长沙华瑞IT培训学校,MediaPlayer的状态,A,停止,1,首先判断是否是playing调用player的stop方法,2,同时要将还没有执行的线程从handler中移除progressHandler.removeCallbacks(run);,3,将进度条的seekbar的进度设置为0,B,暂停,1,利用一个boolean变量判断是否是pause状态,2,判断playing,调用play的pause方法,并且removeCallbacks,3,如果是pause状态,则执行start,并且执行progressHandler.post方法,C,重播,1,mediaPlayer.seekTo(0),,2,progressBar.setProgress(0);,www.,huaruiedu,.com,长沙华瑞IT培训学校,核心代码,mediaPlayer.reset();/重置为idle状态,mediaPlayer.setDataSource(file.getAbsolutePath();/设置播放的文件,mediaPlayer.prepare();/缓冲,mediaPlayer.setOnPreparedListener(new MyPreparedListener();/设置缓冲完成监听,mediaPlayer.pause();/暂停,mediaPlayer.start();/播放音乐,mediaPlayer.stop();();/停止,mediaPlayer.seekTo(progress);/设置播放进度,mediaPlayer.release();/释放关联的资源,progressHandler.postDelayed(run,100);/定时调用Runnable对象,progressHandler.post(run);/将Runnable对象发送到消息队列中,progressHandler.removeCallbacks(run);/将run从消息队列中移除,www.,huaruiedu,.com,长沙华瑞IT培训学校,视频播放器,SurfaceView,控件,www.,huaruiedu,.com,长沙华瑞IT培训学校,SurfaceView控件,SurfaceView,可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图容器,SurfaceHolder,用来操纵surface,处理它在Canvas上画的效果和动画,控制表面,大小,像素等,www.,huaruiedu,.com,长沙华瑞IT培训学校,核心代码,SurfaceHolder surfaceHolder=surfaceView.getHolder();/surfaceView的控制对象,surfaceHolder.setFixedSize(176,144);/设置分辨率,surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);/不使用surfaceview自身的缓冲机制,把得到的数据直接输出,surfaceHolder.setKeepScreenOn(true);/保持屏幕的亮度,/在播放前,设置显示画面,mediaPlayer.setDisplay(surfaceView.getHolder();,www.,huaruiedu,.com,长沙华瑞IT培训学校,VideoView的使用,/获取VideoView对象,videoView=(VideoView)this.findViewById(R.id.videoView);,/创建播放视频的URI,Uri uri=Uri.parse(Environment.getExternalStorageDirectory().getAbsolutePath()+/video.mp4);,/设置URI,videoView.setVideoURI(uri);/uri,/设置多媒体控制器,videoView.setMediaController(new MediaController(this);,videoView.start();,www.,huaruiedu,.com,长沙华瑞IT培训学校,SoundPool,android中可以用mediaplayer播放音乐,,使用soundpool可以播一些短的反应速度要求高的声音,比如点击时候的音效,/1,创建SoundPool,soundPool=new SoundPool(,3,/同时播放的流的最大数量,AudioManager.STREAM_MUSIC,/流的类型,一般为STREAM_MUSIC,0);/采样率转化质量,当前无效果,使用0作为默认值,/2,载入音效,int id=load(Context context,int resId,int priority)/从APK资源载入,/3,通过id播
展开阅读全文