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