Android 使用librtmp推流【视频YUV格式转化】

YUV420P,Y,U,V三个分量都是平面格式,分为I420和YV12。在I420格式(即:YUV);但YV12则是相反(即:YVU)。
YUV420SP, Y分量平面格式,UV打包格式, 即NV12。 NV12与NV21类似,U 和 V 交错排列,不同在于UV顺序。
I420: YYYYYYYY UU VV    =>YUV420P
YV12: YYYYYYYY VV UU    =>YUV420P
NV12: YYYYYYYY UVUV     =>YUV420SP
NV21: YYYYYYYY VUVU     =>YUV420SP


Nv21 yuv格式如下:

YYYYYYYY

YYYYYYYY

YYYYYYYY

YYYYYYYY

VUVU

VUVU

VUVU

VUVU


I420格式如下:

YYYYYYYY

YYYYYYYY

YYYYYYYY

YYYYYYYY

UUUU

UUUU

VVVV

VVVV


Yuv420SP(NV12)格式如下:

YYYYYYYY

YYYYYYYY

YYYYYYYY

YYYYYYYY

UVUV

UVUV

UVUV

UVUV


Nv21 转 YUV420P

 /* @param data Nv21数据
     * @param dstData I420(YUV420)数据
     * @param w 宽度
     * @param h 长度
 */
public static void Nv21ToI420(byte[] data, byte[] dstData, int w, int h) {

        int size = w * h;
        // Y 数组前size个字节放置Y的数据
        System.arraycopy(data, 0, dstData, 0, size);
        for (int i = 0; i < size / 4; i++) {
            //U 数组从size开始到size + size/4的范围存放U数据
            dstData[size + i] = data[size + i * 2 + 1]; 
            //V 数组从size + size/4开始到size +size/2的范围存放V数据
            dstData[size + size / 4 + i] = data[size + i * 2];
        }
}


Nv21 转 YUV420SP(Nv12)

/ * 将Nv21数据转换为Yuv420SP数据
     * @param data Nv21数据
     * @param dstData Yuv420sp数据
     * @param w 宽度
     * @param h 高度
 */
public static void Nv21ToYuv420SP(byte[] data, byte[] dstData, int w, int h) {
        int size = w * h;
        // Y 数组前size个字节放置Y的数据
        System.arraycopy(data, 0, dstData, 0, size);

        for (int i = 0; i < size / 4; i++) {
            //U,V 从size开始 源数组与目标数组奇偶数位置置换
            dstData[size + i * 2] = data[size + i * 2 + 1]; //U 
            dstData[size + i * 2 + 1] = data[size + i * 2]; //V

        }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值