为什么在textureview中的相机预览比在surfaceview中更模糊?

use*_*316 11 android surfaceview android-camera android-mediarecorder textureview

我发现当使用textureview而不是surfaceview作为相机预览(两者都通过mediarecorder连接到相机)时,预览会更加模糊.

模糊的意思是在纹理视图中你可以看到像素,特别是在缩放时.使用surfaceview时不是这种情况.为什么会这样?

dro*_*ida 0

UPD:抱歉,但是在我重新编写我的狗屎代码后,关键是预览尺寸太小导致“模糊”,所以你应该设置一个合理的预览尺寸,而不是下面删除线的原因,但建议自动对焦。 ..

Size size = getBestSupportSize(parameters.getSupportedPreviewSizes(), width, height);
parameters.setPreviewSize(size.width, size.height);
Run Code Online (Sandbox Code Playgroud)

至于方法getBestSupportSize(),如何得到bestSize适合你的项目需要的,在这种情况下,它与屏幕宽度一样大,比例是4/3,你的可能是其他的,我计算比例划分width/height

 private Size getBestSupportSize(List<Size> sizes, int width, int height) {
    Size bestsize = sizes.get(0);
    int screenWidth = getResources().getDisplayMetrics().widthPixels;
    int dt = Integer.MAX_VALUE;
    for (int i = sizes.size() - 1; i >= 0; i--) {
        Log.d(TAG, "-index : " + i);
        Size s = sizes.get(i);
        if (s.width * 3.0f / 4 == s.height) {
            int newDT = Math.abs(screenWidth - s.width);
            if (newDT < dt && screenWidth < s.width) {
                dt = newDT;
                bestsize = s;
            }
        }
    }
    return bestsize;//note that if no "4/3" size supported,default return size[0]
}
Run Code Online (Sandbox Code Playgroud)

getSupportedPreviewSizes()所以这种“模糊”是由较小的预览尺寸引起的使用此方法计算相机的最佳尺寸


autoFocus如果需要的话,我将保留下面的片段,但删除掉,FYR。


好吧,我得到了这个“模糊”问题的解决方案,我的案例只是使用TextureViewandsurfaceTexture来拍照,而不是旧的surfaceViewwith surfaceHolderway。

关键是设置了这个 mCamera.autofocus(),为什么图片“模糊”是因为我们缺少这个自动对焦设置。像下面这样:

mCamera.setPreviewTexture(surface);

//enable autoFocus  if moving   
mCamera.setAutoFocusMoveCallback(new AutoFocusMoveCallback() {

    @Override
    public void onAutoFocusMoving(boolean start, Camera camera) {

        if (start) {  //true means you are moving the camera  

            mCamera.autoFocus(myAutoFocus);

        }
    }
});
mCamera.startPreview();
Run Code Online (Sandbox Code Playgroud)

autoFocusCallback这样的:

AutoFocusCallback myAutoFocus = new AutoFocusCallback() {

    @Override
    public void onAutoFocus(boolean success, Camera camera) {

    }
};
Run Code Online (Sandbox Code Playgroud)