Проблема с MediaPlayer, используемым в статическом контексте (ARCore) - PullRequest
0 голосов
/ 09 февраля 2019

Я использую библиотеку 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();

Любая помощь в том, как я могу изменить это, чтобы сделать возможным остановку, или если я полностью упускаю что-то очевидное,быть замечательнымСпасибо.

...