//解決辦法直接寫在註釋裏了
//我只試過4.4 5.0 6.0三種機型
關於黑屏的分析請看:http://blog.csdn.net/afei__/article/details/51540188
private void startPreView(SurfaceHolder holder) {
if (mCamera == null) {
mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);//默認打開前置
}
if (mCamera != null) {
mCamera.setDisplayOrientation(or);
try {
List<Camera.Size> previewSizes = mCamera.getParameters().getSupportedPreviewSizes();
for (int i = 0; i < previewSizes.size(); i++) {
Camera.Size psize = previewSizes.get(i);
//把可以設置的尺寸打印出來
LogUtils.e("BG" + "initCamera", "PreviewSize,width: " + psize.width + " height: " + psize.height);
}
mCamera.setPreviewDisplay(holder);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//華爲M2(6.0)不能設置Parameters
profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
} else {
//華爲4.4及其他5.0手機需要設置parameters,不然在SurfaceView上只有第一幀後面不動了
mParameters = mCamera.getParameters();
List<Camera.Size> mSupportedPreviewSizes = mParameters.getSupportedPreviewSizes();
List<Camera.Size> mSupportedVideoSizes = mParameters.getSupportedVideoSizes();
Camera.Size optimalSize = CameraHelper.getOptimalVideoSize(mSupportedVideoSizes,
mSupportedPreviewSizes, mSurfaceView.getWidth(), mSurfaceView.getHeight());
previewWidth = optimalSize.width / 2;
previewHeight = optimalSize.height;
mParameters.setPreviewSize(previewWidth, previewHeight);
profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
// 這裏是重點,分辨率和比特率
// 分辨率越大視頻大小越大,比特率越大視頻越清晰
// 清晰度由比特率決定,視頻尺寸和像素量由分辨率決定
// 比特率越高越清晰(前提是分辨率保持不變),分辨率越大視頻尺寸越大。
profile.videoFrameWidth = optimalSize.width;
profile.videoFrameHeight = optimalSize.height;
// 這樣設置 1080p的視頻 大小在5M , 可根據自己需求調節
profile.videoBitRate = 2 * optimalSize.width * optimalSize.height;
List<String> focusModes = mParameters.getSupportedFocusModes();
if (focusModes != null) {
for (String mode : focusModes) {
mode.contains("continuous-video");
}
}
mCamera.setParameters(mParameters);
}
mCamera.startPreview();
} catch (Exception e) {
e.printStackTrace();
}
}
}