2013-07-24 52 views
1

我试图从树莓派制作电视,在javascript中,一次又一次播放同一播放列表的类型。 播放文件AREN TA的问题,但我米停留在JavaScript的 下面的代码至极的异步部分打扰我:在这种情况下递归是否好? (javascript/node.js)

function play (file) 
{ 
    exec('home/pi/play.sh', [file], function (error, stdout, stderr){ 
     if (PIndice != Playlist.length-1){ 
      PIndice=PIndice+1; 
     }else{ 
      PIndice=0; 
     } 
     play(Playlist[PIndice]); 
}); 

另一个功能与播放列表叫它[0]当我米肯定有SA路径它。

我的问题是: 安全吗? 不是递归最终会杀死CPU? 我虽然关于使用setTimeOut,但我没有找到任何方式来获得视频的持续时间。

我试过在循环中调用播放,但我只是在同一时间播放整个播放列表。

我不要求一个全功能的解决方案,只是暗示我在哪里可以找到正确的方法 有没有一种方法可以在再次调用之前等待播放结束,即使JavaScript是异步的?

编辑: 所有文件都在MPEG4,播放列表只是一个字符串数组,其中包含要播放的视频文件的路径名。它应该没有互联网播放,所以没有浏览器,我不能使用HTML请求让视频的元数据得到它的持续时间。

EDIT2:我忘了告诉大家,play.sh刚刚启动播放器,如果有S的它没有其他的情况下,它只是一个保持以前的版本在那里我不知道有关的execfile

+0

稍微详细一点会有帮助。你在玩什么类型的文件?这是在浏览器中?你指的是什么类型的播放列表? –

+0

播放列表只是一个字符串数组,所有播放文件的路径名都是MPEG4。我不使用任何浏览器,所有文件都已经在RPi上 – DrakaSAN

回答

1

回调这实际上不是递归调用,不会导致堆栈深度问题。请注意,play方法在回调中调用,而不是在play方法本身内调用。

这就是说,一旦子进程终止,就会调用exec回调。由于play.sh只是启动播放器,因此听起来它会在文件完成播放之前终止,这意味着播放将在第一个轨道完成之前被多次调用。如果你的exec会调用一些运行在该轨道期间的代码,然后终止,那么你所拥有的代码将会最好。这应该正确地设置你在每个完成之后播放下一首曲目。

如果由于某种原因,您不能让该过程继续运行直到曲目完成,您将不得不设计play.sh文件以便能够多次调用并返回当前曲目的状态。例如:

function play (file) 
{ 
    exec('home/pi/play.sh', [file], function (error, stdout, stderr){ 
     if(stdout == 'done') { 
      if (PIndice != Playlist.length-1){ 
       PIndice=PIndice+1; 
      } else { 
       PIndice = 0; 
      } 
     } 

     play(Playlist[PIndice]); 
    }); 
}; 

这样,只有在文件完成播放后才会增加PIndice,然后才能开始下一个音轨。

+0

清晰,准确和简洁的答案,非常感谢您。我在play.sh中有一个标准输出,但是我没有想到像这样使用它,因为在我所有的测试中我都没有看到两个文件一起玩,但是我们从来不会太小心吗? – DrakaSAN