《教學(xué)課件第三次課件(媒體播放器)》由會(huì)員分享,可在線閱讀,更多相關(guān)《教學(xué)課件第三次課件(媒體播放器)(24頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、Lesson3媒體播放器第二階段 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 課堂回顧1. 如何讓控件動(dòng)起來(lái)?2. 自定義控件的原理3. 自定義屬性的兩種方法4. 實(shí)現(xiàn)音量控件 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 多媒體簡(jiǎn)介v多媒體是計(jì)算機(jī)和視頻技術(shù)的結(jié)合,實(shí)際上它是兩個(gè)媒體:聲音和圖像v音頻和視頻的播放,我們都會(huì)用到MediaPlayer這個(gè)類進(jìn)行播放 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 從源文件中播放1,在項(xiàng)目的res/raw目錄下,放置一個(gè)android支持的多媒體文件,如MP3,會(huì)在R文件中生成對(duì)應(yīng)的索引2,通過(guò)MediaPlayer.create(this, R.id.et_mp3)創(chuàng)建一個(gè)文件3,使用start播放 長(zhǎng)沙華瑞IT培
2、訓(xùn)學(xué)校 核心代碼mediaplayer = MediaPlayer.create(this, R.raw.music02);try mediaplayer.start(); catch (IllegalStateException e) e.printStackTrace(); 注:將muisc02.mp3文件放入res/raw的文件夾中 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 從文件系統(tǒng)中播放1,實(shí)例化一個(gè)MediaPlayer2,MediaPlayer.setData方法調(diào)用(輸入文件所在路徑)3,調(diào)用MediaPlayer.prepare進(jìn)行準(zhǔn)備4,調(diào)用start進(jìn)行播放 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 核心代碼p
3、rivate void createMusicFromPath(String path) mediaplayer = new MediaPlayer();try mediaplayer.setDataSource(path);mediaplayer.prepare();mediaplayer.start(); catch (Exception e) / TODO Auto-generated catch blocke.printStackTrace(); 注:將音頻文件放入在手機(jī)的sdcard,輸入路徑即可播放 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 播放網(wǎng)絡(luò)音樂(lè)1,獲取音樂(lè)鏈接地址A,通過(guò)地址創(chuàng)建Uri,通過(guò)
4、 MediaPlayer.create(this, uri)創(chuàng)建,獲取player對(duì)象B,new出MediaPlayer對(duì)象,通過(guò)MediaPlayer.setData(webPath)創(chuàng)建player對(duì)象,然后調(diào)用prepare();2,調(diào)用start方法進(jìn)行播放 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 音樂(lè)播放器 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 多媒體狀態(tài) 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 使用SeekBar實(shí)現(xiàn)控制播放位置功能1,在視圖xml中拖入SeekBar控件2,設(shè)置seekBar.setMax(mediaPlayer.getDuration()為媒體的最大長(zhǎng)度3,實(shí)現(xiàn)控件的OnSeekBarChangeListener
5、接口4,實(shí)現(xiàn)onProgressChanged(/當(dāng)進(jìn)度狀態(tài)發(fā)生變化時(shí)候 SeekBar seekBar, int progress,/當(dāng)前的進(jìn)度 boolean fromUser)/是否由用戶操作導(dǎo)致public void onProgressChanged(SeekBar arg0, int progress, boolean isFromUser) if(isFromUser) mediaPlayer.seekTo(progress); 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 實(shí)現(xiàn)進(jìn)度條SeekBar自動(dòng)移動(dòng)效果/1,創(chuàng)建一個(gè)線程Runnable run = new Runnable() public v
6、oid run() / TODO Auto-generated method stub/獲取當(dāng)前播放音樂(lè)的位置if(mediaPlayer != null) int current = mediaPlayer.getCurrentPosition();progressBar.setProgress(current);if(mediaPlayer.isPlaying() progressHandler.postDelayed(run,100);/2,創(chuàng)建一個(gè)handler用于控制線程Handler progressHandler = new Handler();progressHandler.p
7、ost(run);/啟動(dòng)線程progressHandler.postDelayed(run,100);/延時(shí)啟動(dòng)線程progressHandler.removeCallbacks(run);/刪除指定的Runnable對(duì)象,使線程對(duì)象停止運(yùn)行。 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 停止,暫停,重播功能實(shí)現(xiàn)A,停止 1,首先判斷是否是playing調(diào)用player的stop方法2,同時(shí)要將還沒(méi)有執(zhí)行的線程從handler中移除progressHandler.removeCallbacks(run);3,將進(jìn)度條的seekbar的進(jìn)度設(shè)置為0B,暫停1,利用一個(gè)boolean變量判斷是否是pause狀態(tài)2,判斷
8、playing,調(diào)用play的pause方法,并且removeCallbacks3,如果是pause狀態(tài),則執(zhí)行start,并且執(zhí)行progressHandler.post方法C,重播 1,mediaPlayer.seekTo(0),2,progressBar.setProgress(0); 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 實(shí)現(xiàn)進(jìn)度條SeekBar緩存條效果/設(shè)置緩存更新事件mediaPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener()/實(shí)現(xiàn)更新方法public void onBufferingUpdate(MediaPl
9、ayer arg0, int arg1) /在每次更新之后,設(shè)置緩存條的進(jìn)度progressBar.setSecondaryProgress(arg1*progressBar.getMax()/100);); 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 MediaPlayer的狀態(tài)A,停止 1,首先判斷是否是playing調(diào)用player的stop方法2,同時(shí)要將還沒(méi)有執(zhí)行的線程從handler中移除progressHandler.removeCallbacks(run);3,將進(jìn)度條的seekbar的進(jìn)度設(shè)置為0B,暫停1,利用一個(gè)boolean變量判斷是否是pause狀態(tài)2,判斷playing,調(diào)用play的p
10、ause方法,并且removeCallbacks3,如果是pause狀態(tài),則執(zhí)行start,并且執(zhí)行progressHandler.post方法C,重播1,mediaPlayer.seekTo(0),2,progressBar.setProgress(0); 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 核心代碼v mediaPlayer.reset();/重置為idle狀態(tài)v mediaPlayer.setDataSource(file.getAbsolutePath();/設(shè)置播放的文件v mediaPlayer.prepare();/緩沖v mediaPlayer.setOnPreparedListener(n
11、ew MyPreparedListener();/設(shè)置緩沖完成監(jiān)聽(tīng)v mediaPlayer.pause();/暫停v mediaPlayer.start();/播放音樂(lè)v mediaPlayer.stop(); ();/停止v mediaPlayer.seekTo(progress);/設(shè)置播放進(jìn)度v mediaPlayer.release();/釋放關(guān)聯(lián)的資源 v progressHandler.postDelayed(run,100);/定時(shí)調(diào)用Runnable對(duì)象v progressHandler.post(run);/將Runnable對(duì)象發(fā)送到消息隊(duì)列中v progressHand
12、ler.removeCallbacks(run);/將run從消息隊(duì)列中移除 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 視頻播放器 SurfaceView控件 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 SurfaceView控件vSurfaceView可以直接從內(nèi)存或者DMA等硬件接口取得圖像數(shù)據(jù),是個(gè)非常重要的繪圖容器vSurfaceHolder用來(lái)操縱surface,處理它在Canvas上畫(huà)的效果和動(dòng)畫(huà),控制表面,大小,像素等 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 核心代碼SurfaceHolder surfaceHolder = surfaceView.getHolder();/surfaceView的控制對(duì)象surfaceHolder.se
13、tFixedSize(176, 144);/設(shè)置分辨率surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);/不使用surfaceview自身的緩沖機(jī)制,把得到的數(shù)據(jù)直接輸出surfaceHolder.setKeepScreenOn(true);/保持屏幕的亮度 /在播放前設(shè)置顯示畫(huà)面mediaPlayer.setDisplay(surfaceView.getHolder(); 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 VideoView的使用/獲取VideoView對(duì)象videoView = (VideoView) this.findVie
14、wById(R.id.videoView);/創(chuàng)建播放視頻的URIUri uri = Uri.parse(Environment.getExternalStorageDirectory().getAbsolutePath()+/video.mp4);/設(shè)置URIvideoView.setVideoURI(uri);/uri/設(shè)置多媒體控制器videoView.setMediaController(new MediaController(this);videoView.start(); 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 SoundPoolandroid中可以用mediaplayer播放音樂(lè),使用soundp
15、ool可以播一些短的反應(yīng)速度要求高的聲音,比如點(diǎn)擊時(shí)候的音效/1,創(chuàng)建SoundPoolsoundPool = new SoundPool(3,/同時(shí)播放的流的最大數(shù)量 AudioManager.STREAM_MUSIC,/ 流的類型,一般為STREAM_MUSIC0);/采樣率轉(zhuǎn)化質(zhì)量,當(dāng)前無(wú)效果,使用0作為默認(rèn)值 /2,載入音效int id = load(Context context, int resId, int priority) /從APK資源載入 /3,通過(guò)id播放音效 soundPool.play(soundMap.get(id),/音頻的id100, /左邊聲音大小100, /右邊聲音大小1, /優(yōu)先級(jí)別0, /循環(huán)次數(shù)1);/速率,1為正常速度 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 本章總結(jié)1. 如何使用MediaPlayer播放MP32. 多媒體有哪些狀態(tài)3. 使用seekBar4. 如何使用SurfaceView播放視頻? 長(zhǎng)沙華瑞IT培訓(xùn)學(xué)校 作業(yè)1. 完成音樂(lè)播放器和視頻播放器 知識(shí)就是力量