Perl系统调用mplayer,视频之间的转换各不相同
我只接触perl几个星期,我正在尝试运行以下代码:Perl系统调用mplayer,视频之间的转换各不相同,perl,ipc,mplayer,Perl,Ipc,Mplayer,我只接触perl几个星期,我正在尝试运行以下代码: sub runVideo { system('mplayer -fs video1.mpeg2 video2.mpeg2'); return; } runVideo(); system('some other processes in background&'); runVideo(); 基本上,我运行video1和video2两次,第一次只是视频,第二次是在后台运行一些应用程序,不管运行什么应用程序,因为我在全屏模
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的转换不到一秒钟。
问题:
为什么过渡时间不同?是否视频仍在内存中,因此加载时间更短?
要获得相同的过渡时间,还有哪些替代方案或解决方法?答案可能是缓存效果。视频或播放视频所需的编解码器都不在video2的内存中。当然,当你第二次这么做的时候,他们是 根据延迟问题的确切原因,您可以尝试以下几种方法:
- 您可以尝试使用mplayer的
选项(如果您使用的是mplayer 1.x;我相信它默认为2.x)。这将防止振动vo Denit/reinit循环-fixed vo
- 您可以(也可能应该)在
模式下运行mplayer(也可能使用-slave
)。这将给你更多的控制权-idle
- 您可以预缓存任何需要一段时间的数据。在类Unix系统上执行此操作的方法是
带有posix\u fadvise(intfd,off\t offset,off\t len,intadvice)
。或者,在Linux上,posix\u FADV\u的通知将需要
。或者最后,通过文件上的readahead(intfd,off64\u t偏移量,size\u t计数)
,然后是mmap
,通知madvise(void*addr,size\t length,int advice)
。不幸的是,MADV\u将需要
、posix_fadvise
和readahead
都没有被模块导出。因此,您必须找到另一个模块(检查CPAN)或求助于或XS。或者madvise
/open
(效率较低)sysread
- 您可以将视频组合在一起。这将完全消除过渡时间
系统('mplayer-fs video3.mpeg2 video4.mpeg2')
这几乎不是一个perl问题。您没有说明您使用的是什么操作系统,但我假设是一个类似Unix的操作系统,因为(a)这是我所知道的;(b) 这通常是mplayer运行的方式。很抱歉造成混淆,我运行的是Meego 1.2