Я пытаюсь использовать ARCore для приложения дополненной реальности на Android, хочу показать видео при обнаружении изображения, приложение работает нормально, оно обнаруживает изображение, но не показывает видео, я использовал пример ChromaKeyв качестве руководства, и я не уверен, в чем проблема.
это новый метод моего приложения
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
arFragment = (CustomArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);
arFragment.getArSceneView().getScene().addOnUpdateListener(this);
arFragment.getPlaneDiscoveryController().hide();
texture = new ExternalTexture();
mediaPlayer = MediaPlayer.create(this, R.raw.vid);
mediaPlayer.setSurface(texture.getSurface());
}
здесь я делаю расширенное распознавание изображений
public void onUpdate(FrameTime frameTime) {
Frame frame = arFragment.getArSceneView().getArFrame();
Collection<AugmentedImage> images = frame.getUpdatedTrackables(AugmentedImage.class);
switch (augmentedImage.getTrackingState()) {
case TRACKING:
switch (augmentedImage.getIndex()){
case 0:
System.out.println("@@@@@@@@@@@ "+bandera);
System.out.println("ODISH");
if(mediaPlayer.isPlaying()) {
mediaPlayer.pause();
mediaPlayer.seekTo(0);
}
if(bandera){
System.out.println("ENTRO ODISH");
if(anchorNode != null){
arFragment.getArSceneView().getScene().removeChild(anchorNode);
anchorNode.getAnchor().detach();
anchorNode.setParent(null);
anchorNode = null;
anchor = null;
bandera = false;
}
}
anchor = augmentedImage.createAnchor(augmentedImage.getCenterPose());
createModel(anchor,"odish.sfb");
break;
case 1:
System.out.println("******** "+bandera);
System.out.println("KUBONE");
if(mediaPlayer.isPlaying()) {
mediaPlayer.pause();
mediaPlayer.seekTo(0);
}
if(bandera){
System.out.println("ENTRO KUBONE");
if(anchorNode != null){
arFragment.getArSceneView().getScene().removeChild(anchorNode);
anchorNode.getAnchor().detach();
anchorNode.setParent(null);
anchorNode = null;
anchor = null;
bandera = false;
}
}
anchor = augmentedImage.createAnchor(augmentedImage.getCenterPose());
createModel(anchor,"kubone.sfb");
break;
case 2:
System.out.println("//////////"+bandera);
System.out.println("VIDEO");
if(bandera){
System.out.println("ENTRO VIDEO");
if(anchorNode != null){
arFragment.getArSceneView().getScene().removeChild(anchorNode);
anchorNode.getAnchor().detach();
anchorNode.setParent(null);
anchorNode = null;
anchor = null;
bandera = false;
}
}
anchor = augmentedImage.createAnchor(augmentedImage.getCenterPose());
createVideo(anchor);
break;
default:
arFragment.getArSceneView().getScene().removeChild(anchorNode);
anchorNode.getAnchor().detach();
anchorNode.setParent(null);
anchorNode = null;
anchor = null;
bandera = false;
mediaPlayer.stop();
break;
}
break;
}
}
}
И наконец, это метод, который я использую, чтобы показать видео
private void createVideo(Anchor anchor) {
ModelRenderable.builder()
.setSource(this, R.raw.chroma_key_video)
.build()
.thenAccept(
renderable -> {
videoRenderable = renderable;
renderable.getMaterial().setExternalTexture("videoTexture", texture);
renderable.getMaterial().setFloat4("keyColor", CHROMA_KEY_COLOR);
})
.exceptionally(
throwable -> {
Toast toast =
Toast.makeText(this, "Unable to load video renderable", Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
return null;
});
anchorNode = new AnchorNode(anchor);
anchorNode.setParent(arFragment.getArSceneView().getScene());
videoNode = new Node();
videoNode.setParent(anchorNode);
System.out.println("\nVideo Height: "+mediaPlayer.getVideoHeight());
System.out.println("\nVideo Width: "+mediaPlayer.getVideoWidth());
float videoWidth = mediaPlayer.getVideoWidth();
float videoHeight = mediaPlayer.getVideoHeight();
videoNode.setLocalPosition(new Vector3());
videoNode.setLocalScale(
new Vector3(
VIDEO_HEIGHT_METERS * (videoWidth / videoHeight), VIDEO_HEIGHT_METERS, 1.0f));
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
texture
.getSurfaceTexture()
.setOnFrameAvailableListener(
(SurfaceTexture surfaceTexture) -> {
videoNode.setRenderable(videoRenderable);
texture.getSurfaceTexture().setOnFrameAvailableListener(null);
});
}else{
videoNode.setRenderable(videoRenderable);
}
}