0

私は自分のアプリで Google Play Services の Vision API を使用しており、私のデバイス (Android 5.1 を搭載した Nexus 7 2012、および Android 4.2.2 を搭載した安価なタブレット) ではすべて正常に動作しますが、一部の製品デバイスでは動作しません。 .

アプリが開いている間は常に実行されている顔検出フレームワークを備えたビジョン API があるため、顔検出が彼を検出すると、アプリはコンテンツを変更します。

問題は、顔検出が機能しているときに でビデオを表示すると、VideoViewの上にある種の「ゴースト」が表示されることに気づき、VideoViewこの「ゴースト」がプレビューであることがわかったためです。顔検出がリアルタイムで行われていること。

説明が複雑なので、問題をよりよく説明するビデオを録画しました:ビデオ

現時点では、次のことを試しました。

  • の寸法を変更する.setRequestedPreviewSize(int, int)と、この寸法に基づいて「ゴースト」も寸法が変更されることがわかったので、プレビュー サイズが問題の原因であることがわかりました。

  • .setRequestedPreviewSize(int, int)内部的に見たからの呼び出しを削除すると、CameraSource.Builderご覧のとおり、デフォルトでサイズが 1024x768 にCameraSourceなり、「ゴースト」が画面全体をこれで埋め尽くします。

  • ビデオを再生するために別のフレームワークを試してみてください。別のフレームワークを削除VideoViewして使用しTextureViewても役に立ちません。ゴーストがまだ表示されています。

  • 異なるビデオ形式を使用しても効果がありません

これは、SurfaceView や SurfaceTexture 以外が同時に動作する場合に何らかの問題になる可能性があると思いますが、マルチメディア指向のアプリを使用するのはこれが初めてです。

誰かが問題になる可能性があることについて何らかの考えを持っていますか?

前もって感謝します。

編集

明確にするために、使用しているコードを投稿しています。

これは、私がアプリで使用している方法であり、ビデオで示されています。

private void setupFaceDetector() {
        Log.d(TAG, "setupFaceDetector");
        faceDetector = new FaceDetector.Builder(this)
                .setProminentFaceOnly(true)
                .setClassificationType(FaceDetector.ALL_CLASSIFICATIONS)
                .build();
        if (!faceDetector.isOperational()) {
            retryIn(1000);
        } else {
            faceDetector.setProcessor(new LargestFaceFocusingProcessor(faceDetector, new FaceTracker(this)));
            if (BuildConfig.FLAVOR.equals("withPreview")) {
                mCameraSource = new CameraSource.Builder(this, faceDetector)
                        .setFacing(CameraSource.CAMERA_FACING_FRONT)
                        .setRequestedPreviewSize(320, 240)
                        .build();
            } else {
                mCameraSource = new CameraSource.Builder(this, faceDetector)
                        .setFacing(CameraSource.CAMERA_FACING_FRONT)
                        .build();
            }
        }

    }

私はフレーバーを使用してさまざまな種類のものを試していますが、このプロジェクトはこの機能のテストを簡単にするためだけのものでした。

onResume()メソッドが呼び出されると、インスタンスからビデオをロードして開始FileしますCameraSource

private void initializeVideo() {
  mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
      mp.start();
    }
  });

  mVideoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
      Log.d(TAG, "Error playing the video");
      return false;
    }
  });
  mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
      playVideo();
    }
  });
}

private void startCameraSource() {
  try {
    mCameraSource.start();
  } catch (IOException e) {
    e.printStackTrace();
  }
}

明確にするために:

  • 顔を検出するためだけに FaceTracker を使用していますpublic void onNewItem(int id, Face face)public void onMissing(Detector.Detections<Face> detections)

  • 表示する xml レイアウトVideoViewは次のとおりです。

    <VideoView
        android:id="@+id/videoView"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3"/>
    
    <ScrollView
        android:id="@+id/scroll"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1">
    
        <TextView
            android:id="@+id/tv_log"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="@android:color/white"/>
    </ScrollView>
    

4

1 に答える 1