1
no1xsyzy 2021 年 2 月 25 日
随便地搜索了一下,看到这个:
//注意这儿有个坑,ARGBToI420 内存顺序是 BGRA //BGRAToI420 内存顺序是 ARGB 不知道是否有关 |
3
darer 2021 年 2 月 25 日
只是说数据不对也判断不出是什么问题吧
还是再补充一些信息吧 |
4
AX5N 2021 年 2 月 25 日
你把 argb 映射到 srgb 了吗
|
5
fengwei23 OP @darer #3 确实是这样的,但是我不是很好描述
``` Image image = reader.acquireLatestImage(); if (image != null) { Image.Plane[] planes = image.getPlanes(); Image.Plane plane = planes[0]; ByteBuffer buffer = plane.getBuffer(); byte[] bytes = new byte[buffer.remaining()]; buffer.get(bytes, 0, bytes.length); if (mDataThread != null) { mDataThread.addData(bytes); } image.close(); } ``` 上面是我从 image 中取出来的数据,然后把这个数据送给的 libyuv 去转换的,iamgereader 用的是 PixelFormat.RGBA_8888,libyuv 用的是 ABGRToI420 |
7
AX5N 2021 年 2 月 25 日
@fengwei23 没在手机上开发过这些东西,但我觉得就是色域的问题。
理论上你应该声明 2 次,一次是转成 yuv 的时候,一次是转回 rgb 的时候。如果你不清楚你这个解码器的工作原理,那你最好直接转成 srgb 一劳永逸,缺点是会压缩色彩空间。如果你编码解码都是自己负责,那你可以自己捣鼓下相关参数。 |
8
qieqie 2021 年 2 月 25 日
这个代码意思是取 Y 平面然后清空,然后转换?
地铁老人看手机.jpg |
9
qieqie 2021 年 2 月 25 日
看上去你这样只是拿到了一个灰度图
|
10
LouisLiu 2021 年 2 月 25 日
Android 读取的 argb8888 是大端对齐,而 c/c++对应的是 abgr,例如 libyuv::ABGRToI420
|
11
newmlp 2021 年 2 月 25 日
argb 顺序不对,用过 libyuv 的基本都踩过这个坑
|
12
elonmask 2021 年 2 月 25 日
改 renderscript 吧
|
13
rabbitknight 2021 年 3 月 8 日
imagereader 可以直接获取 YUV420_888 数据。然后拿 libyuv::Android420ToI420 转换。
rgb<->yuv 转换资源消耗太大了。 |
14
fengwei23 OP @rabbitknight #13 我是用 Mediaprojection 来配合使用的,YUV420_888 这种格式使用的时候显示不支持
|