您现在的位置是:Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款 > 

手機youtube小窗口播放(如何關閉youtube退出視頻后小窗播放)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款2024-04-29 03:07:45【】7人已围观

简介如何關閉youtube退出視頻后小窗播放1、首先登錄到youtube。2、其次打開youtube的設置選項。3、最后在設置里關閉小窗口播放即可。手機能否播放flv格式的視頻?手機是不能播放FIV格式的

如何關閉youtube退出視頻后小窗播放

1、首先登錄到youtube。

2、其次打開youtube的設置選項。

3、最后在設置里關閉小窗口播放即可。

手機能否播放flv格式的視頻?

手機是不能播放FIV格式的視頻的,如果要播放FLV格式的視頻,需要將視頻格式轉換為3GP或者MP4即可播放。

FLV 是FLASH VIDEO的簡稱,FLV流媒體格式是一種新的視頻格式,全稱為Flash Video。

由于它形成的文件極小、加載速度極快,使得網絡觀看視頻文件成為可能,它的出現有效地解決了視頻文件導入Flash后,使導出的SWF文件體積龐大,不能在網絡上很好的使用等缺點。 

 FLV就是隨著Flash MX的推出發展而來的視頻格式,目前被眾多新一代視頻分享網站所采用,是目前增長最快、最為廣泛的視頻傳播格式。

是在sorenson 公司的壓縮算法的基礎上開發出來的。FLV格式不僅可以輕松的導入Flash 中,速度極快,并且能其到保護版權的作用,并且可以不通過本地的微軟或者REAL播放器播放視頻。

擴展資料:

轉:小窗播放視頻的原理和實現(上)

轉到, 在手機上看著方便

由于文章篇幅較長,將分為上、下兩篇。上篇主要介紹小窗播放視頻的原理,下篇主要介紹小窗播放視頻的實現。

目前很多視頻類App都有小窗播放功能,比如Youtube(如圖1)、Facebook(如圖2)等,不過它們的實現方式卻不同。Youtube 是將視頻播放View內嵌到應用內,優點是交互好;Facebook則是通過WindowManager添加視頻播放View,同時支持應用內部和外部播放。

小窗播放視頻功能在小窗和大屏之間切換時,視頻類App通常一邊執行交互動作一邊播放視頻。交互動作包括移動、縮放或者動畫;這些App在播放時期望給用戶平滑的過渡體驗,流暢加載視頻,不能有明顯的卡頓。

<figure>

<figcaption>(圖1 Youtube小窗播放視頻)</figcaption>

</figure>

<figure>

<figcaption>(圖2 Facebook小窗播放視頻)</figcaption>

</figure>

二、SurfaceView 和 GLSurfaceView

Android 中使用 MediaPlayer 播放視頻時,一般采用 SurfaceView 、 GLSurfaceView 和 TextureView 。Youtube、Facebook用不同技術方案實現了小窗播放視頻功能,它們共同點是都可以使用 SurfaceView 、 GLSurfaceView 和 TextureView 來播放視頻。接下來分析三個視圖用于小窗播放視頻的原理。

SurfaceView繼承自類View,但與其他View的子類不同的是它有獨立的Surface,如下源碼可以看出它包含一個Surface屬性,即它不與宿主窗口共享同一個繪圖表面。因此SurfaceView的UI可以在一個獨立的線程中進行繪制。由于不會占用主線程資源,因此SurfaceView可以實現復雜而高效的UI。GLSurfaceView繼承SurfaceView,作為SurfaceView的補充,加入了EGL的管理,并自帶了渲染線程。它用于小窗播放時效果和SurfaceView類似。本文以下內容以SurfaceView為例分析獨立的Surface對小窗播放會有什么影響。

通過Surface的類注釋可以知道,Surface處理一塊由Screen 買粉絲positor管理的Raw buffer。而Screen 買粉絲positor其實就是SurfaceFlinger服務。Surface字面意思就是繪圖表面,可以理解為是UI的畫布。

Android應用程序窗口需要請求SurfaceFlinger服務創建繪圖表面(也就是Surface對象),同時窗口還需要被WindowManagerService管理;所以實際上窗口的繪圖表面是通過兩個Surface對象來描述,一個是應用程序進程創建的,另一個是由WindowManagerService創建的,這兩個Surface對象對應于SurfaceFlinger服務的同一個Layer對象。

在應用程序進程這一側,每一個應用程序窗口,如Activity,都有一個Surface對象,就是在ViewRootImpl對象的mSurface屬性,這個Surface用來繪制應用程序窗口的UI,如下ViewRootImpl源碼所示。當界面需要刷新時,窗口調用draw方法,向Surface請求canvas,執行繪畫操作后再次提交給Surface完成屏幕顯示。

在WindowManagerService服務這一側,每一個窗口,都有一個對應的WindowState對象。其有一個屬性mSurface,它負責設置窗口的位置、大小屬性。例如,一個窗口的Z軸坐標大小要考慮到它的窗口類型,以及它與系統中的其它窗口的關系[2]。

SurfaceView有獨立的繪圖表面,那么SurfaceView又是怎么繪制在宿主窗口的呢?

上面說到每一個窗口在SurfaceFlinger服務中都對應有一個Layer,用來描述它的繪圖表面。同時每一個SurfaceView在SurfaceFlinger服務中還對應有一個獨立的Layer或者LayerBuffer,用來單獨描述它的繪圖表面,以區別于它的宿主窗口的繪圖表面[3]。

<figure>

</figure>

(圖3 SurfaceView的Surface的創建過程)

接下來了解Surface創建過程,如圖3的時序圖所示,每當一個窗口需要刷新UI時,就會調用ViewRootImpl類的performTraversals方法。如果當前窗口的Surface還沒有創建,或者已經失效,SurfaceView就會請求WindowManagerService服務創建一個新的Surface,它最終會調用updateWindow來完成Surface的創建。

如SurfaceView源碼所示,它有一個mSurface屬性,相比之下TextView或者Button等普通View會共用ViewRootImpl的Surface。

SurfaceView類的屬性mWindowType描述的是SurfaceView的窗口類型,它的默認值等于 TYPE_APPLICATION_MEDIA ,用來顯示多媒體的,如視頻。SurfaceView還有另外一個類型 TYPE_APPLICATION_MEDIA_OVERLAY ,它是在視頻上面顯示Overlay的,它可以顯示視字幕等信息。宿主窗口會遮擋這兩個類型的SurfaceView,如果窗口嵌入這兩類SurfaceView,那么它們的Z軸位置會低于該窗口的Z軸位置,顯示在該窗口下面。如果mWindow等于null的話,那么就說明該SurfaceView還沒有添加到WindowManagerService服務中去,然后調用addWithoutInputChannel添加到WindowManagerService服務中。

mSession.relayout()請求WindowManagerService服務對SurfaceView的UI進行布局。如果宿主窗口的繪制表面還未創建,或者需要重新創建,那么就會請求SurfaceFlinger服務為它創建一個新的Surface。由于這一步可能會修改SurfaceView的Surface,所以添加了mSurfaceLock鎖,避免其它線程同時修改該Surface的內容。

執行完成上述步驟之后,SurfaceView的Surface的創建完成了。但是mWindowType為 TYPE_APPLICATION_MEDIA 或 TYPE_APPLICATION_MEDIA_OVERLAY 的SurfaceView會被宿主窗口擋住,如何解決這個問題,這就要了解SurfaceView“挖洞”原理。

當SurfaceView附加宿主窗口時,它的onAttachedToWindow會被調用。這個方法調用requestTransparentRegion請求在宿主窗口上設置透明區域,即請求在宿主窗口上挖洞,其實就是設置ViewRootImpl中Surface的透明度。而每當其宿主窗口刷新自己的UI的時候,就會調用ViewGroup的gatherTransparentRegion將所有嵌入在它里面的SurfaceView所設置的透明區域收集起來。然后再通知WindowManagerService為SurfaceView的gatherTransparentRegion方法設置一個總的透明區域。這就是SurfaceViewd的“挖洞”原理,如圖4時序圖所示。

<figure>

</figure>

(圖4 SurfaceView“挖洞”原理)

接下來結合ViewRootImpl類的requestTransparentRegion源碼,來分析請求在宿主窗口上設置透明區域的過程。

當mView等于子View時,將mPrivateFlags的 View.REQUEST_TRANSPARENT_REGIONS 位設置為1,表示該窗口被設置了一塊透明區域。當一個窗口被請求設置了一塊透明區域之后,它的窗口屬性就發生了變化,這時候除了要將與它所關聯的ViewRootImpl對象的mWindowAttributesChanged值設置為true之外,還要調用該ViewRootImpl對象的requestLayout方法對窗口的UI進行重新布局和繪制。requestLayout最終會調用到另外一個方法performTraversals來實際執行刷新窗口UI的操作。

ViewRootImpl類的方法performTraversals是用來收集嵌入在它里面的SurfaceView所設置的透明區域的。它處于窗口的UI布局完成之后,窗口的UI繪制之前。這是因為窗口的UI布局完成之后,各個子視圖的大小和位置才能確定下來,進而才能確定SurfaceView的透明區域的位置和大小。從頂層視圖開始,從上到下收集每一個子視圖所要設置的區域,最終收集到的總透明區域并保存在ViewRootImpl類的成員變量mTransparentRegion中。其中host是De買粉絲rView,它的gatherTransparentRegion方法重載了父類ViewGroup的gatherTransparentRegion方法。

ViewGroup的gatherTransparentRegion方法中,檢測到有透明區域時,調用父類View的方法gatherTransparentRegion來檢查當前視圖容器是否需要繪制。如果需要繪制,說明當前視圖的前景需要繪制,就會將它所占據的區域從參數region所占據的區域移除,以便可以顯示當前視圖的前景。然后調用每一個子視圖的成員函數gatherTransparentRegion來繼續往下收集透明區域。

SurfaceView類的方法gatherTransparentRegion中,先檢測是否用作窗口面板以及mPrivateFlags的SKIP_DRAW位是不是1。如果都是,將它所占據的區域從參數region所描述的區域移除,region中剩下的就是透明區域。最后判斷Surface的像素格式是否設置有透明值。如果有,返回false給ViewRootImpl,然后ViewRootImpl調用 sWindowSession.setTransparentRegion(mWindow, mTransparentRegion); 設置窗口為透明。這樣就能看到SurfaceView了。

SurfaceView雖然具有獨立的Surface,不過它仍然是宿主窗口的視圖結構中的一個結點,因此,它仍然是可以參與到宿主窗口的繪制流程中去的。

在SurfaceView的draw和dispatchDraw方法中,參數canvas是建立在宿主窗口的Surface上的畫布,因此在這塊畫布上繪制任何UI都是出現在宿主窗口的Surface上的。但如果當前正在處理的SurfaceView不是用作宿主窗口面板的時候,即屬性mWindowType的值不等于 TYPE_APPLICATION_PANEL 的時候,SurfaceView的這兩個方法只是簡單地將它所占據的區域繪制為黑色。另外dispatchDraw還會調用另外一個方法updateWindow更新的UI,繪制自己的Sueface。

通過了解SurfaceView的創建過程、“挖洞”原理和繪制過程,可以了解到Surface對小窗播放視頻的影響如下:

1)SurfaceView在宿主窗口下面,通過“挖洞”原理顯示Surface。SurfaceView在做旋轉時,畫面不會跟隨SurfaceView旋轉。

2)同理,設置透明度或者執行透明值動畫時,SurfaceView顯示有問題。

3)SurfaceView繪制時會先繪制黑邊,所以在移動或者縮放過程,在更新不及時時會看到黑邊。

4)SurfaceView具有獨立的Surface,它的UI繪制可以在獨立的線程中進行,可以進行復雜的UI繪制。

由于SurfaceView不在View hierarchy中,View的一些縮放,透明度變化等方法無法使用。要實現這些功能就得使用TextureView,但TextureView有個缺點就是性能低耗電高。Android N對SurfaceView進行了更改,它對SurfaceView自身和它的內容改變做了同步處理,播放視頻時不會出現之前難看的黑色條。SurfaceView因這個新特性不會出現黑色條,但它旋轉時畫面仍然不會跟隨旋轉,仍然不支持透明度。

如下源碼所示,TextureView繼承于View,并重載了View的draw()方法,它與其它的View一樣在View hierarchy中管理與繪制。draw()方法中主要把SurfaceTexture中收到的圖像數據作為紋理更新到對應的HardwareLayer中。SurfaceTexture.OnFrameAvailableListener用于通知TextureView有新數據。

根據以上信息,可以知道TextureView不同于SurfaceView,沒有單獨創建Surface,而是作為View hierarchy中的一個普通View,來進行移動,旋轉,縮放,動畫等,沒有SurfaceView執行旋轉、縮放時的缺點。值得注意的是TextureView必須在硬件加速的窗口中,通過HardwareLayer更新視圖。它需要硬件加速層,這使得TextureView比SurfaceView更耗性能。 Android N上SurfaceView新特性的說明上,官方也推薦在不執行旋轉、透明度、縮放時使用SurfaceView。

SurfaceView有獨立的Surface,通過“挖洞”原理顯示它。以致它在執行旋轉時,畫面不會跟隨旋轉;同時設置透明度或者執行透明值動畫時,顯示有問題。Android N以上的SurfaceView在視頻進行縮放旋轉時會同步變化,不會看到黑色邊,官方推薦使用SurfaceView。TextureView作為普通View在View hierarchy中管理與繪制,更適用于小窗播放視頻功能。但TextureView需要硬件加速層,使得TextureView比SurfaceView和GLSurfaceView更耗性能。

[1]、Surface( 買粉絲s://developer.android.買粉絲/reference/android/view/Surface.買粉絲 )

[2]、Android應用程序窗口(Activity)的繪圖表面(Surface)的創建過程分析 ( 買粉絲://blog.csdn.買粉絲/luoshengyang/article/details/8303098 )

[3]、Android視圖SurfaceView的實現原理分析( 買粉絲://blog.csdn.買粉絲/luoshengyang/article/details/8661317 )

[4]、SurfaceView( 買粉絲s://developer.android.買粉絲/reference/android/view/SurfaceView.買粉絲 )

小窗播放視頻的原理和實現(下) 買粉絲s://cloud.tencent.買粉絲/developer/article/1047885

FLV文件能在蘋果手機播放嗎?

iPhone內置播放器不支持Flv文件;LV格式不僅可以輕松的導入Flash中,速度極快,并且能起到保護版權的作用,并且可以不通過本地的微軟或者REAL播放器播放視頻。

擴展資料

很赞哦!(659)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款的名片

职业:程序员,设计师

现居:浙江温州瓯海区

工作室:小组

Email:[email protected]