问题如标题所示,不知道问题出在那里,能正常出数据,但是画面就是没有,请各位大神指点迷津
代码如下
package com.jiechu.wnd.sl; import android.content.Context; import android.graphics.ImageFormat; import android.graphics.PixelFormat; import android.hardware.Camera; import android.util.Log; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import java.io.IOException; import java.util.List; /** * Created by zhuyt on 2016/10/20. */ public class LiveStreamDisplay extends SurfaceView implements SurfaceHolder.Callback,View.OnTouchListener{ private static String TAG = LiveStreamDisplay.class.getSimpleName(); Camera mCamInance=null; Camera.Parameters mCamPmr = null; PreviewAction mAction; SurfaceHolder mHolder; int displayWidth = 360; int displayHeight = 480; int current_width; int current_height; double iAspectRatio = 3.0/3.0;//设备宽高比 int iDelta = 0x7FFFFF; int current_fps = 25; int current_rate; int current_camera = Camera.CameraInfo.CAMERA_FACING_BACK; String current_video_encode = "H264"; boolean isPreview=false; long mTimestampBegin=0; long mTimestampRec=0; int current_picture_format = ImageFormat.NV21; ListmSupportPreviewSizes; List mSupportPreviewFPSRanges; private byte[] mYuvDataBuff; int iYuvBuffSize = 0; public LiveStreamDisplay(Context context,int pCamNum,int iWidth,int iHeight) { super(context); current_camera = pCamNum>=0?pCamNum: Camera.CameraInfo.CAMERA_FACING_BACK; displayWidth = iWidth>0?iWidth:displayWidth; displayHeight = iHeight>0?iHeight:displayHeight; mHolder = getHolder(); initTouchView(); } public void initCamera(int pCamNum,PreviewAction pPA){ if(mCamInance==null){ if (pPA!=null && pPA instanceof PreviewAction){ mAction = pPA; } current_camera = pCamNum>=0?pCamNum: Camera.CameraInfo.CAMERA_FACING_BACK; mCamInance = Camera.open(current_camera); mCamPmr = mCamInance.getParameters(); List tpFormat = mCamPmr.getSupportedPreviewFormats(); if(tpFormat.contains(ImageFormat.NV21)){ mCamPmr.setPreviewFormat(ImageFormat.NV21); }else{ Log.e(TAG, "initCamera: Camera not support NV21 format data!"); try { throw new Throwable("Camera not support NV21 format data"); } catch (Throwable throwable) { throwable.printStackTrace(); } } if (tpFormat.contains(ImageFormat.JPEG)){ mCamPmr.setPictureFormat(ImageFormat.JPEG); } //找到手机支持的最大的分辨率,并赋值 mSupportPreviewSizes = mCamPmr.getSupportedPreviewSizes(); Camera.Size temp=null; for (Camera.Size s:mSupportPreviewSizes){ //寻找投备支持最大宽高 /*if(temp==null){ temp = s; }else{ if(s.width>temp.width){ temp = s; } }*/ //寻找设备最合适宽高 Log.e(TAG, "initCamera: current element:[W]:"+s.width+" [H]:"+s.height); if (Math.abs(current_width-displayWidth) tpHeight*iAspectRatio){ tpWidth = (int)(tpHeight*iAspectRatio+.5); }else{ tpHeight = (int)(tpWidth/iAspectRatio+.5); } Log.e(TAG, "onMeasure: reconstructed!"); super.onMeasure(MeasureSpec.makeMeasureSpec(tpWidth,MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(tpHeight,MeasureSpec.EXACTLY)); } public interface PreviewAction{ void doTakePicture(); void doTakeVideo(byte[] data,int length); } }
调用如下
Display mDisplay = getWindowManager().getDefaultDisplay(); DisplayMetrics mDet=new DisplayMetrics(); mDisplay.getMetrics(mDet); mLSD = new LiveStreamDisplay(getApplicationContext(), Camera.CameraInfo.CAMERA_FACING_BACK,mDet.widthPixels,mDet.heightPixels); ... addContentView(mLSD,new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); mLSD.initCamera(0,new LiveStreamDisplay.PreviewAction() { @Override public void doTakePicture() { } @Override public void doTakeVideo(byte[] data, int length) { Log.e(TAG, "doTakeVideo: get video data!"); } });
这是输出
10-20 13:30:11.336 5970-5970/com.jiechu.wnd.lv E/LiveStreamDisplay: onPreviewFrame: find video data & call doTakeVideo[length:1382400]! 10-20 13:30:11.336 5970-5970/com.jiechu.wnd.lv E/MainActivity: doTakeVideo: get video data! 10-20 13:30:11.337 5970-5970/com.jiechu.wnd.lv D/Camera-JNI: Adding callback buffer to queue, 1 total 10-20 13:30:11.448 5970-6053/com.jiechu.wnd.lv D/Camera-JNI: Allocating callback buffer 10-20 13:30:11.484 5970-6053/com.jiechu.wnd.lv D/dalvikvm: GC_FOR_ALLOC freed 1350K (10), 17% free 14810K/17632K, paused 36ms, total 36ms 10-20 13:30:11.489 5970-5970/com.jiechu.wnd.lv I/CameraFramework: handleMessage: 16 10-20 13:30:11.489 5970-5970/com.jiechu.wnd.lv D/Camera-JNI: setHasPreviewCallback: installed:1, manualBuffer:0 10-20 13:30:11.491 5970-5970/com.jiechu.wnd.lv E/LiveStreamDisplay: onPreviewFrame: find video data & call doTakeVideo[length:1382400]! 10-20 13:30:11.491 5970-5970/com.jiechu.wnd.lv E/MainActivity: doTakeVideo: get video data! 10-20 13:30:11.491 5970-5970/com.jiechu.wnd.lv D/Camera-JNI: Adding callback buffer to queue, 1 total 10-20 13:30:11.609 5970-5983/com.jiechu.wnd.lv D/Camera-JNI: Allocating callback buffer