Framerate (), кажется, не влияет на Mov ie - Обработка - PullRequest
1 голос
/ 27 марта 2020

Это должно быть что-то действительно глупое - так что извините, если это так :) - но я действительно застрял в этой простой проблеме в течение длительного времени, и я не могу понять это. Ничего не могу найти в документации processing.org или на форуме.

В общем, все, что я делаю, это загружаю .mp4 Movie, устанавливаю framerate и устанавливаю его до loop(). Все др aws, как и должно быть, но единственная проблема в том, что .framerate(), похоже, не влияет на сам Mov ie. Вот мой упрощенный код для понимания:

String urlCam1 = "Something.mp4";
Movie camera1;

Movie currentCam;    

boolean drawNextFrame = false;

void setup() {
    fullScreen();

    camera1 = new Movie(this, urlCam1);  
    camera1.frameRate(1);
    camera1.loop();

    background(0);
}

void draw() {
    if (drawNextFrame) {
        image(currentCam, 0, 0, 100, 100);
        drawNextFrame = false;
    }
}

void movieEvent(Movie m) {
    print("Video Read");
    m.read();
    drawNextFrame = true;
    currentCam = m;
}

Вы можете удивиться, почему я использую такую ​​странную структуру (особенно с currentCam), потому что я рисую несколько фильмов одновременно. Но я пробовал код только с одним Mov ie (как показывает код), но проблема все еще преобладает.

Обратите внимание, что camera1.framerate установлен в 1 кадр / с. По какой-то причине эта строка, кажется, игнорируется, даже если ошибок нет. movieEvent() вызывается не один раз в секунду, а гораздо чаще, и поэтому текущий кадр видео также не отображается каждую секунду, хотя я явно установил частоту кадров Mov ie в 1 кадр / с. ...

Почему это? Я что-то здесь упускаю?

Заранее спасибо! :)

1 Ответ

1 голос
/ 30 марта 2020

Мне удалось воспроизвести вашу проблему, но не исправить ее. Попробовав очень упрощенный код, основанный на примере из документации по обработке, я все еще не мог заставить frameRate() работать. Я даже пробовал разные рендеры без видимых результатов.

Вы можете получить аналогичный результат с помощью простых приемов. На этот раз вы можете считать свои кадры, чтобы обновлять mov ie только один раз каждые пару кадров:

Movie myMovie;
int frameCounter = 0;
int framerate = 30;
int movieFPS = 3;  // the movie will be updated only 3 times per second
int updateFrame = 1;

void setup() {
  size(200, 200);
  frameRate(framerate);
  updateFrame = framerate / movieFPS;

  myMovie = new Movie(this, "SampleVideo_360x240_30mb.mp4");
  myMovie.loop();
}

void draw() {
  if (frameCounter++ % updateFrame == 0) {
    image(myMovie, 0, 0);
  }
}

// Called every time a new frame is available to read
void movieEvent(Movie m) {
  m.read();
}

Интересно, что звук не будет затронут, так как mov ie все еще читается с той же скоростью, но графически не отображает каждый кадр.

Если вы хотите использовать эффект «веб-камера», вы можете рандомизировать количество кадров вместо регулярного обновления:

Movie myMovie;
int frameCounter = 0;
int framerate = 30;
int minFramesBetweenUpdate = 10;
int maxFramesBetweenUpdate = 45;
int updateFrame = 1;

void setup() {
  size(200, 200);
  frameRate(framerate);

  myMovie = new Movie(this, "SampleVideo_360x240_30mb.mp4");
  myMovie.loop();
}

void draw() {
  if (frameCounter++ > updateFrame) {
    image(myMovie, 0, 0);
    updateFrame = frameCounter + (int)random(minFramesBetweenUpdate, maxFramesBetweenUpdate);
  }
}

// Called every time a new frame is available to read
void movieEvent(Movie m) {
  m.read();
}

Частота кадров технически не меняет скорость, с которой будет отображаться mov ie, а только количество кадров, которые будут видны за определенное время. 10-секундное видео с различными частотами кадров будет воспроизводиться через 10 секунд.

Если вы хотите изменить скорость, с которой отображается mov ie, вам нужно использовать что-то вроде myMovie.speed(0.5);. Скорость, с которой воспроизводится mov ie, изменит время, необходимое для его запуска. Если у вашего mov ie есть звук, то, например, при воспроизведении его со скоростью, превышающей 1.0, этот звук будет «бурундук».

Дайте мне знать, если я могу чем-то помочь. И веселиться!

...