surfaceView和Camera配合進行攝像頭的預覽


首先是Camera類,在5.0上已經被廢棄,不推薦使用但還是支持的。最新的是Camera2類,我還沒有研究,據說用法完全不一樣,反正也是一個坑跳入另外一個坑。
上面是簡介和需要的權限,記得加上權限。
步驟在下面圖里:
說了大體的流程去使用這個類,三個標important的條目,按照步驟走就好。需要注意的就是第5條,Pass a fully initialized SurfaceHolder,需要一個已經完全初始化完畢的surface,也就是你需要等surface初始化完畢之后才能調用 setPreviewDisplay(SurfaceHolder)
所以最好把openCamera的工作放到surfaceHolder的回調里面去:like here:
@Override
public void surfaceCreated(SurfaceHolder holder) {

System.out.println("surfaceCreated");
camera = Camera.open();
}

 

然后我們要做的是對Camera進行configure
private void initCamera() {

parameters = camera.getParameters();
parameters.setFlashMode("off"); // 無閃光燈
parameters.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO);
parameters.setSceneMode(Camera.Parameters.SCENE_MODE_AUTO);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
parameters.setPreviewFormat(ImageFormat.YV12);
parameters.setPictureSize(camWidth, camHeight);
parameters.setPreviewSize(camWidth, camHeight);
//這兩個屬性 如果這兩個屬性設置的和真實手機的不一樣時,就會報錯
camera.setParameters(parameters);
// 橫豎屏鏡頭自動調整
if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
parameters.set("orientation", "portrait"); //
parameters.set("rotation", 90); // 鏡頭角度轉90度(默認攝像頭是橫拍)
camera.setDisplayOrientation(90); // 在2.2以上可以使用
} else// 如果是橫屏
{
parameters.set("orientation", "landscape"); //
camera.setDisplayOrientation(0); // 在2.2以上可以使用
}

byte[] buf = new byte[camWidth * camHeight * 3 / 2];
camera.addCallbackBuffer(buf);
camera.setPreviewCallback(this);
}

 

這些東西我是在surfaceChanged里面調用開啟的:
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

System.out.println("surfaceChanged");
initCamera();
try {
camera.setPreviewDisplay(holder);
camera.startPreview();
System.out.println("startPreview");
} catch (IOException e) {
e.printStackTrace();
}
}

 

上面我們對camera做了初始化並設置了setPreviewCallback,所以我們對圖像的處理或者視頻的處理就可以在Camera.PreviewCallback它的回調
@Override
public void onPreviewFrame(byte[] data, Camera camera) {

if (data == null) {
return;
}
System.out.println("onPreviewFrame");
int ret = avcCodec.offerEncoder(data, h264);
}

 

里面做處理,之前設置了camera.setPreviewCallbackWithBuffer();
結果onPreviewFrame只在open的時候調用一次,找了一天的原因。。。。。。。。。。。。才發現是這兒。 
先這樣,后續做encode再補充。
 
github resp added.
https://github.com/yocn/CameraPreview


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM