请教一下 libyuv 转换问题

2021-02-25 11:45:43 +08:00
 fengwei23
我在 Android 使用 imagereader 读出来的 argb8888 的数据,然后使用 libyuv 中的 argbtoi420 去转换成 yuv420p,存下来的数据怎么都不对,但是我把 argb8888 的数据存为 bitmap 再转换为 jpeg,打开就是正确的
9621 次点击
所在节点    Android
14 条回复
no1xsyzy
2021-02-25 12:22:07 +08:00
随便地搜索了一下,看到这个:

//注意这儿有个坑,ARGBToI420 内存顺序是 BGRA
//BGRAToI420 内存顺序是 ARGB

不知道是否有关
fengwei23
2021-02-25 13:25:39 +08:00
@no1xsyzy #1 谢谢哈,我也看到这个了,我都试过了,好像还是不行,我在研究一下
darer
2021-02-25 13:32:07 +08:00
只是说数据不对也判断不出是什么问题吧
还是再补充一些信息吧
AX5N
2021-02-25 13:38:27 +08:00
你把 argb 映射到 srgb 了吗
fengwei23
2021-02-25 13:58:11 +08:00
@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
fengwei23
2021-02-25 13:58:30 +08:00
@AX5N #4 没有也,需要这样做吗
AX5N
2021-02-25 14:11:36 +08:00
@fengwei23 没在手机上开发过这些东西,但我觉得就是色域的问题。
理论上你应该声明 2 次,一次是转成 yuv 的时候,一次是转回 rgb 的时候。如果你不清楚你这个解码器的工作原理,那你最好直接转成 srgb 一劳永逸,缺点是会压缩色彩空间。如果你编码解码都是自己负责,那你可以自己捣鼓下相关参数。
qieqie
2021-02-25 14:20:45 +08:00
这个代码意思是取 Y 平面然后清空,然后转换?
地铁老人看手机.jpg
qieqie
2021-02-25 14:23:51 +08:00
看上去你这样只是拿到了一个灰度图
LouisLiu
2021-02-25 14:36:24 +08:00
Android 读取的 argb8888 是大端对齐,而 c/c++对应的是 abgr,例如 libyuv::ABGRToI420
newmlp
2021-02-25 16:24:10 +08:00
argb 顺序不对,用过 libyuv 的基本都踩过这个坑
elonmask
2021-02-25 16:29:19 +08:00
改 renderscript 吧
rabbitknight
2021-03-08 10:33:05 +08:00
imagereader 可以直接获取 YUV420_888 数据。然后拿 libyuv::Android420ToI420 转换。
rgb<->yuv 转换资源消耗太大了。
fengwei23
2021-03-08 15:46:24 +08:00
@rabbitknight #13 我是用 Mediaprojection 来配合使用的,YUV420_888 这种格式使用的时候显示不支持

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/756129

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX