私は自分のアプリで 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>