0

我只使用 perl 几周,我正在尝试运行以下代码:

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

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

基本上我运行 video1 和 video2 两次,第一次只是视频,第二次在后台运行一些应用程序,不管运行什么应用程序,因为我以全屏模式运行视频。

问题:

第一次运行时,从 video1 到 video2 的转换大约需要 1-2 秒。在第二次运行时,从 video1 到 video2 的转换需要不到一秒的时间。

问题:

为什么过渡时间不同?可能是视频仍在内存中,因此加载时间较短?

还有哪些其他替代方案或解决方法可以获得相同的过渡时间?

4

1 回答 1

0

答案可能在于缓存效果。视频或播放视频所需的编解码器不在 video2 的内存中。但当然,你第二次这样做时,他们是。

您可以尝试几件事 - 取决于延迟问题的确切原因:

  • 您可以尝试-fixed-vo使用 mplayer 选项(如果您使用的是 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文件上的 a ,然后madvise(void *addr, size_t length, int advice)MADV_WILLNEED. 不幸的是,POSIX模块没有导出posix_fadvisereadahead和。因此,您必须找到另一个模块(检查 CPAN)或求助于Inline或 XS。或/ (效率较低)。madviseopensysread
  • 您可以将视频组合在一起。那应该完全消除过渡时间。
于 2012-01-15T05:39:04.597 回答