1

我正在尝试用 javascript 用覆盆子 pi 制作电视,这种类型会一遍又一遍地播放相同的播放列表。播放文件不是问题,但我被困在 javascript 的异步部分这里代码困扰我:

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]);
});

当我确定其中有路径名时,另一个函数使用 Playlist[0] 调用它。

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

我试过循环调用播放,但我只是成功地同时播放了整个播放列表。

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

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

EDIT2:我忘了告诉 play.sh 如果没有其他实例就启动播放器,它只是以前版本的保留,我不知道 execFile 的回调

4

1 回答 1

1

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

话虽如此,一旦子进程终止,就会调用 exec 回调。由于 play.sh 只是启动播放器,听起来它会在文件播放完成之前终止,这意味着在第一首曲目完成之前将多次调用 play。如果您是 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 只会在文件播放完毕后递增,然后它可以开始下一首曲目。

于 2013-07-25T01:55:52.340 回答