windows - 在 Perl 脚本中播放声音

标签 windows perl audio portability gnome

我正在尝试向 Perl 脚本添加声音以提醒用户事务正常(用户在工作时可能不会一直看着屏幕)。我希望尽可能保持可移植性,因为脚本可以在 Windows 和 Linux 站上运行。
我可以

use Win32::Sound;
Win32::Sound::Play('SystemDefault',SND_ASYNC);

适用于 Windows。但我不确定如何在 Linux (Gnome) 上调用通用声音。到目前为止,我想出了

system('paplay /usr/share/sounds/gnome/default/alert/sonar.ogg');

但我不确定我是否可以指望这条可用的路径。
所以,三个问题:

  1. 有没有更好的方法在 Gnome 中调用默认声音
  2. 这条路径是否相当普遍(至少在 Debain/Ubuntu 风格中)
  3. paplay播放声音后需要一段时间退出,有没有更好的调用方式?

我宁愿远离系统扬声器发出哔哔声,这听起来很糟糕(这会被播放很多次)而且 Ubuntu 还是将 PC 扬声器列入黑名单。
谢谢!

最佳答案

获取 paplay 路径(假设它在那里)的更便携的方法可能是使用 File::Which .然后你可以得到这样的路径:

use File::Which;
my $paplay_path = which 'paplay';

要异步播放声音,你可以fork一个子进程:

my $pid = fork;
if ( !$pid ) { 
    # in the child process
    system $paplay_path, '/usr/share/sounds/gnome/default/alert/sonar.ogg';
}

# parent proc continues here

还请注意,我使用了 system 的多参数形式;这样做可以避免 shell 并直接运行请求的程序。这避免了危险的错误(并且效率更高。)

关于windows - 在 Perl 脚本中播放声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12826634/

相关文章:

windows - 检查 Windows API 级别的 DLL

multithreading - 如何使用 Perl 并发处理部分任务?

regex - Perl 替换运算符的作用是什么?

iphone - 将 UInt32(音频帧)拆分为两个 SInt16(左右)?

iphone - 在iPhone SDK上播放mp3吗?

windows - 无法在 Windows 7 上安装 "IIS 6 Metabase and IIS 6 Configuration Compatibility"

java - 如何强制 Red Hat OpenJDK 8 在 Windows 上像 AdoptOpenJDK 和 Oracle JDK 一样清晰地呈现字体?

windows - Windows 上的脚本 Trac 安装

没有引用的 Perl 参数修改

iphone - 这段通过 AVAssetWriter 和 AVAssetWriterInputs 编写视频+音频的代码不起作用。为什么?