1. 程式人生 > >Android VideoView播放本地視訊短暫黑屏的解決方法

Android VideoView播放本地視訊短暫黑屏的解決方法

       新的大版本終於正式釋出了,整整三個月,做的心力交瘁,導致好久都沒有更新文章了。最近接觸了許多新的知識,也算是忙碌中有所收穫。希望接下來的時間工作上能夠稍微鬆緩一些,讓我可以利用在家的閒餘時間把一些內容整理總結,慢慢消化一下。今天首先來談一談前段時間遇到的一個關於ViewView的問題。

       VideoView在Android視訊播放中很常用,用法也比較簡單。但是,我在使用VideoView時遇到一個很棘手的問題:VideoView播放本地視訊的開始會出現短暫的黑屏。通常這種黑屏在新開啟的頁面中是勉強可以接受的,不過,如果是針對在應用的啟動頁播放視訊這樣的業務場景,這樣的黑屏就很難以被接受了。

       首先來看一下為什麼會出現黑屏的現象。視訊本地播放前短暫黑屏,是由於VideoView載入資源需要一定的耗時,視訊載入到視訊渲染到螢幕這個過程也是需要時間的。如何避免播放前的黑屏現象呢,下面就通過一些方法來嘗試著解決這個讓人頭疼的問題。

方法一

       看到網上有方法說,通過在onCreate生命週期方法中新增 getWindow().setFormat(PixelFormat.TRANSLUCENT); 可以解決問題。這條語句的作用主要是將視窗的背景設定為透明。實測發現設定這個屬性並不能解決這個問題。

方法二

       考慮給VideoView加一個背景,為了顯示的連貫性,可以選擇視訊播放前顯示的圖片作為背景。然而,我們並沒有得到預期的效果,播放的視訊會被設定的背景圖片蓋住。這是由於VideoView繼承自SurfaceView,而SurfaceView又包含一個Surface,Surface比它本身Backgroud的層級還要低。

       Surface是縱深排序(Z-ordered)的,說明它總在自己所在視窗的後面。SurfaceView提供了一個可見區域,只有在這個可見區域內的Surface內容才可見。Surface的排版顯示受到檢視層級關係的影響,它的兄弟檢視結點會在頂端顯示,這意味者 Surface的內容會被它的兄弟檢視遮擋。為了保證VideoView不被遮擋,可以呼叫setZOrderOnTop(true)將VideoView的層級設定為最頂層,這樣視訊就不會被背景遮擋。但是,如果VideoView範圍內同時還有其他View,就會被VideoView遮擋,這種方法就不能使用了。

       綜合前面的分析,考慮給VideoView設定一個背景圖片,然後給VideoView加一個postDelay,一小段時間後,將背景隱藏,這樣視訊就不會再被遮住了。不過這樣只是讓黑屏沒有那麼明顯,並不能完全消除黑屏。而且delay的時間設定為多長是不明確的,因為視訊載入的時間並不確定。

方法三

給VideoView新增onPrepared的回撥,通過呼叫setOnPreparedListener方法來設定。但是實驗發現這樣處理並不能完全解決問題。實際上onPrepared的回撥只是告訴我們視訊已經準備好了,卻並沒有真正開始渲染幀,所以這樣處理依然會出現短暫黑屏的情況。

方法四
       結合上面的結論,要解決這個問題,需要等到視訊真正開始渲染後再去掉VideoView 的背景。最終的解決辦法是在onPrepared回撥中,加新增一個setOnInfoListener的監聽,在這個監聽中將VideoView的背景清除。具體修改如下:

			videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
				@Override
				public void onPrepared(MediaPlayer mp) {
					mp.setOnInfoListener(new MediaPlayer.OnInfoListener() {
						@Override
						public boolean onInfo(MediaPlayer mp, int what, int extra) {
							if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START)
								videoView.setBackgroundColor(Color.TRANSPARENT);
							return true;
						}
					});

       這段程式碼的關鍵是MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START這個變數,Android SDK中給出的註釋是:這個狀態表示展現了用於渲染的第一幀視訊,也就是這個時候才真正將視訊幀展示到了螢幕上。

然而,這個變數是在4.1版本才引入的,4.1之前的版本依然不支援。4.1之前的版本,只能暫時通過方法三來優化,好在舊版本的機器佔比已經很少。

相關推薦

Android VideoView播放本地視訊短暫解決方法

       新的大版本終於正式釋出了,整整三個月,做的心力交瘁,導致好久都沒有更新文章了。最近接觸了許多新的知識,也算是忙碌中有所收穫。希望接下來的時間工作上能夠稍微鬆緩一些,讓我可以利用在家的閒

Android 安卓使用VideoView播放本地視訊

VideoDetailActivity import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import andr

Android VideoView播放網路視訊簡介(轉)

最近專案中用到了很多視訊播放的地方,不管是聊天傳送的視訊訊息,還是類似內涵段子的視訊列表,都會涉及這些知識,不過網上的知識都很零散,一會找快取方法,一會找預覽圖片的方法,一會找視訊動態修改尺寸的方法,總之找的人好煩,所以自己寫一篇來記錄這些知識點,也方便別人查閱 獲取視訊首幀當預覽圖(MediaMetada

Android VideoView播放網路視訊簡介

最近專案中用到了很多視訊播放的地方,不管是聊天傳送的視訊訊息,還是類似內涵段子的視訊列表,都會涉及這些知識,不過網上的知識都很零散,一會找快取方法,一會找預覽圖片的方法,一會找視訊動態修改尺寸的方法,總之找的人好煩,所以自己寫一篇來記錄這些知識點,也方便別人查閱獲取視訊首幀當

WebView播放HTML5視訊的問題。

先來說下現象吧。 三部測試手機     1號 Note2  N7100   Android系統版本4.3           2號 三星9100    Android系統版本4.0.3      3號 HTC Desire  Android系統版本 2.3.5  注意2.3

Android Studio+Emulator啟動解決方法

引子:線上升級AndroidStuio後突然發現Emulator打不開了,點選啟動可以正常執行,但是模擬器是黑屏的。百度 + Google後解決無果,後各種折騰終於找到原因和解決方法。 1. 問題詳情 點選模擬器可以正常啟動,但是是黑屏的(不是卡

Cocos2d-js Android手機上微信內建瀏覽器解決方法

1、在Cocos2d-js開發過程中 通常會遇到很多問題。本次解決在安卓手機上的微信內建瀏覽器黑屏問題。 2、微信的內建瀏覽器和其它專業的瀏覽器不同。微信內建瀏覽器用x5核心。在一些方面比其它專業的瀏覽器比較落後,所以經常會遇到 卡頓、跳幀、黑屏問題。 3、對於黑屏問題一般

虛擬機器安裝Ubuntu解決方法

虛擬機器VMware Workstation 安裝 Ubuntu 問題描述: 在虛擬機器建立Ubuntu系統後,選擇“簡易安裝”或者“自定義安裝” 之後介面一直是黑屏,如下圖所示; 解決方法 1;WIN+X 然後選擇“命令提示符(管理員) 2;進入如下介面 輸

ubuntu 16.04系統下GTX970顯示卡不支援導致無法開機或開機解決方法

1.問題簡介 最近換了個電腦,在重灌ubuntu16.04時遇到了問題。本來是個帶有win10的雙系統,錯誤的把win10解除安裝後還是有著無法進入的問題。主要表現為可以進入選擇系統的介面,但是在選擇系統後,即刻進入黑屏無法進入ubuntu系統。 這個問題是

跳轉ViewController解決方法

模擬器 從一個viewController跳轉到另一個viewController後黑屏,方法是: 1. 在storyboard裡給跳轉的viewController加上StoryboardID:

VMware Workstation 14開啟虛擬機器解決方法

最近研究Kali Linux,從網上下載ova檔案在vm14裡黑屏打不開。 於是去kali論壇搜尋類似問題也沒有很好的資料,在貼吧發現相同問題的人通過降低vm版本解決,我覺得這不是問題的關鍵。 於是按vm 14黑屏為關鍵詞搜尋,發現了 百度使用者:q1054006117 發

android videoview 播放之前短暫

最近在做視訊閃屏頁,但是遇到了一個困難 VideoView播放視訊的時候會出現黑屏,能夠清晰看到黑色的螢幕,很不美觀 照慣例,遇到問題先看有沒有網友解決過,發現了幾篇部落格 但是兩個部落格都沒有能解決我的問題,第一篇部落格提到的onInfo裡面的回

Unity使用VideoPlayer播放視訊在手機端會短暫問題的解決方式

最近專案遇到了這個問題 然後測試了好多次解決了這個問題,如果有更好的解決方式歡迎大家回覆. 主要分為兩種情況 是否勾選了Play On Awake , 如果勾選了就要同時勾上Wait For First Frame 然後加個指令碼start中隱藏加暫停或停止讓 RenderTextur

android videoview 播放解決方法之一

http://stackoverflow.com/questions/9765629/android-videoview-black-screen 播放前黑屏的原因是videoview載入資源需要一定的耗時, 如何避免播放前的黑屏現象呢, 可以給videoview設定載入的

Android 視訊播放VideoView 的使用,播放本地視訊 和 網路視訊

轉自:https://www.cnblogs.com/zhaoyanjun/p/5412984.html1、佈局檔案<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="ht

Android VideoView播放視訊切換橫有黑白邊無法全

問題描述:Android VideoView播放視訊豎屏切換橫屏有黑邊無法全屏 解決辦法是自定義VedioView,動態設定寬高。 * 1.自定義VedioView,並在onMeasur

Android VideoView播放avi格式視訊有聲音無影象問題

   1.新增許可權: <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.

Android 利用傳送Intent播放本地視訊和網路視訊 (轉載)

http://blog.sina.com.cn/s/blog_a000da9d01011y85.html Android中除了利用VideoView、Mediaplayer播放視訊檔案外,還可以用傳送Intent來呼叫視訊播放模組。   方法如下: &nb

Android播放本地視訊

主程式 public class MainActivity extends AppCompatActivity implements View.OnClickListener { private MediaPlayer mediaPlayer = new MediaPlayer();

Android 解決啟動頁面短暫問題

Android 開發過程中 啟動頁面偶爾會有黑屏的情況 黑白屏問題的原因 activity生命週期先執行onResume()方法,如果此方法中執行了耗時操作,阻塞了主執行緒,很明顯就會出現黑白屏問