请教一下 libyuv 转换问题

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

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

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