天天看點

Android視訊播放器mediaplayerMediaPlayer播放遠端網絡視訊

MediaPlayer播放遠端網絡視訊

1、概念

mediaplayer類是控制音頻、視訊或流檔案播放的控件。由于mediaplayer主要是用來播放音頻的,是以在播放視訊

時,沒有提供圖像輸出界面,但是mediaplayer提供一個了setDisplay(SurfaceHolder)接口,這樣就可以利用

mediaplayer在Android上自由控制視訊播放。這裡需要注意在設定setDisplay時,由于surfaceView建立的優先級比較

低,在mediaplayer開始之後,surfaceView還沒建立出來,這樣會出現有聲音沒有圖像。

2、實作步驟

1)首先建立一個surfaceView對象,根據surfaceView對象得到SurfaceHolder對象,提供給Mediaplayer在調用setDisplay時使用;

2)surfaceHolder添加回調addCallback(MediaPlayer.Callback)

3)在回調方法surfaceCreated(SurfaceHolder holder)中建立Mediaplayer對象

4)建立好Mediaplayer對象後,設定監聽、設定播放資源和準備播放:      a、setOnPreparedListener(OnPreparedListener) 設定Mediaplayer的準備好監聽,在回調方法中啟動播放器

     b、setOnCompletionListener(OnCompletionListener) 設定Mediaplayer的視訊播放完成監聽,在回調方法中停止              和釋放Mediaplayer

     c、setDataSource() 這裡Android提供了5種設定方法,setDataSource(FileDescriptor)這裡的FileDescriptor表示文          件描述符(可以通過FileInputStream的getFDF()方法擷取)、setDataSource(FileDescriptor, long, long)、                  setDataSource(Context,Uri)、setDataSource(Context, Uri, Map<String, String>)、setDataSource(String, Map<String,                         String> )、setDataSource(String)方法

     d、prepared()或preparedAsync() 這兩個方法都是準備播放視訊,前一個會報IOException異常

5)在回調方法onPrepared(MediaPlayer mp)中啟動播放器Mediaplayer.start()

3、邊播邊下

mediaplayer在播放遠端網絡MP4視訊時,遠端伺服器會以兩種方式傳輸視訊,一種流形式的視訊,另一種非流形式

的視訊,對流形式的視訊而言,Android原生的Mediaplayer可以實作線上播放功能,但是對于非流形式的視訊,就不

能播放,這樣就得把視訊下載下傳到本地,再進行播放,但是這裡有個缺陷,不能實作邊播邊下,為了實作這個功能,就

在下載下傳視訊檔案時做處理。這裡仿照網上的一個邊播邊下音樂播放器,把它搬過來,發現MP4視訊檔案比較特殊,它

的moov資料一般會放在整個檔案最後,而我們在下載下傳時都是從檔案最開始順序讀取的,是以不能按照音頻那樣播放

MP4視訊了,得想辦法把MP4的moov資料先讀取到檔案。通過查找MP4檔案格式資料,然後進行解析,當讀取到的

boxType是mdat,标記目前流的位置,再跳過它的資料長度,在MP4檔案中填mdat資料長度的空資料,等到是moov

資料讀取完成後,傳回标記位置,繼續讀取MP4的mdat資料,替換空白處

MP4檔案格式解析資料:http://blog.sina.com.cn/s/blog_48f93b530100jz4x.html