在处理中播放多个视频

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出现卡顿

potplayer如何实现两个视频同时在一个窗口播放

Html5之高级-4 HTML5视频处理(H5中播放视频编程实现视频播放器)

一次静音播放多个YouTube视频

在视图中使用 AVPlayer 播放多个视频

集RTMPHLSFLV,WebSocket 于一身的网页直播/点播播放器方案EasyPlayer.js视频播放界面快照和拉伸按钮显示多个的处理流程