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_fadvisereadaheadmadvise 都没有被 POSIX 模块导出。所以你必须找到另一个模块(检查 CPAN)或求助于Inline 或 XS。或open/sysread(效率较低)。 您可以将视频组合在一起。这应该会完全消除过渡时间。

【讨论】:

以上是关于Perl系统调用mplayer,视频之间的过渡不同的主要内容,如果未能解决你的问题,请参考以下文章

linux下最好用的视频播放器,mplayer,smplayer怎么安装 播放黑屏

如何无延迟地流式传输实时视频(ffplay、mplayer)以及 ffplay 可以使用哪种包装器?

用MPlayer怎么转换视频格式

使用 AVQueuePlayer 时如何在视频之间添加过渡?

使用命令行选项在 mplayer 中播放视频的特定间隔

在 Python 环境中管理 Perl 习惯