请教一下 libyuv 转换问题

我在 Android 使用 imagereader 读出来的 argb8888 的数据,然后使用 libyuv 中的 argbtoi420 去转换成 yuv420p,存下来的数据怎么都不对,但是我把 argb8888 的数据存为 bitmap 再转换为 jpeg,打开就是正确的
第 1 条附言  ·  26 天前

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