作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我实际上正在从事一个基于相机的项目。我正在队列中添加来自相机的 onPreviewFrame 预览帧,我将其返回到正在运行的线程中以在 SurfaceView 中处理和绘制它。 (我的目标是通过网络发送它)。
我的问题是 BitmapFactory.decodeByteArray() 函数在我的自定义线程上非常慢,但在 UI 线程 上工作得很好:
这很好用:
private void drawFromThread(final byte[] data) {
size = mCamera.getPreviewSize();
YuvImage yuvimage;
yuvimage = new YuvImage(data, ImageFormat.NV21, size.width,size.height, null);
ByteArrayOutputStream baos;
baos = new ByteArrayOutputStream();
yuvimage.compressToJpeg(new Rect(0, 0, size.width, size.height), 10,baos);
final byte[] jdata = baos.toByteArray();
((Activity)context).runOnUiThread(new Runnable(){
@Override
public void run() {
Bitmap bmp;
bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length);
Canvas canvas = contactView.getHolder().lockCanvas();
canvas.drawBitmap(bmp, 0, 0, null);
contactView.getHolder().unlockCanvasAndPost(canvas);
}
});
}
但这真的很慢:
private void drawFromThread(final byte[] data) {
size = mCamera.getPreviewSize();
YuvImage yuvimage;
yuvimage = new YuvImage(data, ImageFormat.NV21, size.width,
size.height, null);
ByteArrayOutputStream baos;
baos = new ByteArrayOutputStream();
yuvimage.compressToJpeg(new Rect(0, 0, size.width, size.height), 10,
baos);
final byte[] jdata = baos.toByteArray();
Bitmap bmp;
bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length);
Canvas canvas = contactView.getHolder().lockCanvas();
canvas.drawBitmap(bmp, 0, 0, null);
contactView.getHolder().unlockCanvasAndPost(canvas);
}
我用谷歌搜索了很多,但没有找到有同样问题的人。
我知道有最有效的方法来使用相机和 SurfaceView,我有另一个 SurfaceView 用于以“标准方式”显示我的相机帧。但我正在尝试模拟从网络获取的帧并将其绘制在 SurfaceView 上。
感谢您的宝贵时间。
最佳答案
我找到了问题的根源。我正在将我的相机预览帧从 Ui 线程推送到队列中。我从另一个线程的队列中检索的帧。问题在于,Ui 线程每秒向队列中推送的帧数超过了其他线程每秒可以处理的帧数。在 Ui 线程上执行decodeByteArray 会减慢速度,这可以让其他线程有时间绘制我的位图。我改变了我正在使用的队列类型以使其更快,并且仍然尝试找到一种在我的线程中更快渲染的方法。如果有人有建议,我会采纳。
关于java - Android的decodeByteArray在自己的线程上非常慢,但在UI线程上却不是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31545438/
我是一名优秀的程序员,十分优秀!