使用Node.JS播放音频

44

我目前正在使用child_process和命令行mplayer在本地机器上播放音频,用于我的Node.JS应用程序。这样做可以实现播放,但不是最好的解决方案。我最大的问题是,从启动mplayer到音频开始播放需要500毫秒。

有更好的播放音频的方法吗?最好是压缩后的音频,但我会尽力而为。


@lanzz 是的,我以为我已经做了,可能需要重新检查一下。 - Markus Hedlund
这个有什么应用场景呢?你是否需要在互联网上实现真正的低延迟音频传输? - Brad
嘿@Znarkus,你找到什么了吗?我也在同一条船上,大多数现有的模块使用子进程...这意味着延迟,或者它们不支持停止/暂停音频。我正在尝试通过在nodejs中制作midi声音板来犯下亵渎之罪。 - Tiago
9个回答

41
我建议使用node-speaker,它会将原始PCM数据输出到您的扬声器(基本上它会播放音频)。
如果您要播放像mp3文件之类的东西,则可能需要先解码为PCM数据,这正是node-lame所做的。
希望对您有所帮助。

4
你有没有找到任何不需要使用Python的东西? - John

17

介绍一下,audic。它不使用任何本地依赖项,因此不会像上面的答案那样出现错误。

请注意:

import Audic from 'audic';

const audic = new Audic('audio.mp3');

await audic.play();

audic.addEventListener('ended', () => {
    audic.destroy();
});

更简单地说:

import {playAudioFile} from 'audic';

await playAudioFile('audio.mp3');

1
这是唯一一个在不同平台上都能运行的。缺点是:没有回调可以告诉我音频何时播放完毕(就我所知)。优点是:可以使用高质量的.m4a文件,并且让我在播放之前加载所有内容。 - Jeff Hykin
1
@JeffHykin 由于Audic允许暂停,因此在其完成时使用回调不起作用。然而,就像Web Audio API一样,您可以在setTimeout中使用audio.duration. - Richie Bendall
它在Linux上真的能工作吗?就我所尝试的而言,在Ubuntu 18.04 LTS上并不能工作。 - liaguridio
2
@liaguridio Audic依赖于VLC才能正常工作。因为有许多Linux发行版,所以它只会自动下载到Windows和macOS上。 - Richie Bendall
1
@AndrewLeonardi https://www.richie-bendall.ml/audic/classes/audic.html - Richie Bendall
显示剩余4条评论

14

我找到的最简单方法(在Mac OS上)是使用

exec('afplay whatever.mp3', audioEndCallback)

2
在 OS X 上也有 open 命令。 - Aleksei Zabrodskii
3
不要忘记 const { exec } = require('child_process'); - mixdev

9

我认为你想问的是在Node.js生态系统中是否有与音频相关的良好模块?

每当你有这种问题时,应该首先访问npmjs并输入适当的关键字。

下面是我在npmjs网站上找到的与音频相关的模块列表。

substack的baudio对我来说看起来不错。


我没有表达清楚我想播放音频文件。对此我感到抱歉。感谢提供的链接,komponist / mpd 实际上是我可以使用的东西。但是,为了这个项目保持简单,我将尝试使用 mplayer -slave - Markus Hedlund
3
baudio 绝对不是你想要用来播放音频文件的工具。 - BonsaiOak

9

查看 sound-play,它是一个简单的解决方案,在Windows和MacOS上不需要使用外部播放器:

const sound = require('sound-play')
sound.play('music.mp3')

免责声明:本文作者为该软件包的作者。


你能分享关于声音播放的文档吗?如何暂停/播放,增加/减少音量或停止播放? - trungkmy

8
您可以使用play-sound模块:
使用npm安装,运行以下命令:
npm install play-sound --save

现在在你的代码中使用:
var player = require('play-sound')(opts = {})

 player.play('./music/somebody20.flac', function (err) {
   if (err) throw err;
   console.log("Audio finished");
 });

2
那个模块只是执行一个命令(例如mplayer),就像OP已经在做的一样。 - zoran404
@zoran404 如果mplayer没有预安装,它将退回到其他播放器,这些播放器不支持其他音频格式,例如mp3。我想知道是否有更多平台无关的库,至少支持普遍格式。 - polendina

6
请查看node-groove - Node.js与libgroove绑定的库:

该库提供了播放列表上音频的解码和编码。它旨在用作音乐播放器应用程序的后端,但足够通用以用作任何音频处理实用程序的后端。

声明:我编写了这个库,它是免费、开源的,并且与任何产品、服务或公司都没有关联。


3
谢谢你的建议。我非常喜欢libgroove。但是,你可能需要提到你是它的作者。 - BonsaiOak
3
为什么这很重要?答案的质量不受模块作者的影响。 - andrewrk
1
我相信@BonsaiOak是正确的。帮助中心说:“发布好的、相关的答案,如果其中一些(但不是全部)与您的产品或网站有关,那么这是可以的。然而,在您的答案中,您必须披露您的从属关系。” - TachyonVortex
@TachyonVortex 好的,已更新。 - andrewrk

0
你可以使用播放声音模块和路径来实现这个功能。
npm install play-sound

import path from 'path'; 
const __dirname = path.resolve();
import sound from 'sound-play';

const filePath = path.join(__dirname, "file.mp3");
sound.play(filePath);

你能分享一下关于play-sound的文档吗?如何暂停/播放,增加/减少音量或停止播放? - trungkmy
@trungkmy 这是文档链接 https://www.npmjs.com/package/play-sound - TheLastCodeBender

-1
这对我有用
import * as path from 'path';
import * as sound from 'sound-play';

sound.play(path.join(path.resolve(), "notify.mp3"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接