如何在视频渲染案例中使用ImageView高效处理?

时间:2016-08-30 15:34:17

标签: android performance video imageview android-bitmap

我正在开发视频流应用。这是一个特殊情况,我需要手动处理每个帧(从网络访问到解码和其他处理)。在我的所有流程结束时,对于每个框架,我都有byte[]包含ARGB_8888编码图像。

现在,我以这种方式绘制每个帧(假设 width = 1280且 height = 720,而 data 是我的{{1包含框架, imageView 是我的byte[]容器)

ImageView

一切正常,没问题。但我有很多GC,我真的不喜欢每次为每个相同尺寸的框架创建一个新的// Step 1: reception and treatments // After that, data contains the frame bytes; // Step 2: bitmap creation Bitmap toDraw = Bitmap.createBitmap(1280, 720, Bitmap.Config.ARGB_8888); toDraw.copyPixelsFromBuffer(ByteBuffer.wrap(data)); // Step 3: draw the bitmap imageView.post(new Runnable() { @Override public void run() { imageView.setImageBitmap(toDraw); } }); !所以我需要知道如何优化帧渲染?我知道我可以在第一次调用Bitmap然后只使用createBitmap来填充它(即使它复制了我也不喜欢它但是它更好)。一个直观的解决方案来找我,但我不知道它是否可能:

如果我是第一次创建并绘制copyPixelsFromBuffer,然后检索Bitmap中的像素并对其进行修改或直接修改或将imageView作为参考,该怎么办?我搜索了data,但没有找到解决方案。

否则,任何想法都比这个代码更好(通过更好的意思是内存友好和更快)?问题是:快速更新DrawingCache提供已解码的imageView数据(每帧)的最佳方法是什么。

编辑:我看到that。我会测试并继续调查。

1 个答案:

答案 0 :(得分:1)

你可以只在需要时创建位图,如果它是null或者它的大小不正确

Bitmap mBitmap;

private void someMethod(){

    if(mBitmap == null || !isBitmapSizeOk(mBitmap)){
        if(mBitmap != null) mBitmap.recycle();

        mBitmap = Bitmap.createBitmap(1280, 720, Bitmap.Config.ARGB_8888);
        // call it only when the Bitmap instance changes
        imageView.setImageBitmap(mBitmap); 
    }

    mBitmap.copyPixelsFromBuffer(ByteBuffer.wrap(data));

    // Step 3: draw the bitmap
    imageView.post(new Runnable() {

        @Override
        public void run(){    
            imageView.invalidate();       
        }
    });
}

你只能在创建Bitmap时调用setImageBitmap(mBitmap)并避免每次都调用它,但是,ImageView需要知道它必须重绘自己,你可以通过调用invalidate()