我一直在我的应用程序中使用来自 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>