1

私はラズベリーパイからテレビを作ろうとしています.javascriptで、同じプレイリストを何度も再生するタイプです。ファイルの再生は問題ではありませんが、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 が複数回呼び出されます。あなたが持っているコードは、トラックの期間中に実行されて終了する何かを実行者が呼び出す場合に最適に機能します。これにより、各トラックが完了するたびに次のトラックを再生するように正しく設定されます。

何らかの理由でトラックが完了するまでプロセスを実行し続けることができない場合は、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 に答える