【发布时间】:2017-01-10 19:38:49
【问题描述】:
我一直在尝试解决这个问题,但由于某种原因,当我开始用相机录制视频时,预览会放大。我有一些示例中的以下代码:
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Camera.Parameters myParameters = mCamera.getParameters();
List<Camera.Size> sizes = myParameters.getSupportedPreviewSizes();
Camera.Size myBestSize = getBestPreviewSize(sizes, width, height);
if (myBestSize != null) {
myParameters.setPreviewSize(myBestSize.width, myBestSize.height);
myParameters.setVideoStabilization(false);
mCamera.setParameters(myParameters);
mCamera.startPreview();
mCamera.unlock();
}
}
private Camera.Size getBestPreviewSize(List<Camera.Size> sizes, int width, int height) {
final double ASPECT_TOLERANCE = 0.05;
double targetRatio = (double) width / height;
if (sizes == null) return null;
Camera.Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = height;
// Find size
for (Camera.Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Camera.Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
但录制视频时预览仍会放大。我尝试将预览大小手动设置为 1280x720,但是,它不适用于我测试的所有设备,有些设备显示黑色 SurfaceView。
录制视频时有什么方法可以防止预览放大吗? StackOverflow 上的解决方案似乎都不起作用。
编辑:我尝试使用自己的 onMesaure 方法创建自定义 SurfaceView,但现在启动 MediaRecorder 时出现 -19 错误。 (忽略赏金中的-16)
【问题讨论】:
-
您是否尝试过查看
surfaceChanged被调用了多少次?这可能与您在每次表面变化时都会调用的回调方法中不断调用getBestPreviewSize的事实有关。所以您会陷入导致缩放效果的循环中。以onMeasure之类的方法调用getBestPreviewSize似乎更聪明,这实际上决定了视图的大小 -
那么,您是否建议我使用自己的
onMeasure方法创建一个扩展SurfaceView的自定义视图?也许我可以试一试。 -
是的,这似乎更有意义。您应该始终检查这确实是问题所在,添加
Log.i以查看为myBestSize.width和myBestSize.height设置的值 -
我试过这个,但现在我的 MediaRecorder 在我尝试启动它时会抛出 -19 错误。
标签: android video android-camera surfaceview video-recording