在处理中播放多个视频

时间:2015-08-05 12:26:52

标签: video processing

我正在处理,并希望自动一个接一个地播放多个视频。以下是我当前的代码,但是当第一个视频完成播放时,下一个视频不会自动开始。希望你能帮忙。

import processing.video.*;
Movie myMovie1, myMovie2, myMovie3, myMovie4, myMovie5, myMovie6;
boolean playMovie1=true;
boolean playMovie2=false;
boolean playMovie3=false;
boolean playMovie4=false;
boolean playMovie5=false;
boolean playMovie6=false;

void setup(){
size(800,500);
myMovie1 = new Movie(this, "ch1.mp4");
myMovie2 = new Movie(this, "ch2.mp4");
myMovie3 = new Movie(this, "ch3.mp4");
myMovie4 = new Movie(this, "ch4.mp4");
myMovie5 = new Movie(this, "ch5.mp4");
myMovie6 = new Movie(this, "ch6.mp4");


}

void draw(){
background(0);
if(playMovie1==true){

myMovie1.play();
image(myMovie1,0,0);
if(myMovie1.time()>=myMovie1.duration()){
myMovie1.stop();
playMovie1=false;
playMovie2=true;
}
}

if(playMovie2==true){

myMovie2.play();
image(myMovie2,0,0);
if(myMovie2.time()>=myMovie2.duration()){
myMovie2.stop();
playMovie2=false;
playMovie3=true;
}
}

if(playMovie3==true){

myMovie3.play();
image(myMovie3,0,0);
if(myMovie3.time()>=myMovie3.duration()){
myMovie3.stop();
playMovie3=false;
playMovie4=true;
}
}

if(playMovie4==true){

myMovie4.play();
image(myMovie4,0,0);
if(myMovie4.time()>=myMovie4.duration()){
myMovie4.stop();
playMovie4=false;
playMovie5=true;
}
}

if(playMovie5==true){

myMovie5.play();
image(myMovie5,0,0);
if(myMovie5.time()>=myMovie5.duration()){
myMovie5.stop();
playMovie5=false;
playMovie6=true;
}
}


if(playMovie6==true){
myMovie6.play();
image(myMovie6,0,0);

if(myMovie6.time()>=myMovie6.duration()){
myMovie6.stop();
playMovie6=false;
}  
}
}

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

1 个答案:

答案 0 :(得分:0)

随着时间的推移你的问题。 time()函数似乎有点错误,它似乎永远不会达到duration()值。现在,快速解决方法是在控制台中打印time()和duration(),并使用duration()和last time()之间的差值来计算将使电影播放完成条件通过的偏移量。

我想从代码开始。它也可以开始,它可以更短,更容易管理。 目前,您的代码中有很多重复(请参阅D.R.Y.), 但是使用for循环和数组可以避免这种情况。

for loops

这些声音听起来并不可怕。

循环允许您轻松地重复动作,无论它是什么。 语法看起来有点复杂,但一旦你意识到只有3个部分就没有了。 想象一下,在一定数量的步骤中从位置A到达位置B. 第一个位置A是初始化for循环的值:告诉计算机从哪里开始countint。 然后你传递位置B,你想要停止循环的值。 3d和最后一个成分是增量:你将从A移动到B的步数。

语法看起来有点像这样:

for (start ; stop; steps){
  //do something here
}

例如,让我们从0到9计数:

for(var start = 0; start < 10; start = start + 1){
  println(start);
}

通常的做法是为你的for循环计数器变量i命名,但这只是一个约定。 只要您保持一致,请随意将其命名为对您更有意义:

for(int i = 0 ; i < 10 ; i++){

  println(i);

}

好的,这就是循环。不是太糟糕,而且它们可以很有趣,特别是当你开始时 绘图图案/网格/等。在屏幕上。

<强>阵列

数组是一种结构,允许您以相同的名称存储多个值的跟踪。 例如,如果使用简单的整数变量存储单个整数值, 使用整数数组,您可以使用相同的名称对一堆整数值进行分组。

声明数组的语法类似于通常用于声明变量的语法 (毕竟它只是一种不同类型的变量)。有一些差异:   - 您需要在数组类型后使用[]   - 您需要使用new键盘并指定阵列/列表的大小

所以如果你声明一个这样的整数:

 int i = 0;

你会声明一个整数数组(让我们说10)如下:

 int[] tenInts = new int[10];

带有[]符号的东西是它不常用于告诉java它处理数组, 但它允许您检索和设置数组中的元素。 这是使用索引和数组从0开始索引元素来完成的。 因此,要访问数组中的第一个元素,您将使用tenInts[0] 这将是因为我们目前有一个零数组。 我们假设您要将第3个元素设置为1.这将是索引2,因此您可以使用它来访问数组元素并设置它的值:

println("3rd element: " + tenInts[2]);//will print 0
tenInts[2] = 1;
println("3rd element: " + tenInts[2]);//will print 1

现在你已经掌握了所有的成分,而不需要重复太多的代码:

import processing.video.*;

int numMovies = 6;//total number of movies
Movie[] playlist = new Movie[numMovies];//a list of all the movie objects, currently not initialized
int currentMovieIndex = 0;//index of the movie currently playing

float movieEndDuration = 0.029719;//a 'magic number' helpful to find out when a movie finishes playing

void setup(){
  size(800,500);
  for(int i = 0 ; i < numMovies; i++){
    //initialize each movie object in the list
    playlist[i] = new Movie(this,"transit.mov");//new Movie(this, "ch"+(i+1)+".mp4");
  }
  //start playback
  playlist[currentMovieIndex].play();
}

void draw(){
  background(0);
  image(playlist[currentMovieIndex],0,0);
}

void movieEvent(Movie m){
  m.read();
  //handy for debugging and figuring out the 'magic number'
  println(m.time() + " / " + m.duration() + " / " + (m.time() + movieEndDuration));
  //hacky check movie end 
  if((m.time() + movieEndDuration) >= m.duration()){
      println("movie at index " + currentMovieIndex + " finished playback");
      //go to the next movie index
      currentMovieIndex = (currentMovieIndex+1) % numMovies;//increment by one buy use % to loop back to index 0 when the end of the movie array is reached
      //use this to tell the next movie in the list to play
      playlist[currentMovieIndex].play();
      println("movie at index " + currentMovieIndex + " started");
  }
}