我正在处理,并希望自动一个接一个地播放多个视频。以下是我当前的代码,但是当第一个视频完成播放时,下一个视频不会自动开始。希望你能帮忙。
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();
}
答案 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");
}
}