gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:02:38 24 4
gpt4 key购买 nike

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

现在,我以这种方式绘制每一帧(假设宽度 = 1280 和高度 = 720,数据 是我的 byte[] 包含框架,imageView 是我的 ImageView 容器)

// 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);
}
});

一切正常,没问题。但是我有很多 GC,我真的不喜欢每次都为每个相同大小的帧创建一个新的 Bitmap!所以我需要知道如何优化我的帧渲染?我知道我只能第一次调用 createBitmap 然后只使用 copyPixelsFromBuffer 来填充它(即使它制作了一个副本而且我不喜欢它但它更好) .我想到了一个直观的解决方案,但我不知道是否可行:

如果我第一次创建和绘制一个 Bitmap,然后我从 imageView 中检索对像素的引用并修改它,或者直接修改它,或者给我的 数据作为引用?我搜索了 DrawingCache 但没有找到解决方案。

否则,有没有比这段代码做得更好的想法(更好的意思是内存友好和更快)?问题是:快速更新我的 imageView 提供我已经解码的 byte[] 数据(对于每一帧)的最佳方法是什么。


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

最佳答案

您可以仅在需要时创建位图,如果它为空或大小不合适

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()

关于android - 如何在视频渲染案例中使用 ImageView 进行高效处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39231711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com