版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第11章多媒體應用開發(fā)《Android移動開發(fā)基礎案例教程(第3版)》
掌握MediaPlayer類與SoundPool類的使用方法,能夠使用這兩個類實現(xiàn)播放音頻的功能
掌握MediaPlayer類與SurfaceView控件的使用方法,能夠實現(xiàn)播放視頻的功能
掌握VideoView控件的使用方法,能夠實現(xiàn)播放視頻的功能學習目標/Target章節(jié)概述/Summary隨著手機硬件的不斷升級,手機已經(jīng)成為人們日常生活中必不可少的設備,手機里面的多媒體資源想必是很多人的興趣所在。多媒體資源一般包括音頻、視頻等,Android針對不同的多媒體資源提供了不同的類和控件進行支持。接下來,本章將針對多媒體應用中的音頻、視頻操作進行講解。目錄/Contents0102音頻播放視頻播放音頻播放11.1
先定一個小目標!掌握MediaPlayer類的使用方法,能夠實現(xiàn)播放音頻的功能11.1.1使用MediaPlayer類播放音頻MediaPlayer類提供了一些方法支持播放多種格式的音頻。使用MediaPlayer類播放音頻時占用的內存資源較多,且不支持同時播放多個音頻。11.1.1使用MediaPlayer類播放音頻11.1.1使用MediaPlayer類播放音頻方法名稱功能描述setDataSource()設置要播放的音頻的位置prepare()在開始播放之前調用該方法完成準備工作start()開始或繼續(xù)播放音頻pause()暫停播放音頻reset()重置MediaPlayer對象seekTo()從指定位置開始播放音頻stop()停止播放音頻,調用該方法后MediaPlayer對象無法再播放音頻release()釋放與MediaPlayer對象相關的資源isPlaying()判斷當前是否正在播放音頻getDuration()獲取載入的音頻文件的時長MediaPlayer類的常用方法11.1.1使用MediaPlayer類播放音頻使用MediaPlayer類播放音頻的基本步驟:(1)實例化MediaPlayer類//創(chuàng)建MediaPlayer類的對象MediaPlayermediaPlayer=newMediaPlayer();
//設置音頻類型mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);首先創(chuàng)建一個MediaPlayer類的對象,接著調用setAudioStreamType()方法設置音頻類型。實例化MediaPlayer類。示例11.1.1使用MediaPlayer類播放音頻4種較為常用的音頻類型:AudioManager.STREAM_MUSIC:音樂。AudioManager.STREAM_RING:響鈴。AudioManager.STREAM_ALARM:鬧鐘。AudioManager.STREAM_NOTIFICTION:提示音。11.1.1使用MediaPlayer類播放音頻//1.設置播放應用自帶的音頻mediaPlayer=MediaPlayer.create(MainActivity.this,R.raw.xxx);//2.設置播放SD卡中的音頻mediaPlayer.setDataSource("SD卡中的音頻文件的路徑");//3.設置播放網(wǎng)絡音頻mediaPlayer.setDataSource("http://www.xxx.mp3");(2)設置數(shù)據(jù)源設置數(shù)據(jù)源。示例根據(jù)音頻文件存放位置的不同,將數(shù)據(jù)源的設置分為3種方式。11.1.1使用MediaPlayer類播放音頻<uses-permissionandroid:name="android.permission.INTERNET"/>播放網(wǎng)絡音頻時,需要在AndroidManifest.xml文件中添加訪問網(wǎng)絡的權限。添加訪問網(wǎng)絡的權限。示例11.1.1使用MediaPlayer類播放音頻(3)播放音頻mediaPlayer.prepare();mediaPlayer.start();一般在調用start()方法播放音頻之前,程序會調用prepare()方法或prepareAsync()方法將音頻文件解析到內存中。同步操作:調用prepare()方法解析音頻文件為同步操作,一般用于解析較小的文件。異步操作:調用prepareAsync()方法解析音頻文件為異步操作,一般用于解析較大的文件。播放較小的音頻11.1.1使用MediaPlayer類播放音頻mediaPlayer.prepareAsync();mediaPlayer.setOnPreparedListener(newOnPreparedListener){publicvoidonPrepared(MediaPlayerplayer){player.start();}}播放較大的音頻11.1.1使用MediaPlayer類播放音頻(4)暫停播放if(mediaPlayer!=null&&mediaPlayer.isPlaying()){mediaPlayer.pause();//暫停播放}pause()方法用于暫停播放。在暫停播放之前,要判斷MediaPlayer對象是否存在,并且當前是否正在播放音頻。暫停播放音頻。示例11.1.1使用MediaPlayer類播放音頻(5)重新播放if(mediaPlayer!=null&&mediaPlayer.isPlaying()){mediaPlayer.seekTo(0);
return;}if(mediaPlayer!=null){mediaPlayer.seekTo(0);mediaPlayer.start();}seekTo()方法用于定位播放,該方法用于快退或快進音頻播放,該方法傳遞的參數(shù)表示將播放時間定在多少毫秒,如果傳遞的參數(shù)為0,則表示從頭開始播放。暫停狀態(tài)下進行重新播放,要調用start()方法播放狀態(tài)下進行重新播放重新播放音頻。示例11.1.1使用MediaPlayer類播放音頻(6)停止播放if(mediaPlayer!=null&&mediaPlayer.isPlaying()){mediaPlayer.stop();//停止播放
mediaPlayer.release();//釋放MediaPlayer對象占用的資源
mediaPlayer=null;}stop()方法用于停止播放,停止播放之后還要調用release()方法將MediaPlayer對象占用的資源釋放并將該對象設置為null。停止播放音頻。示例
先定一個小目標!掌握SoundPool類的使用方法,能夠實現(xiàn)播放音頻的功能11.1.2使用SoundPool類播放音頻使用MediaPlayer類播放音頻時占用的內存資源較多,且不支持同時播放多個音頻,所以Android還提供了另一個播放音頻的類——SoundPoolSound。Pool即音頻池,可以同時播放多個短小的音頻,而且占用的資源比較少,它適合用于在應用程序中播放按鍵音或者消息提示音等。11.1.2使用SoundPool類播放音頻方法名稱功能描述load()加載音頻文件play()播放音頻pause(intstreamID)根據(jù)加載的資源id,暫停播放音頻resume(intstreamID)根據(jù)加載的資源id,繼續(xù)播放暫停的音頻stop(intstreamID)根據(jù)加載的資源id,停止播放音頻unload(intsoundID)從音頻池中卸載資源id為soundID的音頻release()釋放音頻池資源SoundPool類的常用方法11.1.2使用SoundPool類播放音頻11.1.2使用SoundPool類播放音頻使用SoundPool類播放音頻的基本步驟:(1)創(chuàng)建SoundPool對象(兩種方式)SoundPool()構造方法中參數(shù)的相關介紹:maxStreams:用于指定可以容納多少個音頻。streamType:用于指定音頻類型,如AudioManager.STREAM_MUSIC、AudioManager.STREAM_RING、AudioManager.STREAM_SYSTEM(系統(tǒng)聲音,如按鍵音)等。srcQuality:用于指定音頻的品質,默認值為0。publicSoundPool(intmaxStreams,intstreamType,intsrcQuality)使用構造方法創(chuàng)建SoundPool對象(在Android12.0及以上版本中已經(jīng)被棄用)11.1.2使用SoundPool類播放音頻SoundPoolsoundpool=newSoundPool(10,AudioManager.STREAM_SYSTEM,0);
創(chuàng)建一個可以容納10個音頻的SoundPool對象。示例11.1.2使用SoundPool類播放音頻使用SoundPool.Builder創(chuàng)建SoundPool對象SoundPool.Builderbuilder=newSoundPool.Builder();第1步:創(chuàng)建一個SoundPool.Builder對象。SoundPool.Builder提供用于設置SoundPool屬性的方法:setMaxStreams()方法:用于設置同時播放的音頻流的最大數(shù)量。setAudioAttributes()方法:用于設置音頻屬性,如音頻類型、音頻使用場景等。11.1.2使用SoundPool類播放音頻AudioAttributesaudioAttributes=newAudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA)//設置音頻使用場景.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)//設置音頻類型.build();builder.setAudioAttributes(audioAttributes);setAudioAttributes()方法的參數(shù)是一個AudioAttributes對象,因此在設置SoundPool屬性之前,需要創(chuàng)建一個AudioAttributes對象。soundpool=builder.build();第2步:通過SoundPool.Builder對象調用builde()方法創(chuàng)建SoundPool對象。11.1.2使用SoundPool類播放音頻(2)加載音頻文件創(chuàng)建SoundPool對象后,接著調用load()方法來加載音頻文件。根據(jù)傳遞參數(shù)的不同,系統(tǒng)提供了4個load()方法。publicintload(Contextcontext,intresId,intpriority):通過指定的資源id加載音頻文件,參數(shù)resId表示指定的資源id,參數(shù)priority表示播放音頻的優(yōu)先級。publicintload(Stringpath,intpriority):通過音頻文件的路徑加載音頻文件,參數(shù)path表示音頻文件的路徑。publicintload(AssetFileDescriptorafd,intpriority):在AssetFileDescriptor所對應的文件中加載音頻文件。publicintload(FileDescriptorfd,longoffset,longlength,intpriority):加載FileDescriptor對象中從offset開始且長度為length的音頻文件。11.1.2使用SoundPool類播放音頻soundpool.load(this,R.raw.alarm,1);通過資源id加載音頻文件alarm.wav。示例11.1.2使用SoundPool類播放音頻(3)播放音頻調用SoundPool對象的play()方法可播放指定的音頻。play(intsoundID,floatleftVolume,floatrightVolume,intpriority,intloop,floatrate)play()方法中參數(shù)的相關介紹如下:soundID:指定要播放的音頻的資源id,該音頻是通過load()方法返回的音頻。leftVolume:指定左聲道的音量,取值范圍為0.0~1.0。rightVolume:指定右聲道的音量,取值范圍為0.0~1.0。priority:指定播放音頻的優(yōu)先級,數(shù)值越大,優(yōu)先級越高。loop:指定循環(huán)播放的次數(shù),0表示不循環(huán),1表示循環(huán)。rate:指定播放速率,1表示正常播放速率,0.5表示最低播放速率,2表示最高播放速率。11.1.2使用SoundPool類播放音頻soundpool.play(soundpool.load(MainActivity.this,R.raw.sound,1),1,1,0,0,1);播放raw文件夾中的sound.wav音頻。示例
先定一個小目標!掌握SoundPool類播放音頻的使用方法,能夠獨立完成彈鋼琴案例11.1.3實戰(zhàn)演練——彈鋼琴下面通過彈鋼琴的案例來演示如何使用SoundPool類播放音頻。本案例中只顯示一個鋼琴界面,該界面中顯示了7個鋼琴按鍵的圖片。11.1.3實戰(zhàn)演練——彈鋼琴11.1.3實戰(zhàn)演練——彈鋼琴鋼琴界面實現(xiàn)鋼琴界面功能創(chuàng)建程序。創(chuàng)建一個名為SoundPool的應用程序,指定包名為cn.itcast.soundpool。步驟1步驟2步驟3導入音頻文件。導入界面所需要的音頻文件到res/raw文件夾中。導入界面圖片。導入界面需要的圖片到drawable-hdpi文件夾中。11.1.3實戰(zhàn)演練——彈鋼琴步驟4放置界面控件。放置7個ImageView控件。步驟5創(chuàng)建背景選擇器。選中drawable文件夾,右擊并在彈出的菜單中選擇“New”→“Drawableresourcefile”選項,創(chuàng)建一個背景選擇器icon_do_selector.xml。
icon_do_selector.xml文件核心代碼:實現(xiàn)鋼琴界面功能<selectorxmlns:android="/apk/res/android"><itemandroid:drawable="@drawable/icon_do"android:state_pressed="false"/><itemandroid:drawable="@drawable/icon_do_pressed"android:state_pressed="true"/></selector>11.1.3實戰(zhàn)演練——彈鋼琴步驟6實現(xiàn)彈鋼琴功能。通過SoundPool類的play()方法實現(xiàn)播放每個鋼琴按鍵音頻的功能。
MainActivity.java文件核心代碼:privatevoidplay(inti){soundpool.play(map.get(i),1.0f,1.0f,0,0,1.0f); //播放音頻}實現(xiàn)鋼琴界面功能11.1.3實戰(zhàn)演練——彈鋼琴步驟7運行程序。點擊界面上的鋼琴按鍵“Do”,程序會播放對應的音頻視頻播放11.2
先定一個小目標!掌握VideoView控件的使用方法,能夠實現(xiàn)播放視頻的功能11.2.1使用VideoView控件播放視頻與播放音頻相比,播放視頻需要使用視覺控件將影像展示出來。Android中的VideoView控件就是用來播放視頻的,借助它可以實現(xiàn)一個簡易的視頻播放器。11.2.1使用VideoView控件播放視頻方法名稱功能描述setVideoPath()設置要播放的視頻的位置start()開始或繼續(xù)播放視頻pause()暫停播放視頻resume()將視頻重新開始播放seekTo()從指定位置開始播放視頻isPlaying()判斷當前是否正在播放視頻getDuration()獲取載入的視頻文件的時長VideoView控件的常用方法11.2.1使用VideoView控件播放視頻11.2.1使用VideoView控件播放視頻使用VideoView控件播放視頻的基本步驟:(1)在布局文件中添加VideoView控件如果想在界面上播放視頻,則首先需要在布局文件中添加1個VideoView控件用于顯示視頻播放界面。<VideoView
android:id="@+id/videoview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>在布局文件中添加VideoView控件。示例11.2.1使用VideoView控件播放視頻(2)視頻的播放使用VideoView控件既可以播放本地存放的視頻,也可以播放網(wǎng)絡中的視頻。VideoViewvideoView=(VideoView)findViewById(R.id.videoview);//設置本地視頻地址videoView.setVideoPath("mnt/sdcard/xxx.avi");//設置網(wǎng)絡視頻地址videoView.setVideoURI(Uri.parse("http://www.xxx.avi"));
videoView.start();
//播放視頻使用VideoView控件播放視頻。示例11.2.1使用VideoView控件播放視頻<uses-permissionandroid:name="android.permission.INTERNET"/>播放網(wǎng)絡視頻時,需要在AndroidManifest.xml文件中添加訪問網(wǎng)絡的權限。添加訪問網(wǎng)絡的權限。示例(3)為VideoView控件綁定媒體控制器MediaControllercontroller=newMediaController(context);videoView.setMediaController(controller);通過setMediaController()方法為VideoView控件綁定一個媒體控制器。該控制器中包含媒體播放器中的一些典型按鈕,如播放/暫停、倒帶、快進及進度條等。11.2.1使用VideoView控件播放視頻為VideoView控件綁定媒體控制器,使播放狀態(tài)和控件中顯示的圖像同步。示例
先定一個小目標!掌握VideoView控件的使用方法,能夠獨立完成VideoView視頻播放器案例11.2.2實戰(zhàn)演練——VideoView視頻播放器下面通過VideoView視頻播放器的案例來演示如何使用VideoView控件播放視頻。11.2.2實戰(zhàn)演練——VideoView視頻播放器視頻播放界面11.2.2實戰(zhàn)演練——VideoView視頻播放器實現(xiàn)視頻播放界面功能創(chuàng)建程序。創(chuàng)建一個名為VideoView的應用程序,包名指定為cn.itcast.videoview。步驟1步驟2步驟3導入視頻文件。導入界面所需要的視頻文件到res/raw文件夾中。放置界面控件。包括放置1個ImageView控件、放置1個VideoView控件。步驟4實現(xiàn)視頻播放功能。在MainActivity中創(chuàng)建一個play()方法,在該方法中實現(xiàn)視頻播放功能。MainActivity.java文件核心代碼:11.2.2實戰(zhàn)演練——VideoView視頻播放器privatevoidplay(){videoView.start();//播放視頻
videoView.setOnCompletionListener(newMediaPlayer.OnCompletionListener(){
@OverridepublicvoidonCompletion(MediaPlayermp){iv_play.setVisibility(View.VISIBLE);iv_play.setImageResource(android.R.drawable.ic_media_play);}});}步驟5運行結果。點擊界面上的播放按鈕播放視頻。當點擊視頻播放界面時,界面底部會出現(xiàn)視頻的播放按鈕與視頻播放的進度條,可以隨意拖動視頻播放的進度條來設置視頻的播放進度。11.2.2實戰(zhàn)演練——VideoView視頻播放器實現(xiàn)視頻播放界面功能11.2.2實戰(zhàn)演練——VideoView視頻播放器實現(xiàn)視頻播放界面功能
先定一個小目標!掌握MediaPlayer類與SurfaceView控件的使用方法,能夠實現(xiàn)播放視頻的功能11.2.3使用MediaPlayer類和SurfaceView控件播放視頻11.2.3使用MediaPlayer類和SurfaceView控件播放視頻使用VideoView控件在播放視頻時消耗的系統(tǒng)內存比較大。為此Android還提供了另一種播放視頻的方式,就是將MediaPlayer類和SurfaceView控件結合使用。其中,MediaPlayer類用于播放視頻,SurfaceView控件用于顯示視頻圖像。SurfaceView控件繼承自View,它是顯示圖像的控件,具有雙緩沖技術,即其內部有兩個線程,分別用于更新界面和實現(xiàn)后臺計算,當完成各自的任務后可以無限循環(huán),并交替更新和計算。SurfaceView控件的這種特性可以避免因畫圖任務繁重而造成主線程阻塞,從而提高程序的性能,因此在游戲開發(fā)中常用到SurfaceView控件,例如設置游戲中的背景、人物、動畫等。11.2.3使用MediaPlayer類和SurfaceView控件播放視頻SurfaceView控件概述:使用MediaPlayer類和SurfaceView控件播放視頻的基本步驟:(1)在布局文件中添加SurfaceView控件<SurfaceViewandroid:id="@+id/surfaceview"android:layout_width="fill_parent"android:layout_height="fill_parent"/>11.2.3使用MediaPlayer類和SurfaceView控件播放視頻在布局文件中添加一個SurfaceView控件。示例SurfaceViewview=(SurfaceView)findViewById(R.id.sv);SurfaceHolderholder=view.getHolder();//設置SurfaceHolder類型holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);11.2.3使用MediaPlayer類和SurfaceView控件播放視頻(2)獲取界面控件并設置類型實現(xiàn)步驟:通過SurfaceView控件的id找到該控件。通過getHolder()方法獲取SurfaceView控件的管理器SurfaceHolder。接著通過setType()方法設置管理器SurfaceHolder的類型。獲取界面控件并設置類型。示例11.2.3使用MediaPlayer類和SurfaceView控件播放視頻注意:使用SurfaceView控件進行游戲開發(fā)時,需要開發(fā)者手動創(chuàng)建并維護兩個線程進行雙緩沖區(qū)的管理。為了使程序更簡便,可以通過setType()方法設置SurfaceHolder的類型為SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS,該類型表示SurfaceView控件不包含原生數(shù)據(jù),用到的數(shù)據(jù)由MediaPlayer對象提供,也就是不讓SurfaceView控件管理雙緩沖區(qū),而是交給MediaPlayer底層管理。雖然setType()方法已經(jīng)過時,但是在Android4.0以下版本的系統(tǒng)中必須調用該方法設置SurfaceHolder的類型。(3)回調addCallback()方法11.2.3使用MediaPlayer類和SurfaceView控件播放視頻使用SurfaceView控件時,一般情況下還要對其創(chuàng)建、銷毀、改變時的狀態(tài)進行監(jiān)聽,此時就需要調用addCallback()方法,在該方法中監(jiān)聽Surface的狀態(tài)。holder.addCallback(newCallback(){@OverridepublicvoidsurfaceDestroyed(SurfaceHolderholder){Log.i("TAG","Surface被銷毀了");}
@OverridepublicvoidsurfaceCreated(SurfaceHolderholder){Log.i("TAG","Surface被創(chuàng)建好了");}@OverridepublicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight){Log.i("TAG","Surface的大小發(fā)生變化");}});11.2.3使用MediaPlayer類和SurfaceView控件播放視頻Surface被創(chuàng)建時調用Surface被銷毀時調用Surface的大小發(fā)生變化時調用回調addCallback()方法。示例11.2.3使用MediaPlayer類和SurfaceView控件播放視頻Callback接口抽象方法的相關介紹如下:surfaceDestroyed()方法:Surface被銷毀時調用。surfaceCreated()方法:Surface被創(chuàng)建時調用。surfaceChanged()方法:Surface的大小發(fā)生變化時調用。11.2.3使用MediaPlayer類和SurfaceView控件播放視頻注意:SurfaceView控件中內嵌了一個專門用于繪制圖形的Surface類,SurfaceView控件可以控制Surface的格式和尺寸,以及Surface的繪制位置??梢岳斫鉃镾urface是管理數(shù)據(jù)的地方,SurfaceView控件是展示數(shù)據(jù)的地方。(4)播放視頻MediaPlayermediaplayer=newMediaPlayer();mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//設置視頻的音頻類型mediaplayer.setDataSource("視頻資源路徑");//設置視頻文件路徑mediaplayer.setDisplay(holder);//SurfaceView控件與MediaPlayer類進行關聯(lián)mediaplayer.prepareAsync(); //將視頻文件解析到內存中mediaplayer.start(); //播放視頻11.2.3使用MediaPlayer類和SurfaceView控件播放視頻播放視頻時需要把視頻顯示在SurfaceView控件上,所以需要通過setDisplay()
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年撫順職業(yè)技術學院高職單招職業(yè)適應性測試備考試題有答案解析
- 生物仿制藥研發(fā)與市場趨勢
- 2026年貴州水利水電職業(yè)技術學院單招綜合素質筆試參考題庫帶答案解析
- 護理文書規(guī)范化管理與優(yōu)化
- 2026年順德職業(yè)技術學院單招職業(yè)技能考試模擬試題附答案詳解
- 護士溝通技巧與人際交往藝術
- 腫瘤防治新技術與策略
- 腫瘤治療進展及挑戰(zhàn)
- 醫(yī)療行業(yè)員工禮儀與團隊協(xié)作
- 醫(yī)療機構品牌推廣策略
- 價值鏈圖1-微笑曲線:全球產(chǎn)業(yè)價值鏈
- 美容皮膚科臨床診療指南診療規(guī)范2023版
- 社區(qū)發(fā)展的核心任務
- DB35T 2136-2023 茶樹病害測報與綠色防控技術規(guī)程
- 蓋板涵蓋板計算
- 醫(yī)院藥房醫(yī)療廢物處置方案
- 天塔之光模擬控制PLC課程設計
- ASMEBPE介紹專題知識
- 八年級上冊地理期末復習計劃通用5篇
- 初中日語人教版七年級第一冊單詞表講義
- GB/T 9065.5-2010液壓軟管接頭第5部分:37°擴口端軟管接頭
評論
0/150
提交評論