Android 为了在JNI中使用它,我如何从相机获取GLTexture?
我曾尝试使用camera在JNI中开发基于OpenGLES的应用程序。但通过显示结果,我意识到相机的分辨率和纵横比以及GLTexture的分辨率是不同的。我将相机分辨率和GLtexture都设置为VGA(640*480)Android 为了在JNI中使用它,我如何从相机获取GLTexture?,android,opengl-es,java-native-interface,android-camera,Android,Opengl Es,Java Native Interface,Android Camera,我曾尝试使用camera在JNI中开发基于OpenGLES的应用程序。但通过显示结果,我意识到相机的分辨率和纵横比以及GLTexture的分辨率是不同的。我将相机分辨率和GLtexture都设置为VGA(640*480) public类MainRenderer实现GLSurfaceView.Renderer, SurfacetTexture.OnFrameAvailableListener{ ... @凌驾 已创建曲面上的公共void(GL10 gl、EGLConfig配置){ ////摄像机/
public类MainRenderer实现GLSurfaceView.Renderer,
SurfacetTexture.OnFrameAvailableListener{
...
@凌驾
已创建曲面上的公共void(GL10 gl、EGLConfig配置){
////摄像机////////////////////////////////////
int=0;
int numofCamera=Camera.getNumberOfCameras();
camerRainfo camerRainfo=新的camerRainfo();
对于(int i=0;i 对于(int i=0;iThe SurfaceTexture构造函数将一个GLES纹理名称,即一个整数,作为参数。您不配置SurfaceTexture的大小;它接受传递给它的任何内容并将其转换为GLES纹理。不确定JNIpr.init()是什么
调用完成或预期完成。另外,请记住图片大小和预览大小是独立的。@fadden那么我如何在jni中使用具有相同分辨率的摄影机图像流??GLES纹理具有与摄影机图像相同的分辨率(根据定义…不复制或操纵图像数据)。您需要配置相机以生成与显示匹配的宽高比预览图像(这在所有设备上都不可能),或将您的显示修改为信箱或柱形框以显示输出。您正在配置图片大小,但未配置预览大小,而且似乎预览不匹配。@fadden非常感谢:)您的评论对我有用
public class MainRenderer implements GLSurfaceView.Renderer,
SurfaceTexture.OnFrameAvailableListener {
...
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// ///////////////////// Camera ////////////////////////////////////
int cameraid = 0;
int numofCamera = Camera.getNumberOfCameras();
CameraInfo cameraInfo = new CameraInfo();
for (int i = 0; i < numofCamera; i++) {
Camera.getCameraInfo(i, cameraInfo);
if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK/* CAMERA_FACING_FRONT */) {
cameraid = i;
}
}
// ///////////////////// Camera ////////////////////////////////////
mSurfaceTexture = new SurfaceTexture(JNIpr.init(tWidth, tHeight)); //resolution : 640,480
mSurfaceTexture.setOnFrameAvailableListener(this);
mCamera = Camera.open(cameraid);
mCamera.stopPreview();
//set camera to continually auto-focus
Camera.Parameters params = mCamera.getParameters();
params.setFocusMode(Parameters.FOCUS_MODE_AUTO);
//some more settings
List sizes = params.getSupportedPictureSizes();
Camera.Size result = null;
Camera.Size camSizeVGA = null;
for (int i=0;i<sizes.size();i++){
result = (Size) sizes.get(i);
Log.i("msg", "Supported Size. Width: " + result.width + "height : " + result.height);
if(result.width==640 && result.height==480)
{
camSizeVGA = result;
}
}
//set camera resolution
params.setPictureSize(camSizeVGA.width, camSizeVGA.height);
mCamera.setParameters(params);
mCamera.startPreview();
try {
mCamera.setPreviewTexture(mSurfaceTexture);
} catch (IOException ioe) {
}
}
@Override
public synchronized void onFrameAvailable(SurfaceTexture surfaceTexture) {
mUpdateSurfaceTexture = true;
mView.requestRender();
}
@Override
public void onDrawFrame(GL10 gl) {
synchronized (this) {
if (mUpdateSurfaceTexture) {
mSurfaceTexture.updateTexImage();
mUpdateSurfaceTexture = false;
}
}
long start = System.currentTimeMillis();
pTime = JNIpr.render(filterID); // filterID : 0
GLES20.glFinish();
// ////////////////////////////////////
long end = System.currentTimeMillis();
}
}