【Android】VSVideoFrame相机视频帧传native处理接口
来源:互联网 发布:nars卷笔刀替代知乎 编辑:程序博客网 时间:2024/05/16 01:23
package com.visionin.core;import android.content.res.Configuration;import android.graphics.SurfaceTexture;import android.os.Handler;import android.os.HandlerThread;import android.os.Message;import android.util.Log;import android.view.Surface;import com.visionin.Visionin;import com.visionin.gpu.GPU;import android.content.res.AssetManager;/** * Created by Visionin on 16/7/18. */public class VSVideoFrame extends GPU implements SurfaceTexture.OnFrameAvailableListener {// public static VSVideoFrame shareInstance; public final static int CAMERA_FACING_BACK = 0; public final static int CAMERA_FACING_FRONT = 1; public final static int GPU_UNKNOWN = 0; public final static int GPU_RGBA = 1; public final static int GPU_NV21 = 2; // yyyyvuvu public final static int GPU_YUV420P = 3; // yyyyyuuvv public final static int GPU_YV12 = 4; // yyyyyvvuu public final static int GPU_YUV444 = 5; // yuvyuvyuv public final static int GPU_NV12 = 6; // yyyyyuvuv public final static int GPU_BGRA = 7; // gpu处理模式,处理surfaceTexture模式或者bytes模式 public final static int GPU_RPOCESS_TEXTURE = 0; public final static int GPU_PROCESS_BYTES = 1; protected boolean running = false; protected int textureId = -1; protected int oldId=-1; protected SurfaceTexture surfaceTexture; // 输出处理后像素 protected byte[] outputBytes = null; // 获取处理后像素回调 protected VSRawBytesCallback rawBytesCallback = null; private AssetManager assetManager; private boolean isProcessing=false; private boolean isProcessingByte=false; public VSVideoFrame(Surface surface) throws Exception { super(surface); } /** * 开始处理 * @return */ public boolean start(/*AssetManager assetManager*/) { if (running){ Log.e(Visionin.TAG, "Visionin Process is Running!"); return false; }else{ running = true; return true; } } /** * 结束处理 * @return */ public boolean stop(){ if (!running){ Log.e(Visionin.TAG, "Visionin Process isn't Running!"); return false; } running = false; while(isProcessing || isProcessingByte){ try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } return true; } public void processBytes(byte[] bytes, int width, int height, int format){ if (!running){ Log.e(Visionin.TAG, "Visionin Process is not Running! Please call start first"); return; } if(isProcessingByte){ return; } isProcessingByte=true; super.processBytes(bytes, width, height, format); if (rawBytesCallback!=null){ getBytes(outputBytes); rawBytesCallback.outputBytes(outputBytes); } isProcessingByte=false; } public SurfaceTexture surfaceTexture(){ makeCurrent(); if(textureId>0){ oldId=textureId; surfaceTexture=null; } textureId = createTexture(); surfaceTexture = new SurfaceTexture(textureId); surfaceTexture.setOnFrameAvailableListener(this); if(oldId>0){ destroySurfaceTexture(oldId); } return surfaceTexture; } @Override public void onFrameAvailable(SurfaceTexture surfaceTexture) { if (!running){ return; } if(isProcessing){ return; } isProcessing=true; this.makeCurrent(); surfaceTexture.updateTexImage(); super.processTexture(textureId); if (rawBytesCallback!=null) { getBytes(outputBytes); rawBytesCallback.outputBytes(outputBytes); } isProcessing=false; } protected int cameraPosition = CAMERA_FACING_BACK; /** * 设置前后相机 * @param position */ public void setCameraPosition(int position){ cameraPosition = position; if (position == CAMERA_FACING_FRONT){ super.setOutputMirror(this.mirrorFrontVideo); super.setPreviewMirror(this.mirrorFrontPreview); } else{ super.setOutputMirror(this.mirrorBackVideo); super.setPreviewMirror(this.mirrorBackPreview); } setOutputImageOritation(outputImageOritation); } protected int outputImageOritation = Configuration.ORIENTATION_PORTRAIT; /** * 设置Surface显示方向 * @param outputImageOritation */ public void setOutputImageOritation(int outputImageOritation){ this.outputImageOritation = outputImageOritation; //TODO: 前摄像头默认就是带镜像的,后摄像头默认不带镜像,但是经过left旋转后带了镜像,暂时没查出原因 if (outputImageOritation==Configuration.ORIENTATION_PORTRAIT){ if (cameraPosition==CAMERA_FACING_FRONT) { super.setInputRotation(GPURotateRightFlipVertical); } else{ super.setInputRotation(GPURotateRightFlipHorizontal); } } else{ //super.setInputRotation(GPUFlipVertical); super.setInputRotation(GPUNoRotation); } setVideoSize(videoWidth, videoHeight); } protected int videoWidth = 0; protected int videoHeight = 0; /** * 设置视频帧尺寸,VisioninSDK会根据图片旋转做调整,Surface方向显示放在Size设置之前 * @param width * @param height */ public void setVideoSize(int width, int height){ videoWidth = width; videoHeight = height; if (outputImageOritation==Configuration.ORIENTATION_PORTRAIT) { super.setInputSize(height, width); } else{ super.setInputSize(width, height); } } /** * 设置输出尺寸及输出格式 */ protected int outputWidth = 0; protected int outputHeight = 0 ; protected int outputFormat = GPU_UNKNOWN; public void setOutputSize(int width, int height){ outputWidth = width; outputHeight = height; super.setOutputSize(width, height); setOutputFormat(outputFormat); } protected void setOutputFormat(int format){ int size = 0; outputFormat = format; if (outputFormat!=GPU_UNKNOWN){ super.setOutputFormat(format); } if (format==GPU_YUV420P || format==GPU_YV12 || format== GPU_NV21){ if (outputWidth==0 || outputHeight==0){ size = videoHeight*videoWidth*3/2; } else{ size = outputWidth*outputHeight*3/2; } } else if (format == GPU_RGBA){ if (outputWidth==0 || outputHeight==0){ size = videoHeight*videoWidth*4; } else{ size = outputWidth*outputHeight*4; } } if (outputFormat!= GPU_UNKNOWN && (outputBytes==null || outputBytes.length<size)){ outputBytes = new byte[size]; } } public void setRGBACallback(VSRawBytesCallback rgbaCallback){ this.rawBytesCallback = rgbaCallback; setOutputFormat(GPU_RGBA); } /** * 获取处理后的I420格式视频帧数据 * @param yuv420Callback */ public void setYuv420PCallback(VSRawBytesCallback yuv420Callback){ this.rawBytesCallback = yuv420Callback; setOutputFormat(GPU_YUV420P); } /** * 获取处理后的NV21格式视频帧数据 * @param nv21Callback */ public void setNV21Callback(VSRawBytesCallback nv21Callback){ this.rawBytesCallback = nv21Callback; setOutputFormat(GPU_NV21); } /** * 获取处理后的NV12格式视频帧数据 * @param nv12Callback */ public void setNV12Callback(VSRawBytesCallback nv12Callback){ this.rawBytesCallback = nv12Callback; setOutputFormat(GPU_NV12); } /** * 设置镜像 */ protected boolean mirrorFrontVideo = false; protected boolean mirrorBackVideo = false; protected boolean mirrorFrontPreview = false; protected boolean mirrorBackPreview = false; //TODO: 前摄像头默认就是带镜像的,后摄像头默认不带镜像,但是经过left旋转后带了镜像,暂时没查出原因 public void setMirrorFrontVideo(boolean mirrorFrontVideo) { this.mirrorFrontVideo = mirrorFrontVideo; if(this.cameraPosition == CAMERA_FACING_FRONT) { super.setOutputMirror(this.mirrorFrontVideo); } } public void setMirrorFrontPreview(boolean mirrorFrontPreview) { this.mirrorFrontPreview = mirrorFrontPreview; if(this.cameraPosition == CAMERA_FACING_FRONT) { super.setPreviewMirror(this.mirrorFrontPreview); } } public void setMirrorBackVideo(boolean mirrorBackVideo) { this.mirrorBackVideo = mirrorBackVideo; if(this.cameraPosition == CAMERA_FACING_BACK) { super.setOutputMirror(this.mirrorBackVideo); } } public void setMirrorBackPreview(boolean mirrorBackPreview) { this.mirrorBackPreview = mirrorBackPreview; if(this.cameraPosition == CAMERA_FACING_BACK) { super.setPreviewMirror(this.mirrorBackPreview); } } public void destroySurfaceTexture(int texture){ if(texture>0){ destroyTexture(texture); } } public void destroy(){ makeCurrent(); destroySurfaceTexture(textureId); if(surfaceTexture!=null){ surfaceTexture=null; } destroyEGL(mEGLContext); } public static final int GPUNoRotation = 0; public static final int GPURotateLeft = 1; public static final int GPURotateRight = 2; public static final int GPUFlipVertical = 3; public static final int GPUFlipHorizonal = 4; public static final int GPURotateRightFlipVertical = 5; public static final int GPURotateRightFlipHorizontal = 6; public static final int GPURotate180 = 7; // 滤镜 public static final String VS_GAUSSIAN_BLUR_FILTER = "GaussianBlur"; // 高斯模糊 public static final String VS_MEDIAN_BLUR_FILTER = "MedianBlur"; // 中值滤波 public static final String VS_FROSTED_BLUR_FILTER = "FrostedBlur"; // 毛玻璃效果 public static final String VS_SATURATION_FILTER = "Saturation"; // 饱和度}
0 0
- 【Android】VSVideoFrame相机视频帧传native处理接口
- Android 相机,视频录制
- Android 相机,视频录制
- Android 相机,视频录制
- Android调用相机接口
- Android调用相机接口
- android 相机,图片处理
- React Native调用Android相机图库
- React Native调用Android相机图库
- Android视频处理 --处理视频第一帧缩略图
- Android平台相机接口的应用
- Android调用系统相机、自定义相机、处理大图片
- Android调用系统相机、自定义相机、处理大图片
- Android Native Crash 处理过程
- Android 调用系统相机回调后的处理
- android 视频处理
- Android中视频处理
- android ffmpeg视频处理
- Java编程简单应用———1、HelloWorld(HelloWorld的来源);2、输出个人信息3、输出特殊图案
- http://blog.csdn.net/zjf280441589/article/details/54862696
- ios开发错误之: Undefined symbols for architecture x86_64
- PHP伪静态的几种方法
- 蓝桥01字串
- 【Android】VSVideoFrame相机视频帧传native处理接口
- 秦波|如何基于MySQL及Redis搭建统一的kv存储服务
- C语言小笔记
- ztree简单用法
- python __str__和format方法
- 第一次博客发表
- QPressEvent实现双击ctrl快捷键
- H.264简介
- linux命令详解:df命令