Я использую библиотеку Google ARCore, чтобы создать приложение для обнаружения изображения, воспроизвести видео для этого конкретного изображения, а затем остановить это видео при обнаружении нового изображения.Логика обнаружения изображений работает правильно, проблема, с которой я столкнулся, связана с классом android MediaPlayer и остановкой видео при обнаружении нового изображения.
Я определяю отдельный класс для объекта MediaPlayer, которыйбудут ссылаться (шаблон Singleton).Этот класс будет использоваться для запуска и остановки MediaPlayer.
public class AugmentedImageMediaPlayer {
public static MediaPlayer mediaPlayerInstance = new MediaPlayer();
public static void startMediaPlayer(Context context, int augmentedImageIndex, Surface surface, boolean isLooping){
mediaPlayerInstance = MediaPlayer.create(context, AugmentedImageFragment.videoList[augmentedImageIndex]);
mediaPlayerInstance.setSurface(surface);
mediaPlayerInstance.setLooping(isLooping);
}
public static void stopMediaPlayer(){
if(mediaPlayerInstance.isPlaying()) {
mediaPlayerInstance.stop();
}
}
}
Когда обнаруживается новое изображение, создается узел, и объект MediaPlayer создается из класса выше(AugmentedImageMediaPlayer).MediaPlayer воспроизводится на поверхности и устанавливается как визуализируемый на узле.
AugmentedImageMediaPlayer.startMediaPlayer(context, augmentedImageIndex, texture.getSurface(), false);
// Set the anchor based on the center of the image.
setAnchor(image.createAnchor(image.getCenterPose()));
//TODO: Video nodes here.
Node videoNode = new Node();
videoNode.setParent(this);
float videoWidth = AugmentedImageMediaPlayer.mediaPlayerInstance.getVideoWidth();
float videoHeight = AugmentedImageMediaPlayer.mediaPlayerInstance.getVideoHeight();
videoNode.setLocalScale(
new Vector3(
VIDEO_HEIGHT_METERS * (videoWidth / videoHeight), VIDEO_HEIGHT_METERS, 1.0f));
Quaternion q1 = videoNode.getLocalRotation();
Quaternion q2 = Quaternion.axisAngle(new Vector3(1.0f, 0f, 0f), 90f);
videoNode.setLocalRotation(Quaternion.multiply(q1, q2));
if (!AugmentedImageMediaPlayer.mediaPlayerInstance.isPlaying()) {
AugmentedImageMediaPlayer.mediaPlayerInstance.start();
// Wait to set the renderable until the first frame of the video becomes available.
// This prevents the renderable from briefly appearing as a black quad before the video
// plays.
texture
.getSurfaceTexture()
.setOnFrameAvailableListener(
(SurfaceTexture surfaceTexture) -> {
videoNode.setRenderable(videoPlacedRenderable);
texture.getSurfaceTexture().setOnFrameAvailableListener(null);
});
// this stops the video from playingAugmentedImageMediaPlayer.mediaPlayerInstance.stop();
} else {
videoNode.setRenderable(videoPlacedRenderable);
}
Все это работает правильно, и видео начинается отлично.Проблема в том, что я не могу остановить видео за пределами узла (могу остановить его в классе узла), хотя я определил класс, чтобы убедиться, что на MediaPlayer можно ссылаться и изменять.
Вот где я пытаюсь остановить видео:
node = new AugmentedImageNode(this);
node.setImage(augmentedImage, this, this.augmentedImageIndex);
augmentedImageMap.put(augmentedImage, node);
arFragment.getArSceneView().getScene().addChild(node);
AugmentedImageMediaPlayer.stopMediaPlayer();
Любая помощь в том, как я могу изменить это, чтобы сделать возможным остановку, или если я полностью упускаю что-то очевидное,быть замечательнымСпасибо.