190 likes | 387 Views
CH16 音訊與視訊. Android SDK 提供許多種方式可以處理音訊與視訊 ( 播放與錄製 ) 其中以「 MediaPlayer 」為音訊播放的主要方法 視訊播放方面則以「 VideoView 」元件較為方便 對錄製而言,音訊與視訊均以「 MediaRecorder 」為標準方式. 一、 Android 平台支援的媒體格式. Android 平台支援的基本媒體格式. 二、 播放音訊. MediaPlayer 類別支援音訊與視訊播放,使用時會依媒體類型自動選擇適當的解碼器 。 MediaPlayer 類別的主要狀態依序說明如下:
E N D
Android SDK提供許多種方式可以處理音訊與視訊(播放與錄製) • 其中以「MediaPlayer」為音訊播放的主要方法 • 視訊播放方面則以「VideoView」元件較為方便 • 對錄製而言,音訊與視訊均以「MediaRecorder」為標準方式
一、Android平台支援的媒體格式 • Android平台支援的基本媒體格式
二、播放音訊 • MediaPlayer類別支援音訊與視訊播放,使用時會依媒體類型自動選擇適當的解碼器。 • MediaPlayer類別的主要狀態依序說明如下: • 待命(Idle):MediaPlayer類別建立實體物件後進入此狀態;執行「reset()」方法也會回到此狀態。 • 初始化(Initialized):完成媒體資料設定,即執行「setDataSource()」方法後進入此狀態。 • 準備中(Preparing):MediaPlayer物件以「prepare()」或「prepareAsync()」方法準備要播放的媒體來源。 • 完成準備(Prepared):完成準備後會觸發「onPrepared」事件,到這階段才能執行「start()」方法播放媒體。 • 播放中(Started):執行「start()」方法後開始播放媒體並進入播放中狀態。
暫停(Pause):在播放中狀態執行「pause()」方法,則進入暫停狀態,暫時停止媒體播放。從此狀態執行「start()」方法可以再次進入播放中狀態,並從停止位置繼續往下播放;若執行「stop()」方法則進入停止狀態。暫停(Pause):在播放中狀態執行「pause()」方法,則進入暫停狀態,暫時停止媒體播放。從此狀態執行「start()」方法可以再次進入播放中狀態,並從停止位置繼續往下播放;若執行「stop()」方法則進入停止狀態。 • 播完(Playback Completed):完成媒體內容播放,會觸發「onCompletion」事件,從此狀態執行「start()」方法可以回到播放中狀態,執行「stop()」方法則進入停止狀態。 • 停止(Stopped):MediaPlayer物件不再準備好媒體資料,若要再次播放必須重新執行「prepare()」或「prepareAsync()」方法恢復完成準備狀態。 • 終結(End):當MediaPlayer物件執行「release()」方法後,會釋放它所有的資源而終結自己。
有2點需要注意: • MediaPlayer物件的prepare()或prepareAsync()方法都是用以準備要播放媒體來源,這2者的差別是prepare()必須完成所有媒體來源準備後才進入準備狀態,這對較大的媒體來源或從網路下載來源,需要等待的時間比較久;而prepareAsync()則屬於非同步方法,可以一邊準備媒體來源,一邊播放。
MediaPlayer物件播放的媒體可以有不同的來源,可以是存在專案的資源、存在行動裝置SD卡的媒體檔、或是即時從網路下載的檔案;要特別注意的是,如果媒體來源是在專案資源中,則執行MediaPlayer.create(this,R.raw.test)方法後,會同時建立MediaPlayer實體物件並準備好媒體來源,因此不必也不能執行prepare()或prepareAsync()方法。MediaPlayer物件播放的媒體可以有不同的來源,可以是存在專案的資源、存在行動裝置SD卡的媒體檔、或是即時從網路下載的檔案;要特別注意的是,如果媒體來源是在專案資源中,則執行MediaPlayer.create(this,R.raw.test)方法後,會同時建立MediaPlayer實體物件並準備好媒體來源,因此不必也不能執行prepare()或prepareAsync()方法。
MediaPlayerAudio Test範例 • 在活動佈局中佈置了3個按鈕分別控制音訊播放、暫停與停止功能。 • 範例詳細內容請參考原書code 16-2。 • 如果媒體不是來自專案本身,不論是來自行動裝置SD卡或網路(都稱為外來媒體),則媒體必須完成準備後才能播放,否則會產生錯誤。
三、錄音 • 錄音最方便的方式是透過MediaRecorder類別所提供的方法處理。 • MediaRecorder類別在生命循環中的不同的狀態: • 待命(Initial):MediaRecorder類別建立實體物件後進入此狀態;執行「reset()」方法也會回到此狀態。 • 初始化(Initialized):MediaRecorde實體物件完成備便,執行「setAudioSource()」方法後進入此狀態;這裡的主要設定是聲音來自那個裝置,一般設定為「MediaRecorder.AudioSource.MIC」,表示聲音來自行動裝置的麥克風。
資料來源建構(DataSource Configured):完成輸出格式設定,執行「setOutputFormat()」方法後進入此狀態,這裡的設定是聲音存檔格式;在這狀態中還要設定編碼器與存檔位置(一般是SD卡)。 • 完成準備(Prepared):到這階段才能執行「start()」方法開始錄音。 • 錄音中(recording):執行「start()」方法後開始錄音。 • 釋放(Released):執行「release()」方法釋放MediaRecorder物件所有的資源。
錄音應用設計最容易犯的錯誤是忘了AndroidManifest.xml這個檔案。因為錄音需要用到行動裝置的硬體,而且要將錄音後的檔案存到SD卡,這2件工作都必須先在AndroidManifest.xml檔案申請對應的使用者許可(uses-permission)。錄音應用設計最容易犯的錯誤是忘了AndroidManifest.xml這個檔案。因為錄音需要用到行動裝置的硬體,而且要將錄音後的檔案存到SD卡,這2件工作都必須先在AndroidManifest.xml檔案申請對應的使用者許可(uses-permission)。 • MediaRecorderAudio Test範例 • 活動佈局設計,在佈局中增加1個文字顯示視圖與3個按鈕,3個按鈕將用以控制錄音、停止錄音與播放剛錄的聲音等功能。 • 範例詳細內容請參考原書 code 16-5。
四、用VideoView播放視訊 • 視訊播放與音訊播放原理是一樣的,但它們之間有一個最大的差別,就是視訊播放時需要一個視圖顯示播放的內容。 • 針對視訊播放需要顯示介面的需求,Android SDK很貼心的提供了一個便利的元件--「VideoView」,它已經將視訊播放控制的方法與顯示介面結合在一起,讓程式開發者可以更專心於控制流程的設計;更好的是,透過「MediaController」類別的協助,還能為VideoView提供類似一般播放軟體的控制介面,讓視訊播放程式開發更加的輕而易舉。
VideoPlay Test範例 • 要使用VideoView播放視訊,首先必須將它加到應用程式的活動佈局中,在活動的程式中只要設定要播放的檔案,以及建立MediaController與VideoView彼此之間的關係,就可以利用MediaController提供的控制介面,控制視訊播放。 • 範例詳細內容請參考原書 code 16-7。
五、用MediaPlayer與SurfaceView播放視訊 • 如果要用MediaPlayer類別播放視訊,必須為它找一個顯示介面。 • 「SurfaceView」類別能夠控制它的格式、大小與在佈局中的位置,很適合用於媒體播放,但是這些控制還需要藉由「SurfaceHolder」抽象介面的協助。
MediaPlayVideo Test範例 • 在專案活動佈局中加入SurfaceView與2個控制播放與停止的按鈕。 • 程式設計的邏輯是當SurfaceHolder控制的顯示介面(SurfaceView)建立完成之後,才讓播放鈕可以動作;這點很重要,如果在顯示介面尚未備妥前就要求播放視訊,會產生錯誤而使程式意外中止。 • 當視訊開始播放則取消播放鈕的功能同時讓停止鈕可以動作,以便使用者可以隨時敲此鈕終止播放。 • 範例詳細內容請參考原書 code 16-9。
六、錄影 • 錄影是透過行動裝置的攝影機進行,因此如同錄音一樣也要在專案的AndroidManifest.xml檔案中設定使用許可,但因為不會只錄影像不錄聲音,所以連同聲音與外部存檔功能也要一併申請。 • 基本上透過MediaRecorder類別錄影與錄音是一樣的步驟,只不過一般在錄影時會多出一個顯示畫面,讓使用者預覽它錄影中的內容。
如果要以模擬器測試錄影,在模擬器中必須先設定使用WebCam來模擬行動裝置的攝影機。如果要以模擬器測試錄影,在模擬器中必須先設定使用WebCam來模擬行動裝置的攝影機。 • MediaRecorderVideo Test範例 • 在佈局中加入一個SurfaceView做為預覽視窗,並提供錄影(Record)與停止(Stop)二個按鈕控制錄影過程。 • 範例詳細內容請參考原書code 16-10。 • 視訊與音訊播放比較耗費系統資源,如果情況允許,則建議最好直接以實機測試。