第一次接触Camera 绘制实时帧,关于onpreviewframe,不回调的问题

class MyCamera implements PreviewCallback
	{

		@SuppressLint("NewApi")
		@Override
		public void onPreviewFrame(byte[] data, Camera camera)
		{

			Camera.Parameters ps = camera.getParameters();
			int[] imgs = new int[ps.getPreviewSize().width * ps.getPreviewSize().height];

			try
			{
				Log.i("tyty", ps.getPreviewSize().width + "=====" + ps.getPreviewSize().height);
				//doyouself
			}
			catch (Exception e)
			{
				Log.i("tyty", "Exception new bmp" + e.toString());
				return;
			}
			if (bmp != null)
			{

				Canvas canvas = surfaceHolder.lockCanvas();
				try
				{
					if (canvas != null)
					{
						Log.i("tyty", "bmp已画图");
						canvas.drawBitmap(bmp, 0, 0, null);
					}
				}
				catch (Exception e)
				{
					Log.i("tyty", "Exception draw bmp" + e.toString());
				}
				finally
				{
					if (canvas != null)
					{
						surfaceHolder.unlockCanvasAndPost(canvas);
					}

				}
			}
			 camera.addCallbackBuffer(data);
	
			 Log.i("tyty", "回调");
		}

	}

第一次写一个关于摄像头的需求,所以大部分都是参照安卓讲义上面写的,要处理实时的帧数,就要一个PreviewCallback的回调。不多说上代码保存笔记。

camera = Camera.open(0);
		camera.setDisplayOrientation(90);
		Camera.Parameters parameters = camera.getParameters();
		MediaActionSound actionSound = new MediaActionSound();
		
		parameters.setPreviewSize(720, 1280);
		parameters.setPreviewFpsRange(4, 10);
		parameters.setPictureFormat(ImageFormat.JPEG);
		parameters.set("jpeg-quelity", 85);
		parameters.setPictureSize(720, 1280);
		if (parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE))
		{
			parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
		}
		int[] textures = new int[1];
		GLES20.glGenTextures(1, textures, 0);
		surfaceTexture = new SurfaceTexture(textures[0]);
		try
		{
			camera.setPreviewTexture(surfaceTexture);
			camera.setPreviewCallback(new MyCamera());
			camera.startPreview();
		}
		catch (IOException e)
		{
			Log.i("tyty", e.toString());


			e.printStackTrace();
		}

上面的代码片段是初始化摄像头,没有什么好多说的,一般是注意一些属性照写。

class MyCamera implements PreviewCallback
	{

		@SuppressLint("NewApi")
		@Override
		public void onPreviewFrame(byte[] data, Camera camera)
		{

			Camera.Parameters ps = camera.getParameters();
			int[] imgs = new int[ps.getPreviewSize().width * ps.getPreviewSize().height];

			try
			{
				Log.i("tyty", ps.getPreviewSize().width + "=====" + ps.getPreviewSize().height);
				//doyouself
			}
			catch (Exception e)
			{
				Log.i("tyty", "Exception new bmp" + e.toString());
				return;
			}
			
			 camera.addCallbackBuffer(data);
	
			 Log.i("tyty", "回调");
		}

	}

本以为这样写,就可以了,但是发现onpreviewframe这个方法只会被调用5-8次之间,然后再不会被调用,这就揪心啦,实时帧肯定是要不断更新的,那为什么调用几次之后会被停下来呢?找了很多朋友求解答,可能是我表达的不够准确,也没有把问题给解决了。后面我也去csdn发帖了,非常感谢 birdsaction 版主给我的灵感,之后我去andriod官网去查了一下,对setPreviewCallback的描述是保持preview活跃,onpreviewframe就会一直被callback。

这样想,那只要有方法设置preview活跃就行了?

然后我用setPreviewTexture试了一下,没有想到可以了。虽然找不出官方的解释,也只能对这样做就解决问题进行脑补了。。。。。

onpreviewframe里面添加setPreviewTexture,把 原来的texture设置进去就ok了。

菜鸟耗时一天才找到问题所在,唉。。。著文留念 顺便下班回家。


你可能感兴趣的:(android)