当前位置: 首页 > article >正文

海康IPC接入TRTC时,从海康中获取的数据显示时色差不正确

2021/1

记录海康IPC接入TRTC时的历史日志
 

从海康sdk接口获取数据,进行解码

org.MediaPlayer.PlayM4.Player.T_YV12;
    private void setDecodeCB() {
        Player.getInstance().setDecodeCB(m_iPort, (nPort, data, nDataLen, nWidth, nHeight, nFrameTime, nDataType, arg7) -> {
                if (nDataType == T_YV12 ) {
                    byte[] i420bytes = swapYV12toI420(data, nWidth, nHeight);
                    callback.afterCall(context, i420bytes.length, i420bytes, nWidth, nHeight, nFrameTime);
                }
        });
    }


解码后如下展示的时候,出现图片偏差

    byte[] nv12bytes = RSNV12ToBitmap.getInstance(context).swapI420toNV12(data, nWidth, nHeight);//额外转换 3ms
    Bitmap buffBitmap = RSNV12ToBitmap.getInstance(context).nv12ToBitmap(nv12bytes, nWidth, nHeight);//20毫秒

可能是android.renderscript.ScriptIntrinsicYuvToRGB接受的YUV是nv21而不是nv12

    byte[] nv21bytes = RSNV12ToBitmap.getInstance(context).swapI420toNV21(data, nWidth, nHeight);//额外转换 3ms
    Bitmap buffBitmap = RSNV12ToBitmap.getInstance(context).nv21ToBitmap(nv21bytes, nWidth, nHeight);//20毫秒

图像格式转换函数

package com.sunshine.mhs.pension.doctormodule.trct.ipc.util;

/**
 * 作者:Administrator on 2020/3/26
 * 邮箱:9611153@qq.com
 */

import android.content.Context;
import android.graphics.Bitmap;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicYuvToRGB;
import android.renderscript.Type;

public class RSNV21ToBitmap {
    private static RSNV21ToBitmap instance;
    private RenderScript rs;
    private ScriptIntrinsicYuvToRGB yuvToRgbIntrinsic;
    private byte[] nv21bytes;

    private RSNV21ToBitmap(Context context) {
        nv21bytes = null;
        rs = RenderScript.create(context);
        yuvToRgbIntrinsic = ScriptIntrinsicYuvToRGB.create(rs, Element.U8_4(rs));
    }
    public static RSNV21ToBitmap getInstance(Context context) {
        if (instance == null) {
            instance = new RSNV21ToBitmap( context);
        }
        return instance;
    }
    public static void destory() {
         if (instance != null) {
            instance.yuvToRgbIntrinsic.destroy();
            instance.rs.destroy();
            instance = null;
        }
    }

    public Bitmap nv21ToBitmap(byte[] nv21, int width, int height) {
        if (nv21 == null) return null;

        Type.Builder yuvType, rgbaType;
        Allocation in, out;
        yuvType = new Type.Builder(rs, Element.U8(rs)).setX(nv21.length);
        in = Allocation.createTyped(rs, yuvType.create(), Allocation.USAGE_SCRIPT);
        rgbaType = new Type.Builder(rs, Element.RGBA_8888(rs)).setX(width).setY(height);
        out = Allocation.createTyped(rs, rgbaType.create(), Allocation.USAGE_SCRIPT);

        Bitmap bmpout = null;
        try {
            in.copyFrom(nv21);
            yuvToRgbIntrinsic.setInput(in);
            yuvToRgbIntrinsic.forEach(out);
            bmpout = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
            out.copyTo(bmpout);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return bmpout;
    }

    public byte[] swapI420toNV21(byte[] I420bytes, int width, int height) {
        if (null == nv21bytes) {
            nv21bytes = new byte[I420bytes.length];
        }
        if (I420bytes.length != nv21bytes.length)
            return null;
        int nLenY = width * height;
        int nLenU = nLenY / 4;
        System.arraycopy(I420bytes, 0, nv21bytes, 0, nLenY);
        for (int i = 0; i < nLenU; i++) {
            nv21bytes[nLenY + 2 * i + 1] = I420bytes[nLenY + i];//先v后U
            nv21bytes[nLenY + 2 * i] = I420bytes[nLenY + nLenU + i];
        }
        return nv21bytes;
    }

}


http://www.kler.cn/a/399139.html

相关文章:

  • 前端隐藏元素的方式有哪些?HTML 和 CSS 中隐藏元素的多种方法
  • Vue3 -- 项目配置之eslint【企业级项目配置保姆级教程1】
  • 【MySQL】优化方向+表连接
  • 《生成式 AI》课程 第3講 CODE TASK 任务3:自定义任务的机器人
  • PostgreSQL物化视图详解
  • HMI FUXA测试
  • 使用 PyTorch 实现 AlexNet 进行 MNIST 图像分类
  • 从零开始学习 sg200x 多核开发之 milkv-duo256 编译运行 sophpi
  • Visual Studio 2022 安装
  • RabbitMQ 在 Java 和 Spring Boot 中的应用详解
  • 工厂模式-工厂方法模式实现
  • C语言进阶3:字符串+内存函数
  • Qt 每日面试题 -10
  • Oracle OCP认证考试考点详解082系列19
  • 【微服务】SpringBoot 整合ELK使用详解
  • git入门环境搭建和gui使用
  • 《目标检测》R-CNN网络基础(RCNN,Fast-RCNN)
  • 笔记01----Transformer高效语义分割解码器模块DEPICT(即插即用)
  • 【配置后的基本使用】CMake基础知识
  • opc da 服务器数据 转 IEC61850项目案例
  • 人工智能+辅助诊疗
  • 雨晨 Hotpatch 24H2 Windows 11 iotltsc2024 极简版 26100.2240
  • 十五届蓝桥杯赛题-c/c++ 大学b组
  • R语言机器学习与临床预测模型77--机器学习预测常用R语言包
  • 基于STM32的智能家居系统:MQTT、AT指令、TCP\HTTP、IIC技术
  • CentOS中的Firewalld:全面介绍与实战应用