5

更新:これはこれに関連しているように見えます: Android camera2 API からの画像データが Galaxy S5 でフリップ & スクイッシュされる希望のアスペクト比に到達するために手動でトリミングすると、「サポートされている」出力サイズも使用しない可能性があります。

問題:

  1. Camera2 API を使用してカメラの特性を取得し、MediaCodec.class に適した出力サイズを抽出します
  2. 適切なカメラ出力サイズのいずれかで MediaCodec 入力サーフェスを作成します。出力をMediaMuxerなどにフィードして、出力を確認します。
  3. コーデックの作成されたサーフェスをターゲットとして使用して、カメラ キャプチャ リクエストを開始します。
  4. コーデック出力は正しいサイズです。ただし、結果はデバイスによって異なります。

    • Nexus 5/6: Android 5/6 で問題ありません。
    • Android 5.1 を搭載した Samsung タブレット: 一部の解像度では、画像が明らかに引き伸ばされており、カメラの出力解像度が表面のサイズと一致していないことを示しています。カメラを回転させ始めると、非常に明白になります。X/Y 軸に沿っていないため、画像がますます歪んでいきます。他のいくつかの解像度では、出力は問題ありません。ここには、サイズまたはアスペクト比に関連するパターンはありません。

問題ありません。おそらく、指定された幅や高さなどでサーフェスが正確に作成されない可能性があります (出力サイズが MediaCodec.class ターゲット用に特別に抽出された場合でも)。

そこで、OpenGL コンテキストを作成し、テクスチャとそのための SurfaceTexture を生成し、デフォルトのバッファ サイズをカメラ出力サイズに設定し、テクスチャを使用して Surface を作成しました。これを TextureView に描画したり、MediaCodec の EGL サーフェスに戻したりする詳細については説明しません。結果は同じです。Camera2 のキャプチャ リクエストは、一部の解像度でのみ歪んだ画像を出力します。より深く掘り下げる: updateTexImage の直後に SurfaceTexture で getTransformMatrix を呼び出す - マトリックスは、予想どおり、常に恒等マトリックスです。

したがって、ここでの本当の問題は、カメラが提供されたターゲット サーフェスのサイズでキャプチャしていないことです。解決策は、カメラがキャプチャしている実際のサイズを取得することであり、残りは正しく描画するための純粋な GL マトリックス変換です。しかし - どうすればそれを手に入れることができますか?

注: 古いカメラ API を使用して、まったく同じ「プレビュー サイズ」とターゲット (MediaCodec またはカスタムのいずれか)と同じサーフェスを使用する - すべて問題ありません! しかし、古いカメラ API は非推奨であり、最大キャプチャ サイズが 1080p のように見えるため、使用できません。一方、Camera2 API はそれを超えており、4k 録画をサポートする必要があります。

4

2 に答える 2

2

同様の問題、SM-A7009API レベル 21 のモデル、レガシー camera2 デバイスが発生します。

プレビューが引き伸ばされ、surfaceTexture.setDefaultBufferSize機能していません。プレビューが開始されると、フレームワークはこれらの値をオーバーライドします。

から報告されたプレビュー サイズStreamConfigurationMap.getOutputSizes(SurfaceTexture.class)がすべてサポートされているわけではありません。

サポートされているのはそのうちの 3 つだけです。

$ adb shell dumpsys media.camera |grep preview-size
preferred-preview-size-for-video: 1920x1080
preview-size: 1440x1080
preview-size-values: 1920x1080,1440x1080,1280x720,1056x864,960x720,880x720,800x480,720x480,640x480,528x432,352x288,320x240,176x144

システム ダンプ情報には、多くのプレビュー サイズがリストされています。すべてを確認したところ1440x1080640x480、のみ320x240がサポートされていることがわかりました。

サポートされているプレビュー サイズにはすべて1.33333比率があります。から報告された比率と同じCameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZEです。

そのため、API 21 のレガシー camera2 api を使用する一部の samsung デバイスのバグだと思いました。

解決策は、非推奨のカメラ API を使用してこれらのデバイスを作成することです。

ここにたどり着く人の役に立てば幸いです。

于 2017-01-11T10:27:35.780 に答える
1

はい、これは Samsung デバイスのバグです。

通常、これは、出力時に複数の異なるアスペクト比を要求した場合に発生し、デバイス固有のカメラ コードは、それらすべてを正しくトリミングおよびスケーリングする際にトリップします。要求されたすべてのサイズの縦横比が同じであることを確認することで、これを回避できる場合があります。

解像度はおそらく実際にあなたが求めたものです - しかし、それは間違ってスケーリングされています (問題のあるサイズで ImageReader を使用してこれをテストできます。そこでは、突くことができる明示的なバッファを取得できます)

この種の引き伸ばされた出力が引き続き発生しないようにするために、Android コンプライアンス テストに追加のテストを追加しています。

于 2016-10-04T17:19:16.113 に答える