我已經開發了一個小型應用程序,可以通過VideoView小部件(我試過)從rstp流式服務器播放視頻(在這種情況下是達爾文,但這不相關) Mplayer + SurfaceView方法)。我使用Wifi連接。Android上的後臺任務流式視頻播放性能問題
當視頻是唯一的任務時,視頻播放纔算順利。小應用程序應同時執行其他任務,例如不斷髮現藍牙設備並調用遠程Web服務(我正在使用Ksoap2)。當這些背景採集與視頻播放同時運行時,的性能令人難以置信地下降了(圖像和聲音有時停止,圖像變形,顯示的是相當大的方塊而不是合適的幀)。
即使是低質量的視頻(50kbps下的3gp)也會發生這種情況。對於藍牙發現我已經使用,沒有性能增強了彼此都可用的方法:
- 使用SDK提供5路發現並登記每發現藍牙設備。
- 對自寫的scan()方法使用本機調用,該方法利用Bluez API提供的
hci_inquiry()
函數。
對WS的調用請求發現設備的藍牙地址。呼叫在發現結束後發生。
我試着用GLSurfaceView代替SurfaceView,但是因爲我對Android平臺比較陌生,沒有3D圖形編程里程,所以我無法使它工作,因爲我找不到任何如何使用的例子OpenGL ES可以播放視頻,並且仍然可以讓Android API控制其他UI相關的東西(對話框/菜單/ Toasts)。另一方面,我不知道這是否確實可以改善播放。
我可以採取的任何線索或提示?
編輯:我忘了說,我在摩托羅拉Milestone
編輯2發展:繼CommonsWare和snctln建議,我試圖在沒有完全離開了SOAP WS調用,以儘量減少應用程序的內存佔用。
現在我嘗試緩存儘可能多的對象,並且只有在發現新的BT設備(WS需要發現的BT設備作爲輸入)時才執行呼叫以最小化GC呼叫。只有藍牙發現活動(根本沒有WS呼叫),視頻仍然會發揮很大作用。
編輯3:解決方案:我修改了我的應用程序,以便在掃描藍牙設備時使用UMTS(3G)數據連接而不是Wifi。儘管設備訪問公共互聯網(m.youtube.com),但其播放的流媒體視頻比3G(來自公共互聯網服務器)播放流視頻要遠遠超過本地Wifi(來自本地流媒體服務器)。本地流媒體服務器的性能不是問題,因爲流式傳輸到臺式電腦運行良好。我還將設備固件升級到2.0.1,並且在本地WiFi連接方面也有所改進,但是3G播放性能仍然勝過Wifi。
我的結論是,當使用同時的Wifi /藍牙通信時,該設備必須有一些衝突的硬件(可能是相同的芯片組)或軟件問題。
我已經給予主線程(我認爲是UI的一個)的最大優先級,並且創建用於執行BT掃描的最小優先級(當使用本地方式時)並且調用WS和視頻回放沒有足夠的結果性能改進。可能真正影響視頻播放的是系統調用(發現網絡套接字上的BT設備和I/O),但不確定。難道不可能使用GPU硬件加速,所以CPU開銷並不重要? – 2010-03-02 14:08:08
它已經使用GPU硬件加速。但是,如果我不得不猜測,您的問題更多的是流媒體方面 - 讀取數據並對其進行解碼。 – CommonsWare 2010-03-02 14:13:01
另外,不要混淆你沒有創建的線程的優先級(根據你的「主線程(我認爲是UI的最大優先級)」評論)。 – CommonsWare 2010-03-02 14:13:53