1

我需要制作几个逐帧动画,每个动画最多包含 150 个全屏、480x800、帧、压缩 JPEG。

AnimationDrawable 会在前 10 帧左右超出 vm 预算时自行挂起。

在计时器上加载新位图的 SurfaceView 的帧速率非常慢,可能低于 5 fps。

由于我是 OpenGL 的新手,我想问一下在我的情况下它是否正确?

谢谢!:)

编辑:

加载jpges

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    BitmapFactory.decodeResource(getResources(), R.drawable.y1).compress(Bitmap.CompressFormat.JPEG, 80, stream);
    byeArr.add( stream.toByteArray() );

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    BitmapFactory.decodeResource(getResources(), R.drawable.y2).compress(Bitmap.CompressFormat.JPEG, 80, stream);
    byeArr.add( stream.toByteArray() );

... and so on.

和玩

@Override
public void onTick(long millisUntilFinished) {

    if ( i < byeArr.size() )
    {
    bitMap = BitmapFactory.decodeByteArray ( byeArr.get(i) , 0,  byeArr.get(i).length );
    }

但加载 25 帧大约需要 3-5 秒。也许有办法加快速度?还有一种方法可以查看我有多少可用内存,即我可以加载多少帧?

谢谢


edit2:实验发现可以保持350帧左右的数组,对于2个左右的全动画效果非常好。现在我只需要找到一种方法以某种方式将这些图片存储为字节,以便能够几乎实时加载它们,因为 decodeResource 有点慢。

编辑 3:在编辑 2 中,我确保可以在一个数组中存储大约 350 帧,这对于一个动画来说已经足够了。

因此,我可以将当​​前动画所需的帧加载到字节数组中并播放动画。

然而问题是加载帧

ByteArrayOutputStream stream = new ByteArrayOutputStream();
BitmapFactory.decodeResource(getResources(), R.drawable.y1).compress(Bitmap.CompressFormat.JPEG, 80, stream);
byeArr.add( stream.toByteArray() );

需要太长时间。所以我需要找到一种方法来加快速度。假设我需要将 jpegs 作为字节数组存储在 res 或 assets 中,你怎么看?

4

1 回答 1

3

首先将您的动画转换为视频流,然后使用MediaMetadataRetriever.getFrameAtTime获取帧。如果获取正确的帧成为问题,您可能需要使用ffmpeg之类的库,请看这里

另一种解决方案 - 如果 jpeg 集的总分配大小足够小 - 可能是将 jpeg 作为字节数组保存在内存中,并在需要时通过BitmapFactory.decodeByteArray对其进行解码。这将帮助您 1) 虚拟机预算 2) 缓慢的磁盘访问。

您可以使用以下方法从资源中获取原始数据。

byte[] getBytesFromResource(final int res) {
    byte[] buffer = null;
    InputStream input = null;

    try {
        input = getResources().openRawResource(res);
        buffer = new byte[input.available()];
        if (input.read(buffer, 0, buffer.length) != buffer.length) {
            buffer = null;
        }
    } catch (IOException e) {
        buffer = null;
    } finally {
        if (input != null) {
            try {
                input.close();
            } catch (IOException e) {}
        }
    }

    return buffer;
}
于 2012-09-16T07:26:15.927 回答