android 将Bitmap转YUV420sp(实例)
16lz
2021-01-25
/** * 将bitmap里得到的argb数据转成yuv420sp格式 * 这个yuv420sp数据就可以直接传给MediaCodec,通过AvcEncoder间接进行编码 * @param yuv420sp 用来存放yuv429sp数据 * @param argb 传入argb数据 * @param width 图片width * @param height 图片height */ public static void encodeYUV420SP(byte[] yuv420sp, int[] argb, int width, int height) { final int frameSize = width * height; int yIndex = 0; int uvIndex = frameSize; int a, R, G, B, Y, U, V; int index = 0; for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { a = (argb[index] & 0xff000000) >> 24; // a is not used obviously R = (argb[index] & 0xff0000) >> 16; G = (argb[index] & 0xff00) >> 8; B = (argb[index] & 0xff) >> 0; // well known RGB to YUV algorithm Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16; U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128; V = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128; // NV21 has a plane of Y and interleaved planes of VU each sampled by a factor of 2 // meaning for every 4 Y pixels there are 1 V and 1 U. Note the sampling is every other // pixel AND every other scanline. yuv420sp[yIndex++] = (byte) ((Y < 0) ? 0 : ((Y > 255) ? 255 : Y)); if (j % 2 == 0 && index % 2 == 0) { yuv420sp[uvIndex++] = (byte)((V<0) ? 0 : ((V > 255) ? 255 : V)); yuv420sp[uvIndex++] = (byte)((U<0) ? 0 : ((U > 255) ? 255 : U)); } index ++; } } }
更多相关文章
- “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
- Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
- 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
- 【30篇突击 android】源码统计 十七
- android json数据传递时编码格式的转换
- android BannerView实现自动轮播广告的用法(参考自github)
- Android接收/发送jSON数据
- Android用户登录数据存储的三种方式
- android 播放网络或本地gif格式的动态图片