NV21 旋转+转为NV12

NV21 旋转+转为NV12yuv420sp的分两种,nv21和nv12。Android取摄像头中的数据,当使用camera1.0时,onPreviewFrame返回的数据yuv420sp的nv21,并且camera中取出的数据显示时是偏转的,需要将其旋转顺时针旋转270或逆时针旋转90,注:旋转后宽高对调/***此处为顺时针旋转270*@paramdata旋转前的数据*@paramima…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

yuv420sp的分两种,nv21和nv12。Android 取摄像头中的数据 ,当使用camera1.0 时,onPreviewFrame返回的数据yuv420sp的nv21,并且camera中取出的数据显示时是偏转的,需要将其旋转顺时针旋转270或逆时针旋转90,注:旋转后宽高对调

/**
 * 此处为顺时针旋转270
 * @param data 旋转前的数据
 * @param imageWidth 旋转前数据的宽
 * @param imageHeight 旋转前数据的高
 * @return 旋转后的数据
 */
private byte[] rotateYUV420Degree270(byte[] data, int imageWidth, int imageHeight){

    byte[] yuv =new byte[imageWidth*imageHeight*3/2];

    // Rotate the Y luma

    int i =0;

    for(int x = imageWidth-1;x >=0;x--){

        for(int y =0;y < imageHeight;y++){

            yuv[i]= data[y*imageWidth+x];
            i++;

        }
    }// Rotate the U and V color components
    i = imageWidth*imageHeight;

    for(int x = imageWidth-1;x >0;x=x-2){

        for(int y =0;y < imageHeight/2;y++){
            yuv[i]= data[(imageWidth*imageHeight)+(y*imageWidth)+(x-1)];
            i++;
            yuv[i]= data[(imageWidth*imageHeight)+(y*imageWidth)+x];
            i++;

        }

    }

    return yuv;

}
/**
 * 此处为顺时针旋转旋转90度
 * @param data 旋转前的数据
 * @param imageWidth 旋转前数据的宽
 * @param imageHeight 旋转前数据的高
 * @return 旋转后的数据
 */
private byte[] rotateYUV420Degree90(byte[] data, int imageWidth, int imageHeight)
{
    byte [] yuv = new byte[imageWidth*imageHeight*3/2];
    // Rotate the Y luma
    int i = 0;
    for(int x = 0;x < imageWidth;x++)
    {
        for(int y = imageHeight-1;y >= 0;y--)
        {
            yuv[i] = data[y*imageWidth+x];
            i++;
        }
    }
    // Rotate the U and V color components
    i = imageWidth*imageHeight*3/2-1;
    for(int x = imageWidth-1;x > 0;x=x-2)
    {
        for(int y = 0;y < imageHeight/2;y++)
        {
            yuv[i] = data[(imageWidth*imageHeight)+(y*imageWidth)+x];
            i--;
            yuv[i] = data[(imageWidth*imageHeight)+(y*imageWidth)+(x-1)];
            i--;
        }
    }
    return yuv;
}

顺时针旋转180度

private byte[] rotateYUV420Degree180(byte[] data, int imageWidth, int imageHeight){

    byte[] yuv =new byte[imageWidth*imageHeight*3/2];

    int i =0;int count =0;

    for(i = imageWidth * imageHeight -1; i >=0; i--){
        yuv[count]= data[i];
        count++;}

    i = imageWidth * imageHeight *3/2-1;for(i = imageWidth * imageHeight *3/2-1; i >= imageWidth
            * imageHeight; i -=2){
        yuv[count++]= data[i -1];
        yuv[count++]= data[i]; 
    }return yuv;
}

用mediacode编码h264时,因为mediacode编码视频只支持yuv420sp的nv12,需要将nv21转为nv12

private void NV21ToNV12(byte[] nv21,byte[] nv12,int width,int height){
    if(nv21 == null || nv12 == null)return;
    int framesize = width*height;
    int i = 0,j = 0;
    System.arraycopy(nv21, 0, nv12, 0, framesize);
    for(i = 0; i < framesize; i++){
        nv12[i] = nv21[i];
    }
    for (j = 0; j < framesize/2; j+=2)
    {
        nv12[framesize + j-1] = nv21[j+framesize];
    }
    for (j = 0; j < framesize/2; j+=2)
    {
        nv12[framesize + j] = nv21[j+framesize-1];
    }
}

 

 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/193198.html原文链接:https://javaforall.net

(0)
上一篇 2025年11月30日 上午9:43
下一篇 2025年11月30日 上午10:15


相关推荐

  • MessageDigest的功能及用法(加密解密)

    MessageDigest的功能及用法(加密解密)MessageDigest的功能及用法MessageDigest类为应用程序提供信息摘要算法的功能,如MD5或SHA算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度

    2022年7月1日
    34
  • 90天蜕变!我的大模型入门项目管理计划,保姆级教程免费送!一个普通人的90天学习路线图

    90天蜕变!我的大模型入门项目管理计划,保姆级教程免费送!一个普通人的90天学习路线图

    2026年3月15日
    2
  • JSP简明教程「建议收藏」

    1、jsp是什么?1)jsp:javaserverpages2)jsp运行在服务器3)jsp的基础是servlet,相当于对servlet进行一个包装4)jsp无需配置,直接使用,如果修改了jsp文件,不需要重新reloadweb应用5)jsp访问方法:http://ip:8080/web应用名/jsp路径6)jsp是一种动态网页技术2、JSP=html+java片段+JSP标签(语法)+j

    2022年4月16日
    55
  • 迭代阈值法

    迭代阈值法通过迭代方法选择阈值 计算方法如下 1 选择灰度图的平均值作为初始阈值 T0 2 计算小于等于 T0 的平均值 T1 和大于 T0 的平均值 T2 3 新的阈值为 T T1 T2 2 4 比较 T 和 T0 若相等 则返回 T 即为迭代阈值 否则 T0 T 重复 1 3

    2026年3月26日
    2
  • ms17010复现

    ms17010复现关于漏洞的复现干多了就发现,这种菜鸟级别的复现,,真是没有啥实用性,主要就是,自己玩玩,,,唉,,  ms17_010,好像跟什么永恒之蓝,勒索病毒有啥关系。但是,我这种小白可管不着,而且现在做的所有的复现都是基于防火墙关闭,所以,没有啥技术,复现也白复现。。。。 好了,还是讲复现: 搜索:search17_010很容易看出来,这个第一个方法是搜索网段中主机漏洞的,

    2022年6月6日
    58
  • networkx教程

    networkx教程创建一个图创建一个没有节点和边的空图 importnetwor nx Graph 根据定义 a nbsp Graph 是节点 顶点 的集合以及确定的节点对 称为边 链接等 在 NetworkX 中 节点可以是任何可哈希对象 例如文本字符串 图像 XML 对象 另一个 Graph 自定义节点对象等 节点该图 G 可以以几种方式生长 NetworkX 包含许多图形生成器功能和设施 以多种格式读取和写

    2025年8月30日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号