Android设备调用摄像头采集数据时,Camera对象通过setPreviewCallback
(Camera.PreviewCallback callback)函数,在onPreviewFrame(byte[] data,Camera camera)中回调采集的数据。采集到的数据格式和camera的参数配置有关,一般在打开摄像头预览之前,camera对象要进行一系列的配置,其中包括参数配置,camera.getParameters摄像头的parameter对象,再通过parameter对象配置参数,而onPreviewFrame()回调的数据格式就是通过parameter.setPreviewFormat(int format)配置的,通过调用ImageFormat的静态属性进行配置,一般我们会配置为NV21的格式。NV21是一种YUV图片格式,YUV格式因为数据排列等不同又分为NV21/NV12等很多格式。详细请查阅YUV格式详解,这里不为YUV原理作论述。

配置完成后,onPreviewFrame(byte[] data,Camera camera)中回调的data就是NV21格式的数据了,现在需要进行转换首先,我们来看看如何将NV21转换为NV12(YUV-420SP):

public static 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];    }}

以上代码实现了NV21到NV12的转换,很多时候在进行视频采集,通过MediaCodec进行H264硬编码的时候,会进行这样的转换。

然后就是NV12转成YUV420P格式了。网上的YUV播放工具,很多不支持NV12的格式,所以我们需要进行转换才能播放。比如我们需要直接通过操作YUV,作视频叠加等,那肯定需要进行效果预览,所以,叠加后,转换成YUV420P格式,就可以通过YUV工具预览效果了。网上的NV12转换为YUV420P,我在查阅的时候只找到了C语言的。对于很多没有C语言基础的小伙伴,不是很友好,下面贴上JAVA的转换代码:

public static void NV12ToYuv420P(byte[] nv12,byte[] yuv420p,int width,int height) {int ySize = width * height;int i, j;//yfor (i =0; i < ySize; i++) {yuv420p[i] = nv12[i];}//ui =0;for (j =0; j < ySize /2; j +=2) {yuv420p[ySize + i] = nv12[ySize + j];i++;}//vi =0;for (j =1; j < ySize /2; j+=2) {yuv420p[ySize *5 /4 + i] = nv12[ySize + j];i++;    }}

更多相关文章

  1. Android(安卓)Studio从零开始安装
  2. Android百度地图将经纬度转换为地址信息
  3. 在ubuntu操作系统下配置android开发环境
  4. Android(安卓)- AndroidStudio的下载、安装与配置
  5. Android(安卓)怎么把异常的StackTrace信息格式化为String
  6. Android(安卓)如何在strings.xml中放置html文本
  7. Android平台使用MediaCodec进行H264格式的视频编解码
  8. Android(安卓)文件系统的权限设置
  9. MTK Android(安卓)Driver知识大全

随机推荐

  1. Android(安卓)EditText常用技能,包括clear
  2. Coroutines in Android - One Shot and M
  3. -用Gradle 构建你的android程序
  4. Android(安卓)使用Stetho在Chrome浏览器
  5. 把TextView中的文字添加阴影效果及Style
  6. Android中的?attr/和?android:attr/
  7. React Native在Android当中代码集成
  8. PullToRefreshListView怎么设置各个item
  9. Android开发从零开始视频教程
  10. Android-沉浸式布局的玩法