在处理中播放多个视频
Posted
技术标签:
【中文标题】在处理中播放多个视频【英文标题】:Playing multiple videos in processing 【发布时间】:2015-08-05 12:26:52 【问题描述】:我正在处理并希望自动一个接一个地播放多个视频。下面是我当前的代码,但是当第一个视频完成播放时,下一个视频不会自动开始。希望你能帮忙。
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();
【问题讨论】:
您是否尝试过添加打印语句来确定程序的执行何时与您的预期不同?它是否在您期望的时候输入每个 if 语句?当您在同一部电影中多次拨打play()
时会发生什么?
您好 经过一些测试后,问题似乎出在:if(myMovie1.time()>=myMovie1.duration())。 to 函数比较当前视频时间(以秒为单位)和影片的持续时间。我认为视频持续时间的小数秒数与特定的视频秒数不匹配。因为如果我删除持续时间函数并将小数点后一位秒为 5.0,则该函数和一切正常。
【参考方案1】:
你是关于时间的问题。 time() 函数似乎有点错误,它似乎永远不会达到 duration() 值。现在一个快速的解决方法是在控制台中打印 time() 和 duration() 并使用 duration() 和 last time() 值之间的差异来锻炼使电影播放完成条件通过的偏移量。
我想从代码开始。开始也可以,它可以更短,更容易管理。 目前你的代码中有很多重复(见D.R.Y.), 但这可以通过 for 循环和数组来避免。
for 循环
这些并不像听起来那么可怕。
循环让您可以轻松地重复一个动作,无论它是什么。 语法看起来有点复杂,但并不是一旦你意识到只有 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);
好的,这就是 for 循环。还不错,而且它们会很有趣,尤其是当你开始的时候 绘图模式/网格/等。在屏幕上。
数组
数组是一种结构,可让您以相同的名称存储多个值的跟踪记录。 例如,如果您使用一个简单的整数变量存储一个整数值, 使用整数数组,您可以将一堆整数值分组到同一个名称下。
声明数组的语法与通常用于声明变量的语法相似
(毕竟它只是一种不同类型的变量)。有几点不同:
- 你需要在数组类型之后使用[]
- 您需要使用new
键盘并指定数组/列表的大小
所以如果你像这样声明一个整数:
int i = 0;
你可以像这样声明一个整数数组(比如说 10):
int[] tenInts = new int[10];
[] 符号的作用是它不仅用于告诉 java 它正在处理一个数组,
但它允许您检索和设置数组中的元素。
这是使用索引完成的,数组从 0 开始索引元素。
因此,要访问数组中的第一个元素,您将使用 tenInts[0]
这是因为我们现在有一个零数组。
假设您要将第三个元素设置为 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");
【讨论】:
以上是关于在处理中播放多个视频的主要内容,如果未能解决你的问题,请参考以下文章
WPF Storyboard播放多个DoubleAnimation出现卡顿
Html5之高级-4 HTML5视频处理(H5中播放视频编程实现视频播放器)
集RTMPHLSFLV,WebSocket 于一身的网页直播/点播播放器方案EasyPlayer.js视频播放界面快照和拉伸按钮显示多个的处理流程