2

アプリに camera2 を実装しましたが、Nexus 6P と Nexus 5 で動作しています。現在、他のデバイスでテストしようとしていますが、最初に試したデバイスはすぐに失敗しました。これは、Lollipop を実行している HTC M7 で発生するエラーです。

Surface with size (w=1920, h=1080) and format 0x1 is not valid, 
size not in valid set: [1920x1088, 1440x1088, 1456x832, 1088x1088,
1280x720, 960x720, 960x544, 720x720, 800x480, 768x464, 720x480, 
768x432, 640x480, 544x544, 576x432, 640x384, 640x368, 480x480, 
480x320, 384x288, 352x288, 320x240, 240x160, 176x144]

この場合、どうすればよいですか?自分に最も近い解像度TextureView(1280x720) を計算し、TextureViewそれに応じてサイズを変更しようとしましたが、あまり見栄えがよくありません - 未使用のスペースが多すぎます...SurfaceView

編集:

問題は私の内部にあるようTextureViewです。これは私のコードです:

私が持っているコントローラ内:

 TextureView.SurfaceTextureListener mSurfaceTextureListener = new TextureView.SurfaceTextureListener() {
    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture,
            int width, int height) {
        startLollipopPreview(width, height);
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture,
            int width, int height) {
        configureTransform(width,height);
    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
        return true;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
    }
};


 private void startLollipopPreview(int width, int height) {
    CameraProxy camera = getCurrentCamera();
    try {
        if (!mCameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) {
            throw new RuntimeException("Time out waiting to lock camera opening.");
        }
        mPreviewSize = camera
                .getOptimalPreviewSize((Activity) mContext,
                        camera.getSupportedPreviewSizes(
                                width, height), (double) width / height);
        mPreviewTexture.setAspectRatio(mPreviewSize.width, mPreviewSize.height);
        mPreviewTexture.getSurfaceTexture().setDefaultBufferSize(mPreviewSize.width,
                mPreviewSize.height);
        configureTransform(mPreviewSize.width, mPreviewSize.height);
        camera.setStateAndHandler(getCameraStateCallback(), mBackgroundHandler);
        camera.open();
    } catch (CameraHardwareException e) {
        Log.e(TAG, ".surfaceCreated() - Error opening camera", e);
        ((Activity) mContext).finish();
    } catch (InterruptedException e) {
        Log.e(TAG, ".surfaceCreated() - InterruptedException opening camera", e);
    }
}

configureTransform()Camera2 の Google サンプルとまったく同じように見えるので、そこに問題があるとは思いません。

私のTextureView中には次のものがあります:

 public void setAspectRatio(int width, int height) {
    if (width < 0 || height < 0) {
        throw new IllegalArgumentException("Size cannot be negative.");
    }
    mRatioWidth = width;
    mRatioHeight = height;
    requestLayout();
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int width = MeasureSpec.getSize(widthMeasureSpec);
    int height = MeasureSpec.getSize(heightMeasureSpec);
    if (0 == mRatioWidth || 0 == mRatioHeight) {
        setMeasuredDimension(width, height);
    } else {
        if (width < height * mRatioWidth / mRatioHeight) {
            FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) getLayoutParams();
            params.gravity = Gravity.CENTER_VERTICAL;
            setLayoutParams(params);
            setMeasuredDimension(width, width * mRatioHeight / mRatioWidth);
        } else {
            setMeasuredDimension(height * mRatioWidth / mRatioHeight, height);
        }
    }
}
4

2 に答える 2

1

バッファ サイズをサポートされているプレビュー サイズに設定する必要があると思います。

textureView.getSurfaceTexture().setDefaultBufferSize(1280,720);

次に、プレビュー サイズが小さくても、TextureView を画面に合わせてスケーリングできます。Camera2Videoサンプルに例があります具体的にconfigureTransformCamera2VideoFragmentを見てください:

/**
 * Configures the necessary {@link android.graphics.Matrix} transformation to `mTextureView`.
 * This method should not to be called until the camera preview size is determined in
 * openCamera, or until the size of `mTextureView` is fixed.
 *
 * @param viewWidth  The width of `mTextureView`
 * @param viewHeight The height of `mTextureView`
 */
private void configureTransform(int viewWidth, int viewHeight) {
    Activity activity = getActivity();
    if (null == mTextureView || null == mPreviewSize || null == activity) {
        return;
    }
    int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
    Matrix matrix = new Matrix();
    RectF viewRect = new RectF(0, 0, viewWidth, viewHeight);
    RectF bufferRect = new RectF(0, 0, mPreviewSize.getHeight(), mPreviewSize.getWidth());
    float centerX = viewRect.centerX();
    float centerY = viewRect.centerY();
    if (Surface.ROTATION_90 == rotation || Surface.ROTATION_270 == rotation) {
        bufferRect.offset(centerX - bufferRect.centerX(), centerY - bufferRect.centerY());
        matrix.setRectToRect(viewRect, bufferRect, Matrix.ScaleToFit.FILL);
        float scale = Math.max(
                (float) viewHeight / mPreviewSize.getHeight(),
                (float) viewWidth / mPreviewSize.getWidth());
        matrix.postScale(scale, scale, centerX, centerY);
        matrix.postRotate(90 * (rotation - 2), centerX, centerY);
    }
    mTextureView.setTransform(matrix);
}
于 2015-12-17T14:39:20.500 に答える
1

直面している問題は、アプリをテストするエミュレーター/デバイスによって異なります。

このエラーは、画面のサイズと MediaRecorder の設定のデバイス対応サイズが一致していない場合に発生します

カメラが開いている場合 (openCamera(int w, int h)メソッド)、メソッドを使用して、サポートされている解像度のサイズを取得していchooseOptimalSize(.... .....)ます。しかし、その前に、それは設定されvideoSize()ます。

Logcat を試して、サポートされているサイズを取得し、そのセットに従って、mMediaRecorder.setVideoSize(w,h);

于 2017-11-29T05:39:10.503 に答える