Perl系统调用mplayer,视频之间的过渡不同
Posted
技术标签:
【中文标题】Perl系统调用mplayer,视频之间的过渡不同【英文标题】:Perl system call mplayer, transition between videos varies 【发布时间】:2012-01-14 14:43:53 【问题描述】:我才刚开始使用 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 的转换用时不到一秒。
问题:
为什么过渡时间不同?难道是视频还在内存中,所以加载时间较短?
还有哪些其他替代方案或变通方法可以获得相同的过渡时间?
【问题讨论】:
刷新缓存?man mplayer
或者尝试使用文件的副本 system('mplayer -fs video3.mpeg2 video4.mpeg2')
虽然这几乎不是 perl 问题。
您没有说明您使用的是什么操作系统,但我假设是一个类似 Unix 的操作系统,因为(a)这就是我所知道的; (b) 这通常是 mplayer 运行的地方。
对不起,我在 Meego 1.2 上运行
【参考方案1】:
答案可能在于缓存效果。视频或播放视频所需的编解码器不在 video2 的内存中。但当然,第二次你这样做了。
您可以尝试以下几种方法,具体取决于延迟问题的确切原因:
您可以尝试 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
、readahead
和 madvise
都没有被 POSIX 模块导出。所以你必须找到另一个模块(检查 CPAN)或求助于Inline 或 XS。或open
/sysread
(效率较低)。
您可以将视频组合在一起。这应该会完全消除过渡时间。
【讨论】:
以上是关于Perl系统调用mplayer,视频之间的过渡不同的主要内容,如果未能解决你的问题,请参考以下文章
linux下最好用的视频播放器,mplayer,smplayer怎么安装 播放黑屏
如何无延迟地流式传输实时视频(ffplay、mplayer)以及 ffplay 可以使用哪种包装器?