【问题标题】:How do you create a video live wallpaper你如何创建视频动态壁纸
【发布时间】:2023-03-08 14:10:02
【问题描述】:

我是一名来自 web 开发的 Android 新手,如果这个问题有一个明显的答案,我深表歉意;谷歌无法为我提供一个。我有一个循环动画,我想将它变成一个 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,该 API 明确表示这会大大增加复杂性,这意味着它只能由有经验的开发人员使用。

所以我要回到这里的基础并问:新手开发人员如何从动画中创建动态壁纸?将视频格式与本机媒体播放器一起使用?将每一帧以png格式绘制到屏幕上?使用免费提供的 api?

编辑 1:

自从我发帖以来,我做了一些研究并开发了两个不同的应用程序,但都不尽如人意。

首先,我解码每一帧(存储为 PNG 文件)并将它们存储在位图数组中。然后我每 50 毫秒循环一次,并将每一帧从数组中直接绘制到画布上。这种方法工作起来比较顺利,但是内存使用非常糟糕。由于每个 PNG 都经过解码然后存储为位图,因此我用 1-3 秒的视频(取决于设备)耗尽了内存。

在第二个中,我将每一帧作为 PNG 文件读入字节数组。这使我可以将它们存储在 RAM 中以便快速访问,但是通过将它们保留为压缩内存使用可以最小化。在循环期间,我从字节数组中动态解压缩每个字节,然后将其绘制到画布上。这种方法使用的内存不到第一种方法的一半。然而,动画是跳跃的,大概是因为所有需要的 GC。

openGL 或通过媒体播放器播放 mpeg 会提供比这些更好的性能吗?或者有没有办法优化上述方法之一?

编辑 2:

我对上面的方法2进行了进一步细化。我之前在绘图函数结束时设置了 40 毫秒的延迟,以便它再次调用自己。然而,由于解码和绘制动作花费了很多时间,而且它是不可预测的,它导致帧之间的延迟超过 40 毫秒。我已经将 40 毫秒的 postDelayed 调用移到了解码和绘制处理之前的过程开头。这导致播放更加流畅,尽管在可见的情况下以大约 50% 的处理器使用为代价。但是,到目前为止,这仅在高端 ICS 设备上进行了测试;我计划在接下来的一两天内在 Droid X 上试一试,看看会发生什么。

我仍然不相信这是最好的方法,希望能提供意见。我有一种唠叨的感觉,我做错了。

编辑 3: 在高端设备上播放相对流畅,但不是我的 Droid X。我认为这可能是由于在以不同于其原始分辨率的分辨率显示图像时需要进行的所有推断。所以我构建了代码,以手机的精确分辨率将每一帧保存为 jpg。这会导致某些设备上出现 oom 错误,所以我切换到 1/2 分辨率。虽然内存使用率仍然很高,但这很有效。

我尝试通过为动画的顶部 2/3 使用单个背景帧(大部分是静态的)来进一步解决问题,然后只为底部三分之一保存帧。但是,现在播放速度要慢得多,大约 10 FPS,即使在高端设备上也是如此。这大概是因为每一帧都需要整体重绘,现在画布上有两个位图。虽然这种方法的内存使用非常好。

编辑 4: 有人建议我启用硬件加速,我知道在这样的动态壁纸中发布到 SurfaceView 时无法做到这一点。当我四处搜索时,我意识到图形引擎可能是一个很好的方向,并尝试了 AndEngine。我将我的帧转换为单个巨型 jpg(15,000 x 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 能够通过某种方式智能地加载此内容,但我却遇到了内存不足错误,因为我的壁纸要求的 RAM 不到 200 MB。

这个项目现在已经花费了 50 多个小时,我觉得应该是一行代码:“backgroundHolder = movie.mpg”。我在 SO 和其他网站上都问了几个问题,关于如何用相对较少的回复来做到这一点。这让我质疑我正在尝试做的事情是否有可能,尽管十年前我在一台处理能力和内存都只有我的 Droid X 一小部分的 PC 上观看流畅的 800x600 电影。我知道硬件不是问题。是我糟糕的编码,还是 Java 的限制?这可能吗?只是发现这是不可能的,至少可以让我停止在这上面浪费时间。

我将尝试为这个问题添加赏金。

我就这个项目提出的相关问题:

Low framerate writing bitmaps to the canvas

Memory issue when storing images in byteArray

Bitmap.compress results in too large of file

【问题讨论】:

  • 顺便说一句,我很想知道哪种方法可以提供最佳性能和兼容性。我读到媒体播放器只能在 Android 4+ 上运行,但我担心 bmp 序列会导致性能太差。
  • 您找到满意的解决方案了吗?接受答案中的库对您有用吗?
  • @cottonBallPaws 不是我“满意”的一个,而是一个有效的。接受的答案中的一个是不必要的复杂(Android 的错;该项目的作者做了一项令人难以置信的工作)并且有局限性。我在我的网站nightscapecreations.com/mobile/home.cfm#liveWallpapers 上发布了我的版本的源代码。您可能会被重定向并需要单击“访问移动网站”链接以设置 cookie,然后才能看到它。我希望这会有所帮助!

标签: android live-wallpaper


【解决方案1】:

要创建视频动态壁纸,您应该首先查看任何open-source 项目,为此您可以查看此Project,对于任何教程,您可以查看此site.

【讨论】:

  • 谢谢。我不确定我是否可以仅从教程中管理它,但是拥有完整的项目会产生很大的不同。我无法让它工作,但希望它只需要一些试验和错误。我终于觉得有机会在这方面取得成功。 :)
  • 难道没有一个开源项目有更好的许可证吗?这并不要求您的应用程序也是开源的?
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多