天天看點

android之VideoView和視訊播放View的擴充

1.概念及擴充

  videoview 是android 系統提供的一個媒體播放顯示和控制的控件。其結構層次如下:

  原型:videoview extends surfaceview implements mediacontroller.mediaplayercontrol

  類結構:

      java.lang.object

        ↳ android.view.view

          ↳ android.view.surfaceview

            ↳ android.widget.videoview

  通過videoview 的原型可知:如果建構更為複雜和有特色個性的視訊view,需要繼承surfaceview 和實作mediaplayercontrol接口。其中surfaceview 為顯示提供支援,mediaplayercontrol則為媒體控制提供了支援。

2.案例

1)videoview案例

(我們沒有管理mediapalyer的各種狀态,這些狀态都讓videoview給封裝了,并且,當videoview建立的時候,mediapalyer對象将會建立,當videoview對象銷毀的時候,mediaplayer對象将會釋放。)

布局檔案

主程式:

2)自定義videoview

和videoview實作類似,繼承了surfaceview并且實作了mediaplayercontrol。

一般情況下,android界面的繪制和更新,要交給主ui線程來操作,通過handler機制。但是播放視訊,需要比較優先和實時的改變和繪制界面。android提供了使用單獨線程繪制ui的機制,就是surfaceview。使用surfaceview,需要實作surfaceholder.callback接口:

surfacecreated,在surface(surfaceview内部包含一個surface執行個體)建立後,會立即調用該方法,可在該方法中做繪制界面相關的初始化工作;

surfacechanged,當surface的狀态發生變化,比如大小,會調用該方法,在surfacecreated方法調用過至少會調用一次該方法;

surfacedestroyed,當銷毀surface的時候調用。

  開發者不能直接操作surface執行個體,要通過surfacehandler,在surfaceview中可以通過gethandler方法擷取到surfacehandler執行個體。

surfacehander有一些類型,用來辨別surface執行個體界面資料來源,可以通過settype來操作:

surface_type_normal:ram緩存的原生資料

surface_type_hardware:通過dma,direct memory access,就是直接寫屏技術擷取到的資料,或者其他硬體加速的資料

surface_type_gpu:通過gpu加速的資料

surface_type_push_buffers:辨別資料來源于其他對象,比如照相機,比如視訊播放伺服器(android内部有視訊播放的伺服器,所有播放視訊相當于用戶端)

  customervideoview的構造方法,使用超類的構造方法。都會執行initvideoview()方法用來初始化界面和參數。另外一個主要的内容是openvideo()方法:

mediaplayer.prepareasync(),用來異步準備播放,另外還有個prepare()方法,是同步的,也就是全部下載下傳完畢才能播放,顯然,在播放網上視訊的時候需要用前者;

通過attachmediacontroller()方法,把控制條附加到播放視訊的surfaceview上,這裡實作的不完全,是以還不能使 用,僅僅是把mediaplayercontrol執行個體通過setmediaplayer方法設定一下,供onpreparedlistener用來得到 加載成功的回調,另外供外面代碼調用得到視訊的時長和目前時長。

繼續閱讀