0

私はperlを始めて数週間しか経っていませんが、以下のコードを実行しようとしています:

sub runVideo {
    system('mplayer -fs video1.mpeg2 video2.mpeg2');
    return;
}

runVideo();
system('some other processes in background&');
runVideo();

基本的に、video1 と video2 を 2 回実行します。1 回目はビデオだけで、2 回目はバックグラウンドで実行されているアプリケーションで、フルスクリーン モードでビデオを実行しているため、実行中のアプリは関係ありません。

問題:

最初の実行では、video1 から video2 への遷移に約 1 ~ 2 秒かかります。2 回目の実行では、video1 から video2 への移行に 1 秒もかかりません。

質問:

遷移時間が異なるのはなぜですか? ビデオがまだメモリに残っているので、ロードに時間がかからなかったのでしょうか?

同じ移行時間を得るために、他にどのような代替手段または回避策がありますか?

4

1 に答える 1

0

答えはキャッシュ効果にありそうです。ビデオ、またはそれを再生するために必要なコーデックのいずれかが、video2 のメモリにありませんでした。しかし、もちろん、2回目はそうです。

遅延が問題である正確な理由に応じて、いくつかのことを試すことができます。

  • mplayerのオプションを試すことができ-fixed-voます (mplayer 1.x を使用している場合、2.x のデフォルトだと思います)。これにより、耳障りな vo deinit/reinit サイクルが回避されます。
  • -slaveモードで mplayer を実行できます (また、おそらく実行する必要があります-idle)。これにより、より詳細に制御できます。
  • 時間がかかるデータは何でも事前にキャッシュできます。Unix ライクなシステムでこれを行う方法はposix_fadvise(int fd, off_t offset, off_t len, int advice)POSIX_FADV_WILLNEED. または、Linux では、readahead(int fd, off64_t offset, size_t count). または最後にmmap、ファイルに記載され、その後madvise(void *addr, size_t length, int advice)にのアドバイスが続きますMADV_WILLNEED。残念ながら、、、posix_fadviseおよびreadaheadPOSIX モジュールによってエクスポートされるものはありませmadvise。したがって、別のモジュールを見つけるか (CPAN をチェックしてください)、Inlineまたは XS に頼る必要があります。または/ (効率が悪い)。opensysread
  • 動画を組み合わせることができます。これにより、移行時間が完全になくなります。
于 2012-01-15T05:39:04.597 に答える