从 shell 同时播放多个音频文件的强大方法?

问题描述 投票:0回答:3

我正在尝试通过多个并发 shell 脚本在 Mac (OS X 10.10.5) 上播放音频文件。每个脚本都在单独的终端会话中运行,并定期调用

sox
(v. 14.4.2) 的实例来播放音频文件。例如,一个脚本可能会执行以下操作:

sox foo.aif -t coreaudio

而另一个脚本执行此操作:

sox bar.aif -t coreaudio

第二个文件播放正常,但只有在回显错误消息后才可以播放

sox[8139:17123955] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x46407, name = 'sox'
See /usr/include/servers/bootstrap_defs.h for the error codes.

(/usr/include/servers/bootstrap_defs.h 不太有帮助:它表示错误代码 1100 被定义为

BOOTSTRAP_NOT_PRIVILEGED
。)

只要另一个实例仍在播放,每次后续调用

sox
都会引发相同的错误。我尝试运行最多 4 个并发实例并获得相同的结果。

尽管

sox
似乎可以正常播放文件,但此错误消息让我感到紧张,因为我的应用程序需要坚如磐石的稳定性(它将同时播放最多 4 个文件,24/7/365)。另外,我不喜欢在我的终端会话(或者在重定向 stderr 后,我的日志文件)中添加无用的错误消息。

问题:

  1. 我可以安全地忽略此错误,因为声音文件似乎可以正常播放吗?

  2. 此错误是否可能与我在使用其他“下游”音频应用程序时遇到的问题有关? (例如,当我将音频从这些

    sox
    实例发送到 BUTT(使用此工具进行广播) 的实例时,BUTT 会停止流式传输,并且表现得就像与音频源失去了连接一样。)。

  3. 是否有任何替代方案可以在并发会话中从命令行播放音频文件而不引发此错误?

    
    

bash macos concurrency core-audio sox
3个回答
3
投票

sox

    


1
投票
afplay path/to/file

sox
,不会出现错误。

至于我原来问题的第(3)部分...

afplay

确实是

afplay
的一个方便快捷的替代品,用于从命令行预览音频文件(谢谢,@Dave!)。然而,我的情况是多通道(>8 个通道)——
sox
无法做到,但
afplay
可以轻松做到。但由于我在问题中没有提到多渠道方面,我认为这个问题已经得到解答。谢谢!
    


0
投票

您可以混合仅运行一个 sox 实例的两个(或更多)音频文件,只需使用 -m 选项即可:

sox

文件必须具有相同的采样率,这里的
$ sox -m file1 file2 -t alsa

表示我们要直接在默认的ALSA声卡上播放。当然,您可以使用任何可以作为 SoX 输出文件的东西。无论如何,这是非常微不足道的,你可能知道这一点,但这不是我的重点。

如果您想同时运行两个(或更多)SoX 实例,则需要使用 -q 选项。我认为这对每个人来说都不是显而易见的(对我来说),因此这个答案。

考虑一下:

-t alsa

不会播放这两个文件。这两个任务将启动(在后台),但它们将保持“已停止”状态。然后您可以运行一个(使用 fg 命令),然后运行另一个。但他们不会一起玩。

你能做的是:这个:

sox file1 -t alsa & sox file2 -t alsa &

两个文件将同时开始播放。

这是“简单”,因为如果没有

sox -q file1 -t alsa & sox -q file2 -t alsa &

选项,sox 需要写入终端,但只有一个终端。如果两个进程都写入同一个终端,则输出将被扰乱,因此两个进程都会停止,直到用户将一个进程附加到终端(这是

-q
命令的结果)。
    

© www.soinside.com 2019 - 2024. All rights reserved.