Воспроизведение видео в процессе обработки - PullRequest
1 голос
/ 06 августа 2020

Я считываю емкостные датчики с помощью Arduino, и номер затронутого датчика передается в Processing, на данный момент это всего 1 или 2.

В процессе обработки я пытаюсь воспроизвести видео в зависимости от номер полученного датчика. Мне нужно иметь возможность переключаться между разными видео во время воспроизведения, после его завершения, и если будет нажат тот же номер, видео должно вернуться к началу.

Это код в обработке

    import processing.serial.*;
    import processing.video.*;
    
    Movie video1, video2;
    
    Serial port;
    char in;
    char previousIn;
    boolean playing = false;
    //float time = 0;
    
    void setup() {  
      fullScreen(JAVA2D);
      frameRate(25);
      video1 = new Movie(this, "redFIN.mp4");
      video2 = new Movie(this, "greenFIN.mp4");
      port = new Serial(this, Serial.list()[0], 9600);
    }
    
    void movieEvent(Movie m) {
      m.read();
    }
    
    void draw() {  
      if ( port.available() > 0) {  // If data is available,
        in = char(port.read());
        print(in);
      }
    
      if (in == '1') {  
        video1.play();
        video2.stop();
        in = previousIn;
        if (in == previousIn) {
          video1.jump(0);
        }
      }
      image(video1, 0, 0, width, height);
    
    
      if (in =='2') {
        video2.play();
        video1.stop();
        in = previousIn;
        if (in == previousIn) {
          video2.jump(0);
        }
      }
      image(video2, 0, 0, width, height);
    }

На данный момент я могу переключаться между видео, но только с фильма1 на фильм2, при возврате от фильма2 к фильму1 я получаю звук из фильма1, но он продолжает отображать последний кадр фильма2 .

Я был бы признателен за любое понимание, почему это происходит.

1 Ответ

1 голос
/ 06 августа 2020

Вы очень близки, но все же есть пара областей, которые не будут вести себя так, как вы ожидаете:

  1. Вы рисуете и video1, и video2, используя image(): you вы хотите рендерить только одно видео
  2. условия if (in == previousIn), вероятно, должны выполняться до установки previousIn (что, кстати, вы устанавливаете другим способом). (в противном случае условие всегда будет истинным)

Вот версия, использующая третью переменную Movie, которая является простой ссылкой на video1 или video2 в зависимости от контекста:

import processing.serial.*;
import processing.video.*;

Movie video1, video2, currentVideo;

Serial port;
char in;
char previousIn;
boolean playing = false;
//float time = 0;

void setup() {  
  fullScreen(JAVA2D);
  frameRate(25);
  video1 = new Movie(this, "redFIN.mp4");
  video2 = new Movie(this, "greenFIN.mp4");
  // default to video1
  currentVideo = video1;
  port = new Serial(this, Serial.list()[0], 9600);
}

void movieEvent(Movie m) {
  m.read();
}

void draw() {  
  if ( port.available() > 0) {  // If data is available,
    in = char(port.read());
    print(in);
  }

  if (in == '1') {  
    video1.play();
    video2.stop();
    if (in == previousIn) {
      video1.jump(0);
    }
    previousIn = in;
    currentVideo = video1;
  }

  if (in =='2') {
    video2.play();
    video1.stop();
    if (in == previousIn) {
      video2.jump(0);
    }
    previousIn = in;
    currentVideo = video2;
  }
  
  image(currentVideo, 0, 0, width, height);
}
...