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

4

我不太确定,但这里有一些可以尝试的建议:

这里有一个 CameraSource 的开源版本,您可以在应用程序中根据需要使用和修改:

https://github.com/googlesamples/android-vision/blob/master/visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/ui/camera/ CameraSource.java

这有几个表面实例变量,mDummySurfaceView 和 mDummySurfaceTexture,在没有预览显示的情况下用于处理相机预览。这些在这里设置:

https://github.com/googlesamples/android-vision/blob/master/visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/ui/camera/ CameraSource.java#L346

我猜在您的应用程序中,这些虚拟表面会以某种方式干扰您的视频。您可能会看到您的应用程序是否可以使用替代策略来使用不需要这些虚拟表面的相机。

您还可以使用您提供的特定 SurfaceHolder 启动相机源,如下所示:

https://github.com/googlesamples/android-vision/blob/master/visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/ui/camera/ CameraSource.java#L370

您可以尝试创建替代表面,看看是否有办法避免干扰您的视频。

如果这些都不起作用,您也可以尝试自己编写相机控制代码,类似于 CameraSource 提供的,但使用较新的“camera2”API(我们使用“camera1”API 发布 CameraSource,因为当时这个 API 有点与旧相机的向后兼容性更好一点,但这已经在 camera2 中得到改善)。如果这样做,您可以采用类似的方法将预览图像传递给检测器,如下所示:

https://github.com/googlesamples/android-vision/blob/master/visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/ui/camera/ CameraSource.java#L1191

于 2016-02-04T20:47:03.657 回答