2013-08-06 67 views
1

我是一位來自網站開發的Android新手,所以我很抱歉如果這個問題有明顯的答案; Google一直無法提供給我。我有一個循環動畫,我想變成一個Android動態壁紙,我可以放在應用程序商店。如何製作視頻動態壁紙

我在這裏創建了一個基本的動態壁紙有用的教程:http://www.techrepublic.com/blog/android-app-builder/a-bare-bones-live-wallpaper-template-for-android/。在構建我自己的模板版本之後,我想我可以用創建媒體播放器並在屏幕上播放mpg的函數來替換「繪製」函數,但是我沒有找到用於執行此操作的教程。

然後我碰到了這個:Android video as a live wallpaper,這表明播放一個MPG可能比我原先假設的要困難得多並且有問題。這似乎提供了一個解決方案:How to play video as live wallpaper android?但是,它需要使用外部API,特別說明它會增加很多複雜性,這意味着它只應由有經驗的開發人員使用。

所以我回到這裏的基礎知識,並問:新手開發人員如何從動畫創建動態壁紙?在本地媒體播放器中使用視頻格式?將每一幀作爲png畫到屏幕上?使用免費的api?

編輯1:

因爲我貼我已經做了一些研究,並開發了兩種不同的應用程序,但兩者是不能令人滿意的。

在第一個我解碼每個幀(存儲爲PNG文件)並將它們存儲在位圖數組中。然後我循環每50ms,並將每個幀直接從數組中畫出到畫布。這種方法工作比較順利,但內存使用情況非常糟糕。由於每個PNG都被解碼,然後作爲位圖存儲,因此我會用1-3秒的視頻(取決於設備)耗盡內存。

在第二篇文章中,我將每個幀讀入一個字節數組作爲PNG文件。這使我可以將它們存儲在RAM中以便快速訪問,但是通過將它們保留在壓縮的內存中的情況被最小化了。在循環過程中,我將它們從bytearray中解壓出來,然後將其繪製到畫布上。此方法使用的內存不到第一個的一半。然而,動畫是跳動的,據推測來自所有的GC要求。

openGL或通過媒體播放器播放MPEG提供比這些更好的性能?或者有沒有辦法來優化上述方法之一?

編輯2:

我具有上文進一步精煉方法2。之前我在繪圖函數的末尾設置了一個40毫秒的延遲,以便再次調用它自己。然而,由於解碼和繪製操作花費了很多時間,並且是不可預知的,所以造成幀之間的延遲超過40毫秒。我已經將40ms postDelayed調用移到了解碼和繪製處理之前的過程的開始處。這導致了更平滑的播放,儘管在可見的情況下,處理器使用率約爲50%。但是,迄今爲止,這只是在高端ICS設備上進行測試;我打算在第二天或第二天在Droid X上放一下,看看會發生什麼。

我仍然不相信這是最好的方法,並希望輸入。我有一種嘮叨的感覺,我做錯了。

編輯3: 在高端設備上播放相對平滑,但不是我的Droid X.我認爲這可能是由於當以不同於其原始分辨率的分辨率顯示圖像時需要發生的所有外推。因此,我建立了代碼,以每張圖片的精確分辨率保存爲jpg格式。這導致某些設備上的oom錯誤,所以我切換到1/2分辨率。雖然內存使用率仍然很高,但這種方式很有效

我試圖通過使用單個背景幀進一步解決動畫的頂部2/3(大部分是靜態的),然後只保存了底部三分之一的幀。然而,即使在高端設備上,現在播放的速度也要慢得多,大約10 FPS。這大概是因爲每個幀都需要重新繪製,現在畫布上有兩個位圖。雖然這種方法的內存使用情況非常好。

編輯4: 有人建議對我來說,啓用硬件加速,這點我明白在這樣的動態壁紙張貼到surfaceView時,不能完成。當我搜索周圍時,我意識到圖形引擎可能是一個很好的方向去嘗試AndEngine。我將我架到一個巨大的JPG(15,000×3080像素),並使用此代碼加載它們放入一個精靈:

waterTexture = new BitmapTextureAtlas(this.getTextureManager(), 15000, 3040, TextureOptions.BILINEAR); 
waterRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(waterTexture, this.getAssets(), "wateranimation.jpg", 0, 0, 25, 16); 
waterTexture.load(); 

我曾希望AndEngine將有智能加載這個某種程度上,而是我剛與我的壁紙請求內存不足200 MB的內存不足錯誤。

這個項目現在已經消耗了超過50小時,我覺得應該是一行代碼:「backgroundHolder = movie.mpg」。我已經在SO和其他網站上提出了幾個問題,關於如何做出相應的迴應。這讓我懷疑自己試圖做什麼甚至是可能的,儘管事實上我十年前在一臺PC上觀看流暢的800x600電影,其中有一小部分處理能力和內存甚至是我的Droid X.我知道硬件不是問題。這是我的糟糕的編碼,還是Java的限制?這可能嗎?發現這是不可能的,至少可以讓我停止浪費時間。

我將嘗試爲此問題添加賞金。

相關的問題,我已經開始對此項目:

Low framerate writing bitmaps to the canvas

Memory issue when storing images in byteArray

Bitmap.compress results in too large of file

+0

另外,我會有興趣知道哪種方法將提供最佳的性能和兼容性。我讀過媒體播放器只能用於Android 4+,但我擔心bmp序列會導致性能太差。 – Nicholas

+0

你有沒有找到你滿意的解決方案?被接受的答案中的圖書館是否適合你? – cottonBallPaws

+0

@cottonBallPaws沒有一個我「很高興」,但有效。被接受的答案中的答案是不必要的複雜(Android的錯;該項目的作者做了一個令人難以置信的工作),並帶來了侷限性。我在我的網站http://nightscapecreations.com/mobile/home.cfm#liveWallpapers上發佈了我的版本的源代碼。您可能會被重定向,需要點擊「訪問移動網站」鏈接才能設置cookie,然後才能看到它。我希望這有幫助! – Nicholas

回答

2

有關創建視頻動態壁紙,你應該先看看任何open-source項目爲此,您可以檢查此Project和任何教程你可以看看這個site.

+0

謝謝。我不確定我是否可以從教程中管理它,但是完整的項目會產生很大的影響。我無法讓這個工作,但希望它只是需要一些試驗和錯誤。我終於覺得這有可能成功。 :) – Nicholas

+0

謝謝你,沒有upvote): – Prakhar