Android相机 - 录制视频时预览放大
Posted
技术标签:
【中文标题】Android相机 - 录制视频时预览放大【英文标题】:Android Camera - Preview zooms in when recording video 【发布时间】: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。
录制视频时有什么方法可以防止预览放大吗? *** 上的解决方案似乎都不起作用。
编辑:我尝试使用自己的 onMesaure 方法创建自定义 SurfaceView,但现在启动 MediaRecorder 时出现 -19 错误。 (忽略赏金中的-16)
【问题讨论】:
您是否尝试过查看surfaceChanged
被调用了多少次?这可能与您在每次表面变化时都会调用的回调方法中不断调用 getBestPreviewSize
的事实有关。所以您会陷入导致缩放效果的循环中。以onMeasure
之类的方法调用getBestPreviewSize
似乎更聪明,这实际上决定了视图的大小
那么,您是否建议我使用自己的onMeasure
方法创建一个扩展SurfaceView
的自定义视图?也许我可以试一试。
是的,这似乎更有意义。您应该始终检查这确实是问题所在,添加 Log.i
以查看为 myBestSize.width
和 myBestSize.height
设置的值
我试过这个,但现在我的 MediaRecorder 在我尝试启动它时会抛出 -19 错误。
【参考方案1】:
我对您所说的变焦类型感到困惑,可能是软件变焦,也可能是自动对焦,所以我会提出不同的潜在提示,最终解决方案:
实现mCamera.setZoomChangeListener,例如:
mCamera.setZoomChangeListener(new Camera.OnZoomChangeListener()
@Override public void onZoomChange(int i, boolean b, Camera camera)
Log.e("***","Zoom just changed !");
// Inspect things from here
);
禁用平滑缩放:
mCamera.stopSmoothZoom(); // My device doesn't support it, but maybe your device does
检查你所有的Camera.Parameters:
Log.e("***", "All Camera parameters :");
for(String s : mCamera.getParameters().flatten().split(";"))
Log.e("***", s + "\n");
然后切换任何可能与缩放相关的内容,例如:
Camera.Parameters parameters = mCamera.getParameters();
parameters.setZoom(100); // My device support some values in the range 100 | 400
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);
parameters.setVideoStabilization(false);
// Don't forget to add the new parameters to the camera :
mCamera.setParameters(parameters);
问候
【讨论】:
【参考方案2】:你可能有setVideoStabilization(true)
。在高分辨率例如4K,如果启用此功能,它将创建此跳转缩放。
【讨论】:
以上是关于Android相机 - 录制视频时预览放大的主要内容,如果未能解决你的问题,请参考以下文章
Android - 录制视频后停止和重置相机时的致命信号 11