V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fengwei23
V2EX  ›  Android

请教一下 libyuv 转换问题

  •  
  •   fengwei23 · 2021-02-25 11:45:43 +08:00 via Android · 8991 次点击
    这是一个创建于 1367 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我在 Android 使用 imagereader 读出来的 argb8888 的数据,然后使用 libyuv 中的 argbtoi420 去转换成 yuv420p,存下来的数据怎么都不对,但是我把 argb8888 的数据存为 bitmap 再转换为 jpeg,打开就是正确的
    第 1 条附言  ·  2021-02-26 18:06:49 +08:00
    搞定了,确实大小端的问题
    14 条回复    2021-03-08 15:46:24 +08:00
    no1xsyzy
        1
    no1xsyzy  
       2021-02-25 12:22:07 +08:00
    随便地搜索了一下,看到这个:

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

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